Преобразование xlsx в csv в командной строке linux

Я ищу способ конвертировать xlsx файлы в файлы csv в linux, я не хочу использовать PHP/Perl или что-то в этом роде, так как я ищу обработку нескольких миллионов строк, поэтому мне нужно что-то быстрое, Я нашел программу в репозитории ubuntu под названием xls2csv, но он будет преобразовывать только файлы xls (Office 2003) (которые я использую в настоящее время), но мне нужно добавить поддержку новых файлов excel, любых идей?

Ответ 1

Приложение Gnumeric поставляется с утилитой командной строки, называемой ssconvert, который может конвертировать между различными форматами электронных таблиц:

$ ssconvert Book1.xlsx newfile.csv
Using exporter Gnumeric_stf:stf_csv

$ cat newfile.csv 
Foo,Bar,Baz
1,2,3
123.6,7.89,
2012/05/14,,
The,last,Line

Для установки на Ubuntu:

apt-get install gnumeric

Для установки на Mac:

brew install gnumeric

Ответ 2

Вы можете сделать это с помощью LibreOffice:

libreoffice --headless --convert-to csv $filename --outdir $outdir

По непонятным мне причинам, возможно, потребуется запустить это с помощью sudo. Вы можете заставить LibreOffice работать с sudo, не требуя пароля, добавив эту строку в файл sudoers:

users ALL=(ALL) NOPASSWD: libreoffice

Ответ 3

Если у вас уже есть рабочая среда, то я уверен, что Gnumeric/LibreOffice будет работать хорошо, но на безголочном сервере (например, Amazon Web Services) им потребуются десятки зависимостей, которые также необходимо установить.

Я нашел эту альтернативу Python:

https://github.com/dilshod/xlsx2csv

$ easy_install xlsx2csv
$ xlsx2csv file.xlsx > newfile.csv

Взял 2 секунды, чтобы установить и работает как шарм.

Если у вас есть несколько листов, вы можете экспортировать все одновременно или по одному:

$ xlsx2csv file.xlsx --all > all.csv
$ xlsx2csv file.xlsx --all -p '' > all-no-delimiter.csv
$ xlsx2csv file.xlsx -s 1 > sheet1.csv

Он также ссылается на несколько альтернатив, построенных в Bash, Python, Ruby и Java.

Ответ 4

Используйте csvkit

in2csv data.xlsx > data.csv

Подробнее об их отличных docs

Ответ 5

В bash я использовал эту команду libreoffice для преобразования всех моих xlsx файлов в текущий каталог:

for i   in *.xlsx; do  libreoffice --headless --convert-to csv "$i" ; done

Он обрабатывает пробелы в имени файла.

Повторил еще несколько лет спустя, и это не сработало. Этот поток дает несколько советов, но самым быстрым решением было запустить его как root (или запустить sudo libreoffice). Не элегантный, но быстрый.

Используйте команду scalc.exe в Windows

Ответ 6

Другой вариант - использовать R через небольшую обертку bash для удобства:

xlsx2txt(){
echo '
require(xlsx)
write.table(read.xlsx2(commandArgs(TRUE)[1], 1), stdout(), quote=F, row.names=FALSE, col.names=T, sep="\t")
' | Rscript --vanilla - $1 2>/dev/null
}

xlsx2txt file.xlsx > file.txt

Ответ 7

Если в файле .xlsx имеется много листов, для получения нужного вам листа можно использовать флаг -s. Например:

xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv

second_sheet.csv будет содержать данные второго листа в my_file.xlsx.

Ответ 8

Если вы в состоянии запустить командную строку Java, вы можете сделать это с помощью Apache POI HSSF Excel Extractor. Он a main метод, который говорит, что это экстрактор командной строки. Кажется, это просто сваливает все. Они указывают на этот пример, который преобразуется в CSV. Вам нужно будет скомпилировать его, прежде чем вы сможете его запустить, но он также имеет метод main, поэтому вам не нужно делать много кодирования, чтобы заставить его работать.

Другой вариант, который может лететь, но потребует некоторой работы на другом конце, - сделать ваши файлы Excel доступными вам как данные Excel XML или XML-таблица любых вызовов MS, которые форматируются в эти дни. Он откроет целый новый мир возможностей для вас, чтобы вырезать и нарезать его так, как вы хотите.

Ответ 9

Используя приложение Gnumeric, которое приходит, которое утилита командной строки ssconvert действительно супер проста:

find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;

и все готово!

Ответ 10

Как говорили другие, libreoffice может конвертировать xls файлы в csv. Проблема для меня - выбор листа.

Этот libreoffice Python script отлично справляется с преобразованием одного листа в CSV.

Использование:

./libreconverter.py File.xls:"Sheet Name" output.csv

Единственный недостаток (на моем конце) заключается в том, что --headless, похоже, не работает. У меня есть окно LO, которое отображается на секунду, а затем завершается.
Это хорошо со мной, это единственный инструмент, который быстро выполняет эту работу.

Ответ 11

Вы можете попробовать таблицу Open/LibreOffice. Это не инструмент командной строки, но есть хорошие шансы, что они будут поддерживать xlsx. См. www.libreoffice.org/features/calc/. Он упоминает поддержку xlsx.