将特定的Excel工作表另存为.csv

时间:2019-06-10 15:27:51

标签: csv xls libreoffice

我正在尝试弄清楚如何在Linux上通过命令行将特定的Excel工作表另存为CSV。 我可以使用以下命令保存第一张纸:

libreoffice --headless --convert-to csv --outdir /tmp /tmp/test.xls

似乎应该有一种方法可以指定我要保存的工作表,但是我找不到它。

是否可以通过LibreOffice保存它?

2 个答案:

答案 0 :(得分:0)

命令:

soffice --headless "macro:///Library1.Module1.ConvertSheet(~/Desktop/Software/OpenOffice/examples/input/Test1.ods, Sheet2)"

代码:

Sub ConvertSheet( SpreadSheetPath as String, SheetNameSeek as String)
REM IN SpreadSheetPath is the FULL PATH and file
REM IN SheetName sheet name to be found and converted to CSV

Dim Doc As Object  
Dim Dummy()

SheetNameSeek=trim(SheetNameSeek)

If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
  GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If

REM content of an opened window can be replaced with the help of the frame parameter and SearchFlags:

SearchFlags = com.sun.star.frame.FrameSearchFlag.CREATE + _
com.sun.star.frame.FrameSearchFlag.ALL

REM Set up a propval object to store the filter properties
Dim Propval(1) as New com.sun.star.beans.PropertyValue
Propval(0).Name = "FilterName"
Propval(0).Value = "Text - txt - csv (StarCalc)"
Propval(1).Name = "FilterOptions"
Propval(1).Value = "44,34,76,1"

Url=ConvertToUrl(SpreadSheetPath)

  Doc = StarDesktop.loadComponentFromURL(Url, "MyFrame", _SearchFlags, Dummy)
  FileN=FileNameoutofPath(Url)

  BaseFilename = Tools.Strings.GetFileNameWithoutExtension(FileN)

  DirLoc=DirectoryNameoutofPath(ConvertFromUrl(Url),"/")+"/"

  Sheets = Doc.Sheets

  NumSheets = Sheets.Count - 1
    For J = 0 to NumSheets

        SheetName = Sheets(J).Name

        if (SheetName = SheetNameSeek)  then

          Doc.getCurrentController.setActiveSheet(Sheets(J))        

          Filename = DirLoc + BaseFilename + "."+ SheetName + ".csv"

          FileURL = convertToURL(Filename)

          Doc.StoreAsURL(FileURL, Propval())             
    end if
    Next J
Doc.close(true)
NextFile = Dir
End Sub

答案 1 :(得分:0)

我知道 OP 现在可能已经继续前进了,但由于这是我搜索的第一个结果,我想我会尝试留下一个有效的答案,并且实际上对下一个 googler 有用。

首先,LibreOffice 仍然 只允许您保存第一个工作表。如果您只需要这些,请尝试libreoffice --convert-to csv Test.ods。有趣的是,GUI 做同样的事情 - 只允许您导出活动工作表。所以并不是终端被忽略了这么多,它只是 LibreOffice 中的一个限制。

我需要将多张工作表提取到单独的 csv 文件中,因此“仅活动工作表”不适合我。看到这个答案只有一个宏作为建议后,我一直在寻找。有几种方法可以在我在此页面之后找到的不同位置获取其他工作表。我不记得它们中的任何一个允许您提取特定的工作表(除非我跳过了一些随机的 github 工具)。

我喜欢使用 Gnumeric 电子表格应用程序的方法,因为它位于大多数中央存储库中并且不涉及首先转换为 xsl / xslx。但是,有一些注意事项需要注意。

首先,如果您希望能够在不知道工作表名称的情况下提取一张工作表,那么这将不起作用。如果您提前或时间知道工作表名称,或者可以提取所有工作表,那么这非常有效。工作表名称可用于创建输出文件,因此不会完全丢失,这也很好。

第二,如果您希望引用样式与您通过从 LibreOffice GUI 手动导出所获得的样式相匹配,那么您需要忘记术语 "csv" 并考虑 {{1} } 直到您完成转换(例如转换为 .txt 文件然后重命名它们)。否则,如果您不关心引用样式的精确匹配,那么这无关紧要。我将在下面展示两种方式。如果您不知道引用样式是什么,基本上在 "txt" 中,如果您有空格或包含 csv 的字符串,您可以在单元格值周围加上引号以区别用于分隔文本的逗号。一些程序引用所有内容,其他程序引用值中是否有空格和/或逗号,而其他程序根本不引用(或仅引用逗号?)。

最后,通过 LibreOffice 和 Gnumeric 的 , 工具进行转换时,精度似乎有所不同。对于大多数用例,对于大多数人来说还不够重要。但还是值得注意的。在我的原始 ods 文件中,我有一个公式,该公式分别使用 ssconvert58.1459.1 取 3 个单元格的平均值。当我通过 LibreOffice GUI 导出时,这个平均值达到了 59.05。使用 ssconvert,相同的值是 58.7633333333333(例如,与 LibreOffice 版本相比,它有一个额外的小数位)。我并不真正关心我的目的,但如果您需要完全匹配 LibreOffice 或不想要额外的精度,那么我想这可能很重要。

58.76333333333333 开始,我们有以下选项:

  • man ssconvert:如果导出器一次仅支持一张纸,则为每张纸导出一个文件。输出文件名被视为模板,其中工作表编号替换为 -S, --export-file-per-sheet,工作表名称替换为 %n,工作表对象名称替换为图表导出时的 %s。如果没有替换,则添加默认值 %o

  • ".%n" :指定所选导出器的参数。 -O, --export-options=optionsstring 是由空格分隔的 optionsstring 对列表。允许的参数名称和值特定于导出器,如下所述。可以指定多个参数

在我的测试过程中,如果我指定带有 parameter=value 扩展名的输出文件,-O 选项将被忽略。但是如果我使用 .csv 那么它们工作正常。 我没有涵盖所有这些,我只是在解释,所以如果你想了解更多细节,请阅读手册页。但您可以在 .txt 中提供的一些选项如下:

  • optionsstring:工作表的名称。您可以对多张纸重复此选项。在我的测试中,使用索引不起作用。

  • sheet:如果你想要一个真正的逗号分隔值文件,那么我们需要使用逗号。

  • separator:我将使用 format bc 我想要未格式化的值。如果您需要一些特殊的日期等内容,请阅读手册页。

  • raw:何时引用值。可以是 quoting-modealwaysauto。如果您想尽可能模仿 LibreOffice,请选择 never

那么让我们进入一个终端。

never