MattsBits
MattsBits

MattsBits

OpenOffice Writer Macro To Set Table Column Widths  

by Matt Hawkins, 26/08/2010
Categories : General

I spent ages trying to figure out how to set the columns widths of all tables in an OpenOffice Writer document using an OpenOffice Basic macro.

I finally worked it out and here is my solution.

In order to understand my macro you need to understand how OpenOffice tables operate.

Column widths are determined by the position of "column separators". A 5 column table will have 4 separators. The separator position is relative to the start of the table and the separator widths add up to 10000. Why 10000? I don't know!

Example :
A 5 column table with equal spacing will have 4 separators with a width of 2000. The column separators will have positions 2000 4000 6000 8000. The total column width is 10000.

If the table is 10cm wide then each column will be 2cm. If the table is 20cm wide each column will be 4cm. The columns Separator values are the same. The width of the table determines what the 10000 actually means in the real world.

This macro takes your desired widths, calculates the total, calculates how this relates to 10000 and then calculates the position of each separator.

It ignores tables with the wrong number of columns.

Sub SetTableColWidths

  ' Declare variables for later use
  Dim i as integer          ' Count integer
  Dim x as integer          ' Count integer
  Dim oTables               ' Collection of tables
  Dim oTable                ' Individual table
  Dim aWidth() as double    ' Array of widths
  Dim iColCount             ' Number of columns
  Dim dFactor as double     ' Unit factor
  Dim dWidthTotal as double ' Total desired width

  ' Get all table objects in document
  oTables = ThisComponent.TextTables

  ' Loop through one table at a time
  For i = 0 To oTables.getCount() - 1
    
    ' Set table AutoFormat if required
    'oTables(i).autoFormat("Blue")    
    
    ' Initialise width total
    dWidthTotal = 0 
   
    ' #########################################
    ' This is the only bit you need to modify
    
      iColCount = 5  ' Specify number of columns
      
      ReDim aWidth(iColCount-1)
      
      ' Specify desired with for each column
      ' These are relative so can be whatever
      ' units you like. Populate the array with values
      ' Make sure you define the correct number
      ' of columns!
      aWidth(0)= 2.3
      aWidth(1)= 2.0
      aWidth(2)= 0.9
      aWidth(3)= 2.9
      aWidth(4)= 6.5  
              
    ' #########################################

    ' Get column separators
    oTblColSeps = oTables(i).TableColumnSeparators 

    ' Check table has correct number of columns
    If ubound(oTblColSeps)+2<>iColCount Then
      msgbox "Table """ & oTables(i).getName() & _
             """ has wrong number of columns"
    Else
        
      ' Sum all desired widths
      For x = lbound(aWidth) To  ubound(aWidth)
        dWidthTotal = dWidthTotal + aWidth(x)
      Next

      ' Calculate conversion factor as Writer requires
      ' column separater widths total 10000
      oFactor = 10000/dWidthTotal

      ' Calculate first separator position based on factor and
      ' desired width of first column
      oTblColSeps(0).position = oFactor * aWidth(0)

      ' For the other separators
      For x = lbound(aWidth)+1 To  (ubound(aWidth)-1)
        ' Position based on position of previous separator plus 
        ' current width
        oTblColSeps(x).position =  oTblColSeps(x-1).position _
                                + (oFactor * aWidth(x))
      Next

      ' Update the table with the new positions           
      oTables(i).TableColumnSeparators = oTblColSeps        
    
    End If
   
  Next

End Sub

Author : Matt Hawkins  Last Edit By : Matt Hawkins
PHP Powered  MySQL Powered  Valid XHTML 1.0  Valid CSS  Firefox - Take Back The Web  EUKHost - Recommended Webhosting Solutions

MattHawkins CMS v3.0 - Copyright 2009-2017