I hacked Box Spout to support column widths formatting, but wanted a quick way of adding appropriate column widths (yes, automatic width determination would be better … but I didn’t want to spend hours sorting that). Instead of wasting time on automatic column widths, I wrote a simple Excel code module to tell me the appropriate column widths. If your data width might vary, you can add some padding to the ReportColumnWidth function. My data, fortunately, is fixed width.
You will need to save your spreadsheet as a macro-enabled workbook (.xlsm). To add a function to Excel, hit Alt and F11. Select “Insert” => “Module” and paste in the following content and save.
Function iCeiling(iInput) iCeiling = Int(iInput) If iCeiling <> iInput Then iCeiling = Int(iInput) + 1 End If End Function Function ReportColumnWidth(CellID As Range) As Double Application.Volatile ReportColumnWidth = iCeiling(CellID.ColumnWidth) End Function
In Excel, use the ReportColumnWidth function to print the width of a column into a cell. This is my row #3.
In row #2, I have a counter that provides the row number for use in Box Spout. Row #4 creates the line needed to set the column width in my code using the concat function.
=CONCAT("$writer->setColumnsWidth(",A3,",",A2,",",A2,");")
Replacing the tab characters with newlines, I now have column widths set based on my data.