Client: John Christensen (United States)
Date: April 2016
Technology: LibreOffice Calc, LibreOffice Basic, CSV
This project was to develop macros for reading CSV files in a LibreOffice Calc spreadsheet. Then, the macros retained only the desired columns and adjust their size, change the order and finally format the page in landscape mode with headers settings.
This function requires the name of the CSV file to open.
Private Function open_file() as String Dim file_dialog as Object Dim status as Integer Dim file_path as String Dim init_path as String Dim ucb as object Dim filterNames(3) as String filterNames(0) = "*.csv" filterNames(1) = "*.*" GlobalScope.BasicLibraries.LoadLibrary("Tools") file_dialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker") ucb = createUnoService("com.sun.star.ucb.SimpleFileAccess") AddFiltersToDialog(FilterNames(), file_dialog) 'Set your initial path here! init_path = ConvertToUrl("/usr") If ucb.Exists(init_path) Then file_dialog.SetDisplayDirectory(init_path) End If status = file_dialog.Execute() If status = 1 Then file_path = file_dialog.Files(0) open_file = file_path End If file_dialog.Dispose() End Function
The OrderColumns function allows you to rearrange the order of columns. The parameters are the document object and an array of column headers in the desired order.
The second function (FindColumnPosition ) is used by the previous function to find the position of the column to move.
Private Sub OrderColumns (my_doc as object, my_Headers as variant) Dim oSheet as object Dim InsertRangeName as string Dim InsertRange as object Dim InsertRange_RangeAddress as object Dim iPosition as integer Dim oSourceRangeName as string Dim oSourceRange as object Dim oSourceRangeAddress as object Dim oTargetCell as object Dim oTargetCell_CellAddress as object Dim columnLetter as string Dim NumberOfColumns as integer Dim i as integer oSheet=my_doc.sheets(0) NumberOfColumns=Ubound(my_headers)+1 For i=0 to NumberOfColumns-1 iPosition = FindColumnPosition(my_Doc, my_Headers(i),NumberOfColumns) if iPosition > -1 then 'Insert empty column columnLetter= chr(asc("A")+i) InsertRangeName = columnLetter & "1:" & columnLetter & "65536" InsertRange = oSheet.getCellrangeByName(InsertRangeName) InsertRange_RangeAddress = InsertRange.RangeAddress oSheet.insertCells(InsertRange_RangeAddress, com.sun.star.sheet.CellInsertMode.COLUMNS) 'Move column columnLetter= chr(asc("A")+iposition+1) oSourceRangeName=columnLetter & "1:" & columnLetter & "65536" oSourceRange = oSheet.getCellrangeByName(oSourceRangeName) oSourceRangeAddress = oSourceRange.RangeAddress oTargetCell = oSheet.getCellrangeByName(chr(asc("A")+i) & "1") oTargetCell_CellAddress = oTargetCell.CellAddress oSheet.moveRange(oTargetCell_CellAddress, oSourceRangeAddress) osheet.Columns.removeByIndex(iPosition+1,1) end if next i End sub Private Function FindColumnPosition (my_doc as object, HeaderName as string, maxColumn as integer) as integer Dim iCol as integer Dim iPosition as integer Dim my_cell as object Dim cell_value as string iPosition=-1 For iCol = 0 to maxColumn-1 my_cell = my_doc.Sheets(0).getCellByPosition(iCol,0) cell_value = my_cell.String if ucase(cell_value)=HeaderName then iPosition=iCol Exit For end if next iCol FindColumnPosition=iPosition End Function