OOXML Hacking - Open XML Explained

We're proud to be hosting a free e-book Open XML Explained. Finding readable explanations of how Office Open XML works isn't easy. Outside of the very dense published ECMA standards, most of the information exists only on the web in help pages and blog posts. Back in 2007, a developer in the Netherlands, Wouter van Vugt, published a well written PDF that goes into details about the XML formats used in Word, Excel and PowerPoint. This was originally posted on the openxmldeveloper.org website run by OOXML genius Eric White.

Eric's site closed down some years ago and much of the content disappeared. But I've been able to track down a copy of Wouter's book and have his permission to give it a new home here at Brandwares. Download Open XML Explained.

The e-book covers Excel, Word and PowerPoint in depth, covering otherwise obscure topics like table formatting, bulleting and charts. It's an excellent companion to my book, covering the theory behind my practical techniques. OOXML hackers will appreciate the explanations of all the major XML parts in an Office file, while coders will find this a useful resource in learning how to programmatically create and modify documents, workbooks and presentations.

Open XML Explained

I should note that Open XML Explained was written in 2007, so while it covers all the OOXML basics, it doesn't have any information about newer features like the Backstage or SuperThemes. Reader David Wiggins was kind enough to find the sample files that accomapied the book. The download page has a link to them as well. Enjoy!

OOXML Hacking: Buy the Book

After years of original research, you can finally buy the book! Filled with unique information not found anywhere else, online or in print, this manual shows you how to build SuperThemes 3 different ways, how to create custom Effects Themes, how to edit the Ribbon in macOS, and much more!

OOXML Hacking: buy the book

The book expands on many of the brief articles on this site, putting them in logical order and expanding the number of examples. Author John Korchok explains how Office Open XML files work, shows you where to find each XML part and how each part can be modified. With these tools, you can provide unique services to your clients or users that you can't find at the average Office template service bureau. To give you a better idea of what it covers, here is the Table of Contents:

Table of Contents 1
Table of Contents 2
Table of Contents 3

All techniques are covered in both Windows and macOS. The book includes a link to a downloadable text file with all the hyperlinks, XML and VBA listings, so you don't have to retype anything from the printed page. At this time, only print copies are available, ebook versions will be here in several months. To buy the book, click here.

Presentation Summit 2019

This October 6 - 9 in San Antonio, the world's top presentation experts will be meeting at the Presentation Summit 2019. This is the place to learn how to make amazing presentations that sparkle, or network with pros who can make you shine.

For the first time, Brandwares will be a sponsor. I'll be attending with my new book OOXML Hacking. In addition to expanded versions of my online articles, put in a logical sequence, there are new chapters from our original research. I show you three ways to build SuperThemes, how Effects Themes work and how to create them, plus much more information that can't be found anywhere else, in print or online.

Indezine.com, the media sponsor for the Presentation summit was kind enough to interview to find out more. Here's is the result:

Uniform Rounded Corners - Cool Code

A client sent a design for a Word template that had lots of boxes and photos with uniform rounded corners. Not an unreasonable request, but Office doesn't do that well. In PowerPoint, Word and Excel, rounded corners are proportional to the size of the shape. Making them uniform manually is picky and time-consuming. But with a dash of VBA, we can make the job easy.


The Math

As a round-cornered shape gets larger, the corner radius increases as well, in proportion to the shape size. Since we want to keep the radius the same size, we need to create a formula that makes a smaller number as the height and width increase. We need an inverse number! The simplest way to create an inverse is to divide 1 by the measurements. Then, we need a number to set the radius size: a constant. The formula looks like this: (1 / (Shape.Height + Shape.Width)) * RadiusFactor. And you thought you'd never need that high school math!

Here's VBA code that will work in Excel, Word and PowerPoint on a selection of round-cornered boxes:

Sub RoundedCorners()
  Dim oShape As Shape, RadiusFactor!
  RadiusFactor! = 50
  For Each oShape In ActiveWindow.Selection.ShapeRange
    With oShape
      If .AutoShapeType = msoShapeRoundedRectangle Then
        .Adjustments(1) = (1 / (oShape.Height + oShape.Width)) * RadiusFactor!
      End If
    End With
  Next oShape
End Sub

Uniform Rounded Corners for the Whole Document

To run this on a whole presentation, document or workbook, we need to customize the routine for each Office program. Here's the Excel version:

Sub RoundAllXLCorners()
  Dim oWorksheet As Worksheet, oShape As Shape, RadiusFactor!
  RadiusFactor! = 50
  For Each oWorksheet In ActiveWorkbook.Worksheets
    For Each oShape In oWorksheet.Shapes
      With oShape
        If .AutoShapeType = msoShapeRoundedRectangle Then
          .Adjustments(1) = (1 / (oShape.Height + oShape.Width)) * RadiusFactor!
        End If
      End With
    Next oShape
  Next oWorksheet
End Sub

To do the same in PowerPoint

Sub RoundAllPPCorners()
  Dim oSlide As Slide, oShape As Shape, RadiusFactor!
  RadiusFactor! = 50
  For Each oSlide In ActivePresentation.Slides
    For Each oShape In oSlide.Shapes
      With oShape
        If .AutoShapeType = msoShapeRoundedRectangle Then
          .Adjustments(1) = (1 / (oShape.Height + oShape.Width)) * RadiusFactor!
        End If
      End With
    Next oShape
  Next oSlide
End Sub

And finally, for Word

Sub RoundAllWDCorners()
  Dim oShape As Shape, RadiusFactor!
  RadiusFactor! = 50
  For Each oShape In ActiveDocument.Shapes
    With oShape
      If .AutoShapeType = msoShapeRoundedRectangle Then
        .Adjustments(1) = (1 / (oShape.Height + oShape.Width)) * RadiusFactor!
      End If
    End With
  Next oShape
End Sub
Before: Rounded Corners, but not Uniform
Rounded Corners, but not Uniform

The Word version is a little simpler because a Word document is one big object, while Excel and PowerPoint both have multiple objects for each worksheet and slide, respectively. But the similarites point out that when you're searching online for VBA code, finding something for a different program and modifying it can be a huge time-saver. By far, Excel has way more code written for it, so Excel VBA sites can be a fruitful source for Word and PowerPoint code ideas.

After: Uniform Rounded Corners
Uniform Rounded Corners

These macros have been tested under both Windows and macOS and work well under both.

Logos Over Photos - Best Practices

Back at the dawn of time, when PowerPoint was first being programmed, a fateful and incorrect decision was made. Placeholder content would always appear in front of static content, regardless of how placeholders and other content were stacked on the layout. This has led to countless bald designers, from them tearing out their hair because there's no way to place logos over photos.


The Locked Graphics Workaround

One way to circumvent this design flaw is to place a picture placeholder on the layout as usual. Then create a sample slide from it. Place the logo over the photo and lock its position in the XML. Here's my article on how to do that: OOXML Hacking: Locking Graphics. This allows the user to replace the photo while keeping the logo in front.

The disadvantage is that you can't create a new slide from the layout. Instead, the user must copy and paste the sample slide to create another one.


The Background Picture Fill Workaround

If the photo is a full-screen photo, there's another method. This time, don't place a picture placeholder on the layout. Instead, just place the logo there. In use, the user right-clicks on the background and chooses Format Background. On the Format Background task pane, choose Picture or texture fill, then click on the File button and choose the background photo. The logo will stay on top.

The disadvantage to this technique is you have to include instructions to the end user, who may never have used a picture fill previously. My thanks to Jaakko Tuomivaara of Supergroup Studios in the UK for this tip.


Logos Over Photos: The Placeholder Picture Fill Workaround

This works with any size photo, it doesn't have to be full-frame like the previous hack. No copy and paste, no instructions required. I heard about this one from Joshua Finto (Make It So Studio in Austin, TX).

On the layout, insert a picture placeholder to hold the photo. Then add another placeholder on top, sized to exactly the same size as the logo. I use Online Image placeholders because they are rarely used, using a common placeholder type risks content being placed in it if you change layout types. Remove bullets, if there are any, and type a space character so no placeholder text appears.

In the Format Picture task pane, click on Picture or texture fill, then on the File button and fill the placeholder with the logo. Create a slide, place a photo and voila! The logo appears over top of the photo! After creating this, it's wise to lock the placeholder in XML on that layout, to prevent distortion by the user playing with it. OOXML Hacking: Locking Graphics. EMF, SVG and transparent PNGs are all good logo formats for this application.

Microsoft maintains User Voice forums to collect feedback from users. I've created a suggestion there that the placeholder/shape stacking order on the layout should be respected on slides. Please add your vote here: Layout shapes and placeholders should keep their stacking order on the slide. Perhaps we can persuade Microsoft to fix the mistake so we don't need these time-wasting workarounds.

Thanks to my readers who have added some useful suggestions! Please read the comments for additional ideas and tips.

OOXML Hacking: Notes Page Repair

A bug in PowerPoint Online can wreck presentations edited there. This article describes the symptoms and how to do a notes page repair - if you use Windows. Mac users cannot fix this issue because of sloppy Microsoft programming in the macOS version.

PowerPoint Online can resize the Notes Master page of a presentation. It can also resize elements on the Notes Master, leading to a really wacky combination of large and small placeholders. Almost always, the page size is made much smaller, often into a thin but tall rectangle. The exact cause hasn't been determined yet, but it may be caused by editing Notes. PowerPoint Online can't display either the Notes Page or the Notes Master for a presentation, so this problem goes undetected until the presentation is downloaded and viewed in the desktop version. Do a quick Google search on notes page wrong size site:microsoft.com to see lots of examples.

There are three steps to a notes page repair, and it starts with an XML hack. Open up the presentation in BBEdit or OOXML Tools (macOS) or unzip it (Windows). Find the presentation.xml part. In human-readable form, the 13th line will be the Notes Master page size. This example shows the normal values:

<p:notesSz cx="6858000" cy="9144000"/>

The hack involves resetting these values to normal, then saving and closing, or rezipping the files. But that's just 1 of 3 steps. The next 2 steps can be done in the program.

Open the presentation in PowerPoint, then choose View>Notes Master. Very likely there will be wrong-size shapes or missing elements. To fix this, uncheck, then recheck each of the 6 elements (Header, Slide image, Footer, Date and Time, Body and Slide Number). This restores them to the designed co-ordinates.

Uncheck and Recheck

The third step notes page repair is to reset each Notes Page to follow the Notes Master. This is where the Mac version runs into trouble. In the Windows version of PowerPoint, open the Notes Page for each slide and right-click on the background. This is the context-aware menu you'll see:

Notes Page Context Menu in Windows

Click on Notes Layout, then on Reapply master. The Notes Page reverts to correct formatting.

Now let's look at the same operation on a Mac. Right-click on the Notes Page and what do we see?

Notes Page Context Menu in MacOS

This is not a "context-aware" menu. This is exactly the same menu that you get if you right-click on a slide. The available commands make sense for a slide, not for a notes page. There is no option to reset the page to the Notes master. The Mac programming team got lazy and just reused the same menu.

As a result, Mac users can't complete a notes page repair. They can't reset the page back to the original format.

But wait! What's that? I hear you say, you read about a macro that can reapply the Notes master. Yup, it's here on Steve Rindsberg's awesome PPTFAQ site: Reapply the Notes Master to each Notes Page in a presentation. Except that macro raises an error on Mac version of PowerPoint, because the control ID can't be found.

Microsoft has f***ed this one badly. First, through the PowerPoint Online bug that creates this, and remains unfixed until the date of this post. Second, because of the sloppy "context-aware" menu programming. And third because they can't provide PowerPoint for Mac with a complete list of controls in the VBA object model.

Since I first wrote this article, John Wilson in the UK has written a pair of Windows-only repair utilities to fix this problem. Here's the page where you can download both, one to fix the Notes Master and another to reapply the master to the Notes Pages. Give them a try, it's a little easier than revising the XML.

As always, if you're new to this topic, please review the page about editing OOXML files. Mac users should also read XML Hacking: Editing in macOS. I value your feedback, please leave a comment about any concerns or questions.

OOXML Hacking: Vertical Bullet Alignment

Bad design decisions haunt our lives. One poor choice was Microsoft's selection of the text baseline for vertical bullet alignment in PowerPoint. Bigger bullets move up, smaller bullets move down, without any control in the user interface. I'm sure you've seen this effect as you change bullet size relative to text:

Bad Vertical Bullet Alignment


Fixing Vertical Bullet Alignment with VBA

There are a couple of ways to fix this issue. One is to download and install this free Add-in by John Wilson of PowerPoint Alchemy: Bullets Move Up and Down. The VBA code behind this add-in looks something like this:

Sub fixBulletAlignment()
  Dim oDes As Design
  Dim oMast As Master
  Dim L As Long
  Dim oCust As CustomLayout
  Dim oshp As Shape
  For Each oDes In ActivePresentation.Designs
    For Each oCust In oDes.SlideMaster.CustomLayouts
      For Each oshp In oCust.Shapes
        If oshp.Type = msoPlaceholder Then
          Select Case oshp.PlaceholderFormat.Type
          Case Is = ppPlaceholderBody, ppPlaceholderVerticalBody, ppPlaceholderObject
            For L = 1 To oshp.TextFrame.TextRange.Paragraphs.Count
              With oshp.TextFrame.TextRange.Paragraphs(L).ParagraphFormat
                .BaseLineAlignment = ppBaselineAlignCenter
              End With
            Next L
          End Select
        End If
      Next oshp
    Next oCust
  Next oDes
  MsgBox "Masters and layouts fixed", vbInformation, "PowerPoint Alchemy"
End Sub

When this runs, it adds an over-ride to the text level definitions on each slide layout that has multi-level text (any layout containing a Content or Text placeholder).

<a:lstStyle>
  <a:lvl1pPr fontAlgn="ctr">
    <a:defRPr/>
  </a:lvl1pPr>
  <a:lvl2pPr fontAlgn="ctr">
    <a:defRPr/>
  </a:lvl2pPr>
  <a:lvl3pPr fontAlgn="ctr">
    <a:defRPr/>
  </a:lvl3pPr>
  <a:lvl4pPr fontAlgn="ctr">
    <a:defRPr/>
  </a:lvl4pPr>
  <a:lvl5pPr fontAlgn="ctr">
    <a:defRPr/>
  </a:lvl5pPr>
</a:lstStyle>

This is adequate for most purposes. With correctly aligned bullets, we now get this effect when we change the bullet size:

Good Vertical Bullet Alignment

There are a couple of downsides to the VBA approach:

  • You have to remember to apply it to each presentation or template.
  • If you add a new layout, or add a new text or content placeholder to an existing layout, you'll have to re-run the macro.
  • Table text and text box text does not benefit, their bullets will still be wonky.

Fixing Vertical Bullet Alignment with XML Hacking

With XML hacking, we can fix this problem once and never have to think about it again. Start by unzipping a new blank template, then editing ppt\slideMasters\slideMaster1.xml. There are 3 sections to be edited: p:titleStyle (for all title placeholders), p:bodyStyle (for all text or content placeholders) and p:otherStyle (for table text).

The editing is the same for all sections: for each a:lvlXpPr section, where X is the level number, add fontAlgn="ctr" to the definition. Here's what it looks like before...

<a:lvl1pPr marL="0" indent="0" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1">

...and after editing:

<a:lvl1pPr fontAlgn="ctr" marL="0" indent="0" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1">

There are 19 level definitions in slideMaster1.xml to change. When you're done that, open ppt\presentation.xml and make the same edit to the 9 levels of the p:defaultTextStyle section that controls formatting for text boxes and notes and handout pages.

When you're done, rezip the XML files and rename the template blank.potx. Place it so it works as your default template, here's an article from Steve Rindsberg with the details for each Office version. For PowerPoint 2016 and 2019 for Windows, follow the PowerPoint 2013 directions. For 2019 for Mac, use the Mac 2016 directions: Create your own default presentation.

Now that this is set in your default template, every new file created when PowerPoint opens will have the correct vertical bullet alignment. Please note that in PowerPoint for Windows, if you choose File>New>Blank Presentation, this autogenerates a new file that is not based on your default template. Such a file will have incorrect vertical bullet alignment.

Shared Workgroup Templates - Best Practices

Groups of workers usually use the same templates. But it can be time-consuming to keep everyone updated when templates are installed separately on each desktop. Instead, you can implement shared workgroup templates with a feature already built into Office.


Shared Workgroup Templates - Multiple Uses

Every desktop version of Office, Mac and Windows, includes a Workgroup templates option that allows you to set a network share as a templates folder. Templates on this share are instantly available to all users, making updates and revisions a breeze. Automatically, everyone in the office is using the same version. As long as template names remain identical, then old Word documents automatically attach themselves to the new template.

The Workgroup templates network share can serve more that just templates. With some additional subfolders, it can be a source for Document Themes, including custom SuperThemes, it can hold collection of Font and Color themes. These additional files don't show in the File>New dialog. Theme files display under the Themes dropdown, theme colors under the Colors dropdown and theme fonts under the Fonts dropdown.


Shared Workgroup Templates - Setup

To set up shared workgroup templates, first create the network location and ensure it's accessible to all in the office without a signin. Each computer should connect to the share automatically on restart, so users don't have to remember to manually connect before creating a new document. Create subfolders with the following names for othe file types you want to support. Document Themes for themes, with subfolders for Theme Colors and Theme Fonts. All versions of Office expect exactly the same file structure.

If the office uses Group Policies to install and configure software, you can use that feature to add the Workgroup Template location to each user installation. If you're using "sneakernet" for configuration, here's how to do it manually. All Office suites use a setting in Word to set the location for all the other programs

Office 2010, 2013, 2016 and 2019 for Windows

  1. In Word, choose File>Options>Advanced.
  2. Scroll down to the General section of Advanced and click on the File Locations... button.
  3. Select the Workgroup templates line, then click on the Modify button.
  4. In the dialog that opens, enter the path to the network share in the Folder name field, or use the window controls to navigate to the folder. Select the folder and click on OK. OK all the way out and close Word

Office 2007 for Windows

  1. In Word, click on the Office button, then on Word Options, then on Advanced..
  2. Scroll down to the General section of Advanced and click on the File Locations... button.
  3. Select the Workgroup templates line, then click on the Modify button.
  4. In the dialog that opens, enter the path to the network share in the Folder name field, or use the window controls to navigate to the folder. Select the folder and click on OK. OK all the way out and close Word.

Office 2003 and earlier for Windows

  1. In Word, choose Tools>Options and click on the File Locations tab.
  2. Select the Workgroup templates line, then click on the Modify button.
  3. In the dialog that opens, enter the path to the network share in the Folder name field, or use the window controls to navigate to the folder. Select the folder and click on OK. OK all the way out and close Word.

Office 2016 and 2019 for Mac

  1. In Word, choose Word>Preferences>File Locations.
  2. Select the Workgroup templates line, then click on the Modify button.
  3. In the dialog that opens, use the window controls to navigate to the folder. Select the folder and click on Open. OK out and close Word

Office 2011 and earlier for Mac

  1. In Word, choose Word>Preferences>File Locations.
  2. Select the Workgroup templates line, then click on the Modify button.
  3. In the dialog that opens, use the window controls to navigate to the folder. Select the folder and click on Choose. OK out and close Word

Shared Workgroup Templates in Use

Here's how to access Workgroup templates in Office programs

Office 2016 and 2019 for Windows

  1. Choose File>New.
  2. Click on Custom.
  3. Click on Workgroup Templates, select a template, then click on Create.

Office 2013 for Windows

  1. Choose FILE>New.
  2. Click on SHARED.
  3. Click on a template.

Office 2010 for Windows

  1. Choose File>New>My Templates.
  2. On the Personal Templates tab, select a template, then click on OK. This tab also shows local templates on the user's computer.

Office 2007 for Windows

  1. Click on the Office button, then on New.
  2. Click on My templates...
  3. Select the My Templates tab. Workgroup templates are displayed along with local templates in the same pane.

Office 2003 and earlier for Windows

  1. Click on File>New. The New Document pane opens at the side of the window.
  2. On the New Document pane, click on On my computer...
  3. Select a template from the General pane and click on OK. This pane shows a mix of local and workgroup templates.

Office 2016 and 2019 for Mac

  1. Choose File>New from Template.... The Document Gallery opens
  2. In the upper left corner, click on the Work link. This link only appears when you have a Workgroup Templates location set in Preferences.
  3. Select a template, then click on Create.

Office 2011 for Mac

  1. Choose File>New from Template. The Document Gallery opens.
  2. Click on Workgroup Templates in the left-hand TEMPLATES list..
  3. Select a template and click on Choose.

Office 2008 for Mac

  1. Choose File>Project Gallery. The Project Gallery opens.
  2. Click on My Templates in the left-hand Category list..
  3. Select a template and click on Open. This window will show a mix of Workgroup and local templates.

Shared Workgroup Templates - Shortcomings

In addition to templates and themes, a local templates folder also serves custom Chart and SmartArt templates. Neither of these formats is supported by Workgroup Templates, so those templates must still be installed locally on each user's computer.

OOXML Hacking: Layout Color Variations for Visual Interest

Having worked with many great designers, I see that they try to create variety in chart appearance rather than uniformity. So what if there was a way to have make a chart layout with the colors in a different order? This could give you layout color variations while sticking to the branding guidelines. Well, I have a solution for you, but you're gonna have to hack some XML!

If you're an XML newby, please read my article XML Hacking: An Introduction. macOS users will live longer lives if they take a look at XML Hacking: Editing in macOS.

Normally, every layout under a slide master has only 1 color theme. You're mostly stuck with those 10 colors in a fixed order. In my earlier article about Great Color Themes, I explained how the sequence of colors determines the color order of charts.

But during some recent research, I started reading about the <p:clrMapOvr> XML element. This can be applied to a slide layout to rearrange the color theme. With Accents 1 to 6 in a different order, charts can acquire a whole new look. Here's how it works.


Layout Color Variations with clrMapOvr

Before Layout Color Variations

At the end of most layouts, you may have seen this XML:

  <p:clrMapOvr>
    <a:masterClrMapping/>
  </p:clrMapOvr>

This tells the layout that it should use the standard color mapping as defined in the theme. We would think of this as the default or normal set of colors. But what if we want to alter this sequence? We can assign each color theme value to a different task. If you import a PowerPoint 2003 or older deck, this gets generated automatically to keep the deck looking as expected.

Here's an alternate mapping of the same colors:

  <p:clrMapOvr>
    <a:overrideClrMapping bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent6" accent2="accent5" accent3="accent4" accent4="accent3" accent5="accent2" accent6="accent1" hlink="hlink" folHlink="folHlink"/>
  </p:clrMapOvr>

This reverses the order of accent colors from the master, giving charts, fills and shapes a whole new look for the slides based on this layout.

After Layout Color Variations

We used to tell clients "Sorry, we have to set the color order to match only one of your designed charts." Now we have a different message: "Different chart color sequences? No problem. Just use a different layout!"

If XML hacking doesn't interest you, Brandwares can do it for you. We're a full-service template creation service for all Office programs. Email me at production@brandwares.com with your project details.