Setting the page size and orientation with ODFDOM for tables aka spreadsheets

Most tasks that seem to be quite easy tend to turn out as a disaster. Setting the page size and orientation with ODFDOM was such a thing. While styling with ODFDOM is powerful and a horror at the same time. You actually never know where the attribute has to be placed or which attributes to use.

After I finished an export to “ods” (aka spreadsheet), it simply wanted to set the format to “A4 landscape”. Here is how to do that:

First create your spreadsheet and sheet (you might already have done that):

OdfSpreadsheetDocument output = OdfSpreadsheetDocument.newSpreadsheetDocument ();
final OdfTable sheet = OdfTable.newTable ( output );

Now change the styles to “A4 landscape”:

First, we need to get the “master page” named “Default”:

StyleMasterPageElement defaultPage = output.getOfficeMasterStyles ().getMasterPage ( “Default” );

The master page tells us the name of the page style:

String pageLayoutName = defaultPage.getStylePageLayoutNameAttribute ();  

Which gives us the page layout object:

OdfStylePageLayout pageLayout = defaultPage.getAutomaticStyles ().getPageLayout ( pageLayoutName );  

Finally, we can set “A4 landscape”:

pageLayout.setProperty ( OdfPageLayoutProperties.PrintOrientation, "landscape" );  
pageLayout.setProperty ( OdfPageLayoutProperties.PageHeight, "210.01mm" );  
pageLayout.setProperty ( OdfPageLayoutProperties.PageWidth, "297mm" );  
pageLayout.setProperty ( OdfPageLayoutProperties.NumFormat, "1" );  

All four properties seem to be required. Also, the width and height have to be rotated according to “landscape”.