根据列表将 .xls/.xlsx 电子表格转换为多个 .csv

根据列表将 .xls/.xlsx 电子表格转换为多个 .csv

我需要将单个 .xls/.xlsx 文件的所有工作表转换为 .csv。这将对所有目录和子目录中的所有 .xls 文件执行(递归)。

步骤1:使用以下命令将所有 .xls 的 sheetname 转换为 .csv:

for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done

filename-sheetnames-list.csv可以作为列表:

sheetname1
sheetname2
sheetname3

第2步:使用 in2csv 将特定工作表转换为 .csv 的代码是:

in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv

如何获取 .xls/x 中的每个工作表名称,并为包含 .xls/x 的所有目录分别写入每个工作表?

in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv ....仅在 sheet1.csv 上提供输出,不确定如何从中获取所有工作表。

答案1

您可以将一个循环放在另一个循环内。

为避免错误,请勿使用for结果find

while IFS= read -r file; do
    while IFS= read -r sheet; do
        in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
    done < <(in2csv -n "$file")
done < <(find . -name '*.xls' -o -name '*.xlsx')

答案2

跳过 find 并使用 bash:

shopt -s globstar  # enable recursive globbing
for f in **/*.xls{,x}  # for files ending in .xls or .xlsx
do
    in2csv -n "$f" |   # get the sheetnames
      xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
done

答案3

csvkit 版本 > 1.0.2具有内置函数来写入所有工作表:

--write-sheets: WRITE_SHEETS
                      The names of the Excel sheets to write to files, or
                      "-" to write all sheets.

因此您可以尝试以下操作:

find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} \;

笔记:

这似乎没有 100% 按照预期工作。但值得一试,因为这是第一个带有该选项的版本,也许在未来的版本中实现会更好/更容易。

答案4

使用Gnumeric

ssconvert -S filename.xlsx filename.csv

csv每张纸获取一个文件。

相关内容