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

And*_*rey 3 csv xls libreoffice

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

libreoffice --headless --convert-to csv --outdir /tmp /tmp/test.xls
Run Code Online (Sandbox Code Playgroud)

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

有没有办法通过 LibreOffice 保存它?

zpa*_*win 5

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

首先,LibreOffice仍然只允许您保存第一张工作表。如果这就是您所需要的,那么请尝试libreoffice --convert-to csv Test.ods。有趣的是,GUI 执行相同的操作 - 只允许您导出活动工作表。因此,并不是说终端被忽视得太多,而只是 LibreOffice 中的一个限制。

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

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

首先,如果您只想在不提前知道工作表名称的情况下提取一张工作表,那么这是行不通的。如果您确实提前或知道工作表名称,或者可以提取所有工作表,那么此方法效果相当好。工作表名称可用于创建输出文件,因此它不会完全丢失,这也很好。

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

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

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:我将使用rawbc 我想要未格式化的值。如果您需要一些特殊的日期等内容,请阅读手册页。

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

让我们到一个终端。

# install gnomic on fedora
$ sudo dnf install -y gnumeric
 
# install gnomic on ubuntu/mint/debian
$ sudo apt-get install -y gnumeric

# use the ssconvert util from gnumeric to do the conversion
# let it do the default quoting - this will NOT match LibreOffice
# in this example, I am just exporting 1 named sheet using
#   -S, --export-file-per-sheet
$ ssconvert -S -O 'sheet=mysheet2' Test.ods test_a_%s.csv
$ ls *.csv
  test_a_mysheet2.csv
 
# same thing but more closely mimicking LibreOffice output
$ ssconvert -S -O 'sheet=mysheet2 separator=, format=raw quoting-mode=never' Test.ods test_b_%s.txt;
$ mv test_b_mysheet2.txt test_b_mysheet2.csv;

# Q: But what if I don't know the sheet names?
# A: then you'll need to export everything
# notice the 'sheet' option is removed from the
# list of -O options vs previous command
$ ssconvert -S -O 'separator=, format=raw quoting-mode=never' Test.ods test_c_%n_%s.txt;
$ ls test_c*
  test_c_0_mysheet.txt    test_c_3_yoursheet2.txt
  test_c_1_mysheet2.txt   test_c_4_yoresheet.txt
  test_c_2_yoursheet.txt  test_c_5_holysheet.txt
  
# Now to rename all those *.txt files to *.csv
$ prename 's/\.txt/\.csv/g' test_c_*.txt
$ ls test_c*
  test_c_0_mysheet.csv    test_c_3_yoursheet2.csv
  test_c_1_mysheet2.csv   test_c_4_yoresheet.csv
  test_c_2_yoursheet.csv  test_c_5_holysheet.csv
  
Run Code Online (Sandbox Code Playgroud)