Преобразуйте .xls/.xlsx электронные таблицы в несколько .csv's на основе списка

Я должен преобразовать все листы единственного .xls/.xlsx файла к .csv. Это будет сделано на всех .xls файлах во всех каталогах и подкаталогах (рекурсивно).

Шаг 1: Получите sheetnames всего .xls в использование .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: код для преобразования определенного листа в .csv, использующий in2csv:

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

Как я могу получить каждый sheetname в .xls/x и записать каждый лист отдельно для всех каталогов, содержащих .xls/x?

in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv .... дает вывод только на sheet1.csv, не уверенном, как получить все листы от этого.

8
задан 8 November 2017 в 06:30

4 ответа

Можно просто поместить цикл в другом цикле.

Для предотвращения ошибок не использовать 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')
8
ответ дан 23 November 2019 в 05:27

версия 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% как ожидалось. Но стоящий попытки и поскольку это - первая версия с той опцией, возможно, в будущих версиях, реализация лучше/легче.

2
ответ дан 23 November 2019 в 05:27

Пропуск находит и использующий удар:

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
6
ответ дан 23 November 2019 в 05:27

Использовать Gnumeric:

ssconvert -S filename.xlsx filename.csv

получить тот csv файл на лист.

0
ответ дан 23 November 2019 в 05:27

Другие вопросы по тегам:

Похожие вопросы: