LibreOffice转XLSX为CSV:日期统一格式与指定工作表方法咨询
LibreOffice 转换XLSX到CSV的问题解决
问题1:统一转换带月份缩写的日期格式
31/Dec/2022这类带月份缩写的内容,大概率被LibreOffice识别为文本类型而非日期值,所以直接用命令行转换不会自动处理。可以通过以下两种方式解决:
方案1:宏脚本批量转换文本日期
编写LibreOffice Basic宏,遍历单元格识别文本格式的日期,转为标准日期值并设置统一格式,再导出CSV。示例宏代码:
Sub ConvertDatesAndExport Dim oDoc As Object, oSheet As Object, oCell As Object Dim i As Integer, j As Integer oDoc = ThisComponent ' 遍历所有工作表 For Each oSheet In oDoc.Sheets For i = 0 To oSheet.Rows.Count - 1 For j = 0 To oSheet.Columns.Count - 1 oCell = oSheet.getCellByPosition(j, i) ' 仅处理文本类型单元格 If oCell.Type = com.sun.star.table.CellContentType.TEXT Then On Error Resume Next Dim dateVal As Date dateVal = CDate(oCell.String) ' 转换成功则设置为日期值和指定格式 If Err = 0 Then oCell.setValue(dateVal) oCell.NumberFormat = oDoc.NumberFormats.getFormat("YYYY/MM/DD") End If On Error GoTo 0 End If Next j Next i Next oSheet ' 执行导出(可结合原有命令行参数调整) End Sub
调用宏的命令行:
libreoffice --headless --macro ConvertDatesAndExport --convert-to csv:"Text - txt - csv (StarCalc)":44,34,UTF8,1,,0,false,true,false,false,false,-1 date.xlsx
方案2:预先手动处理(适合少量文件)
打开XLSX文件,用DATEVALUE函数将文本日期转为日期值,批量设置单元格格式为YYYY/MM/DD,再用原有命令行导出。
问题2:指定单个工作表转换
LibreOffice原生命令行不支持直接指定工作表,可通过以下两种方式实现:
方案1:使用unoconv工具
unoconv是LibreOffice的命令行封装工具,支持指定工作表导出,命令示例:
unoconv -f csv -e "Sheet=Sheet1" date.xlsx
(需提前安装unoconv,如apt install unoconv或brew install unoconv)
方案2:宏脚本指定工作表导出
编写宏仅处理目标工作表并导出为CSV,示例代码:
Sub ExportSpecificSheet Dim oDoc As Object, oSheet As Object, oExportOpts As Object oDoc = ThisComponent ' 指定要导出的工作表名称 oSheet = oDoc.Sheets.getByName("Sheet1") oDoc.CurrentController.ActiveSheet = oSheet ' 配置导出参数(对应原有命令的CSV格式设置) Dim oFilterData(10) As New com.sun.star.beans.PropertyValue oFilterData(0).Name = "FieldSeparator" : oFilterData(0).Value = "," oFilterData(1).Name = "TextDelimiter" : oFilterData(1).Value = """" oFilterData(2).Name = "CharacterSet" : oFilterData(2).Value = "UTF8" oFilterData(3).Name = "RowNumber" : oFilterData(3).Value = 1 oFilterData(4).Name = "ExportFormula" : oFilterData(4).Value = False oFilterData(5).Name = "ExportCellFormat" : oFilterData(5).Value = True oFilterData(6).Name = "QuoteAllText" : oFilterData(6).Value = False oFilterData(7).Name = "FixedColumnWidth" : oFilterData(7).Value = False oFilterData(8).Name = "SaveCellStyles" : oFilterData(8).Value = False oFilterData(9).Name = "SaveDocumentProperties" : oFilterData(9).Value = False oFilterData(10).Name = "ExportHiddenRows" : oFilterData(10).Value = -1 oExportOpts = CreateUnoStruct("com.sun.star.beans.PropertyValue") oExportOpts.Name = "FilterName" oExportOpts.Value = "Text - txt - csv (StarCalc)" ' 导出CSV,替换为你的目标路径 oDoc.storeToURL("file:///home/user/Sheet1.csv", Array(oExportOpts, CreateUnoStruct("com.sun.star.beans.PropertyValue", "FilterData", 0, oFilterData))) End Sub
调用宏的命令行:
libreoffice --headless --macro ExportSpecificSheet date.xlsx
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

