Disclaimer: I'm very new to Power BI and PowerShell!
I have been trying to import a report .pbix file to a workspace, by following the very detailed tutorial given here by Sirui Sun. To do so, I've been attempting to understand the following piece of code. The .pbix file has to be encoded as form data, as explained in the reference for the create import API.
try { "== Importing $report_name to target workspace" $uri = "https://api.powerbi.com/v1.0/$target_group_path/imports/?datasetDisplayName=$report_name.pbix&nameConflict=Abort" # Here we switch to HttpClient class to help POST the form data for importing PBIX $httpClient = New-Object System.Net.Http.Httpclient $httpClientHandler $httpClient.DefaultRequestHeaders.Authorization = New-Object System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", $token.AccessToken); $packageFileStream = New-Object System.IO.FileStream @($temp_path, [System.IO.FileMode]:pen) $contentDispositionHeaderValue = New-Object System.Net.Http.Headers.ContentDispositionHeaderValue "form-data" $contentDispositionHeaderValue.Name = "file0" $contentDispositionHeaderValue.FileName = $file_name $streamContent = New-Object System.Net.Http.StreamContent $packageFileStream $streamContent.Headers.ContentDisposition = $contentDispositionHeaderValue $content = New-Object System.Net.Http.MultipartFormDataContent $content.Add($streamContent) $response = $httpClient.PostAsync($Uri, $content).Result if (!$response.IsSuccessStatusCode) { $responseBody = $response.Content.ReadAsStringAsync().Result "= This report cannot be imported to target workspace. Skipping..." $errorMessage = "Status code {0}. Reason {1}. Server reported the following message: {2}." -f $response.StatusCode, $response.ReasonPhrase, $responseBody throw [System.Net.Http.HttpRequestException] $errorMessage } # save the import IDs $import_job_id = (ConvertFrom-JSON($response.Content.ReadAsStringAsync().Result)).id # wait for import to complete $upload_in_progress = $true while($upload_in_progress) { $uri = "https://api.powerbi.com/v1.0/$target_group_path/imports/$import_job_id" $response = Invoke-RestMethod -Uri $uri –Headers $auth_header –Method GET if ($response.importState -eq "Succeeded") { "Publish succeeded!" # update the report and dataset mappings $report_id_mapping[$report_id] = $response.reports[0].id $dataset_id_mapping[$dataset_id] = $response.datasets[0].id break } if ($response.importState -ne "Publishing") { "Error: publishing failed, skipping this. More details: " $response break } Write-Host -NoNewLine "." Start-Sleep -s 5 } } catch [Exception] { Write-Host $_.Exception Write-Host "== Error: failed to import PBIX" Write-Host "= HTTP Status Code:" $_.Exception.Response.StatusCode.value__ Write-Host "= HTTP Status Description:" $_.Exception.Response.StatusDescription continue }
However, my pbix file is not bound to a dataset (I have multiple reports bound to one dataset as described here), and I constantly get a 400 Bad Request error, along with the error "PowerBIModelNotFoundException". As the dataset is already available in the workspace, I'm looking for a means to bind the report to the data set during the import. Is that possible?
Thank you in advance!