Forum Discussion

Don-Bot's avatar
Don-Bot
Icon for Helper V rankHelper V
2 years ago
Solved

Create a new Power BI Report using C# in XMLA Endpoint

I've worked through the Learning TOM code and have successfully created a dataset in Powe BI Service with it.  I can go into it manually and create my own reports from scratch.

 

However, is there a way I can create a power bi report using C# and XMLA Endpoint?  My end goal is to publish the dataset I can now create with it's own blank report that users can just edit and adjust on their own in embeded.

 

Here are links I've gone through but I haven't found anything yet.

 

https://github.com/PowerBiDevCamp/Tabular-Object-Model-Tutorial/blob/main/Solution/Exercise04/PBI-Tool/Program.cs

https://www.sqlservercentral.com/blogs/power-bi-meets-programmability-tom-xmla-and-c

https://www.powerbidevcamp.net/articles/programming-datasets-with-TOM/

  • Don-Bot's avatar
    Don-Bot
    2 years ago

    Thank you for the reply lbendlin I was actually able to accomplish this utilizing REST API scripts.  Although now I am working on how to create an access token programmatically.  

     

    using System;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    
    
    namespace Learning_TOM
    {
        internal class ReportClone
        {
            static readonly HttpClient client = new HttpClient();
    
            public static async Task callReportCloneRestAPI()
    
            {
                
                try
                {
                    var reportName = "REPORT_NAME";
                    var reportID = "REPORT_ID";
                    var targetModelID = "MODEL_ID";
                    var targetWorkspaceID = "WORKSPACE_ID";
                    var bearer = "TOKEN";
    
                    var url = $"https://api.powerbi.com/v1.0/myorg/reports/{reportID}/Clone";
                    var data = "{\r\n  \"name\": \"" + reportName + "\",\r\n  \"targetModelId\": \"" + targetModelID + "\",\r\n  \"targetWorkspaceId\": \"" + targetWorkspaceID + "\"\r\n}";
                   
    
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + bearer);
    
                    var content = new StringContent(data, Encoding.UTF8, "application/json");
    
                    HttpResponseMessage response = await client.PostAsync(url, content);
    
                    response.EnsureSuccessStatusCode();
    
                    string responseBody = await response.Content.ReadAsStringAsync();
    
                    Console.WriteLine(responseBody);
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Error copying reports: " + ex.Message);
                    Console.ResetColor();
                }
            }
    
        
        }
    }

3 Replies

    • Don-Bot's avatar
      Don-Bot
      Icon for Helper V rankHelper V

      Thank you for the reply lbendlin I was actually able to accomplish this utilizing REST API scripts.  Although now I am working on how to create an access token programmatically.  

       

      using System;
      using System.Net.Http;
      using System.Text;
      using System.Threading.Tasks;
      
      
      namespace Learning_TOM
      {
          internal class ReportClone
          {
              static readonly HttpClient client = new HttpClient();
      
              public static async Task callReportCloneRestAPI()
      
              {
                  
                  try
                  {
                      var reportName = "REPORT_NAME";
                      var reportID = "REPORT_ID";
                      var targetModelID = "MODEL_ID";
                      var targetWorkspaceID = "WORKSPACE_ID";
                      var bearer = "TOKEN";
      
                      var url = $"https://api.powerbi.com/v1.0/myorg/reports/{reportID}/Clone";
                      var data = "{\r\n  \"name\": \"" + reportName + "\",\r\n  \"targetModelId\": \"" + targetModelID + "\",\r\n  \"targetWorkspaceId\": \"" + targetWorkspaceID + "\"\r\n}";
                     
      
                      client.DefaultRequestHeaders.Add("Authorization", "Bearer " + bearer);
      
                      var content = new StringContent(data, Encoding.UTF8, "application/json");
      
                      HttpResponseMessage response = await client.PostAsync(url, content);
      
                      response.EnsureSuccessStatusCode();
      
                      string responseBody = await response.Content.ReadAsStringAsync();
      
                      Console.WriteLine(responseBody);
                  }
                  catch (Exception ex)
                  {
                      Console.ForegroundColor = ConsoleColor.Red;
                      Console.WriteLine("Error copying reports: " + ex.Message);
                      Console.ResetColor();
                  }
              }
      
          
          }
      }
      • lbendlin's avatar
        lbendlin
        Icon for Super User rankSuper User

        I thought your request was for creating a report from scratch, rather than cloning a report.