Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

The ultimate Microsoft Fabric, Power BI, Azure AI & SQL learning event! Join us in Las Vegas from March 26-28, 2024. Use code MSCUST for a $100 discount. Register Now

Reply
maceyak
Regular Visitor

Modifying the Layout file that is embedded in a pbix file

I know how to disassemble a pbix file by changing the extension to .zip and then oening it.  If I then change the extension back to .pbix I can then open it in Power BI.  However, I would like to modify the Layout file that is exposed when you disassemble the pbix.  But when I do that and change the extension of the .zip to .pbix, I get a corrupted file message when I try to open in Power BI.  This happens no matter how small and inocuous the change is.  

 

Is there any way to do this without getting the corrupted file message?

1 ACCEPTED SOLUTION
Anonymous
Not applicable

I was struggling with this issue recently, and my solution is the following:

 

- Change the extension from ".pbix" to ".zip"

- Do not unzip the ".zip" file during this process

- Extract the "Layout" file from the "Report" folder in the ".zip" file

- Open the "Layout" file with Notepad++. (VERY IMPORTANT)

- Make your modifications in the Layout file

- Substitute the old "Layout" file with the new one

- Delete "SecurityBindings" file in the ".zip" file

- In the [Contents_type].xml delete the following text: 

"<Override PartName="/SecurityBindings" ContentType="" />"

- Change the extension from ".zip to ".pbix"

- The file will open without breaks

 

Hope it helps!

View solution in original post

32 REPLIES 32
anujagupta
New Member

hello all,

 

i am trying to modify the layout file content using powershell script . When i m trying to user Set content with -Encoding "unicode" . After that pbix not able to open and display error corrpupted. Also in notpad ++ is shows "UTF-16 LE BOM encoding. But origial Layout ending was "utf-16 Little Endian. 

 


Set-Content -Path "C:\PowerShell\newre\newRe\Report\Test" -Value $final -Encoding unicode

 

can somebody help me out to solve it.

Anonymous
Not applicable

I created an Idea to address this question, please vote:

Renaming dataset measures can't break client reports (change reference from name to ID)

https://ideas.powerbi.com/ideas/idea/?ideaid=649ec802-682b-ec11-b76a-281878e608e9

Anonymous
Not applicable

I was struggling with this issue recently, and my solution is the following:

 

- Change the extension from ".pbix" to ".zip"

- Do not unzip the ".zip" file during this process

- Extract the "Layout" file from the "Report" folder in the ".zip" file

- Open the "Layout" file with Notepad++. (VERY IMPORTANT)

- Make your modifications in the Layout file

- Substitute the old "Layout" file with the new one

- Delete "SecurityBindings" file in the ".zip" file

- In the [Contents_type].xml delete the following text: 

"<Override PartName="/SecurityBindings" ContentType="" />"

- Change the extension from ".zip to ".pbix"

- The file will open without breaks

 

Hope it helps!

Anonymous
Not applicable

GREAT! Saved my week   \o/

Thanks @Anonymous 

Anonymous
Not applicable

Yes, This worked. Because of this so much time is saved. Don't know how to thank you.

Anonymous
Not applicable

This worked!  Thanks so much!  It saved me hours of having to rebuild the file

instinct46
New Member

I found that when I was saving, the WriteAllTextAsync was prepending 2 extra bytes.. using FlexHex I could see that the original did not have that.

 

2cdba354-cdd6-438c-8daf-e0aa18da5772.jpg

 

To fix this I just saved with WriteAllTextAsync with Encoding.Unicode. Re-opened as bytes and saved skipping the first 2 bytes in question.

 

var serializedFile = JsonConvert.SerializeObject(_layoutModel);
await System.IO.File.WriteAllTextAsync(Filepath, serializedFile, Encoding.Unicode);

var asBytes = await System.IO.File.ReadAllBytesAsync(Filepath);
await System.IO.File.WriteAllBytesAsync(Filepath, asBytes.Skip(2).ToArray());

 

Just as an FYI, as others have mentioned I also needed to edit [Content_Type].xml and remove the Override tag with the PartName == "/SecurityBindings". After that powerbi loaded it fine (ignoring the validation checks it did).

 

This is what worked for me.

After a little research I found that it's a marker for byte order of unicode (I'd gussed it was this, but didn't know for sure until now). Anyway, I've update the code pushed here yesterday. (Couldn't find an edit link for my previous post)

 

 

public async Task Save()
{
    var layoutFile = JsonConvert.SerializeObject(_layoutModel);
    await System.IO.File.WriteAllTextAsync(Filepath, layoutFile, Encoding.Unicode);

    IEnumerable<byte> layoutAsBytes = await System.IO.File.ReadAllBytesAsync(Filepath);
    layoutAsBytes = StripUnicodeByteOrder(layoutAsBytes);
    await System.IO.File.WriteAllBytesAsync(Filepath, layoutAsBytes.ToArray());
}

public static IEnumerable<Byte> StripUnicodeByteOrder(IEnumerable<byte> bytes)
{
    if (bytes.ElementAt(0) == 0xFF && bytes.ElementAt(1) == 0xFE)
        bytes = bytes.Skip(2);

    return bytes;
}

 

 

Hi @instinct46 , 

 

Could you explain where and how one should exactly run this code? In my case, I don't want to change the lay-out file but I want to change the datamodelschema to programmatically add measures. 

 

Thanks in advance.

I don't believe that code is needed if you make edits with Notepad ++ and not Notepad. I kept getting a corrupt file despite thinking I'd followed the instructions exactly, then I came across this and realized Notepad was the culprit (and I later noted that the instructions above explicity say in all caps that it's VERY IMPORTANT to use Notepad ++ to make edits, yet I had somehow overlooked them 😀).

elimcd79_0-1665524901501.png

 

I hope this is what is causing your issue as well!

Anonymous
Not applicable

When I remove "<Override PartName="/SecurityBindings" ContentType="" />" in the [Content_Types].xml root file, I can edit the PBIX file and open it without problem.

Hey,
I tried your solution, it's working great !
many thanks !

Anonymous
Not applicable

Hi 

 

When I try to just remove the "<Override PartName="/SecurityBindings" ContentType="" />" in the [Content_Types].xml root file and try to re construct the pbix by zipping the file, still I am unable to open the file. Please advise.

Try deleting the Security Bindings file rather than removing this code.

 

Also, when you say zipping the file... See my comment above. The extracted file should not be re-zipped. Instead, the extracted Layout file should be updated and then copied into the original .zip folder (Delete Security Bindings file from here). This should then be renamed back to .pbix

AngelQ
Frequent Visitor

Its doen´t works for me

 

AngelQ
Frequent Visitor

Sorry, it´s doesn´t work for me

Anonymous
Not applicable

Hey,

 

Its working!! thank you.

CBourlet
Frequent Visitor

Same issue here, but even without rezipping the file, it causes corruption :(,
hope it will be possible to deal with the Layout directly one day.

Ian_B
Regular Visitor

I can change the Layout file by doing the following:

 

Change .pbix to .zip

Extract file

Amend and save extracted Layout file

Copy amended Layout file into original zipped folder *

Rename .zip to .pbix

 

*This is required. Re-zipping the extracted file will cause corruption

Helpful resources

Announcements
Fabric Community Conference

Microsoft Fabric Community Conference

Join us at our first-ever Microsoft Fabric Community Conference, March 26-28, 2024 in Las Vegas with 100+ sessions by community experts and Microsoft engineering.