Конвертируйте xlsx в csv в Linux с помощью командной строки

266

Я ищу способ конвертировать xlsx файлы в csv файлы в Linux.

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

Любые идеи?

user1390150
источник
10
Думать, что что-либо, реализованное с помощью языка сценариев, будет медленным по своей природе, кажется ... немного ошибочным, особенно потому, что интересные библиотеки на этих языках, как правило, имеют бэкенды, написанные на C.
Чарльз Даффи
2
Раньше Excel был ограничен 65536 строками. Теперь это 1 048 576 ( support.microsoft.com/kb/120596 ). это будет трудно вписать в него «разорвать миллионы строк». просто говорю ...
Павел Веллер
1
@Pavel может содержать несколько файлов.
Чарльз Даффи
2
... лично я бы сделал это, используя библиотеку xlsv для Python, но поскольку подходы, основанные на сценариях, описаны как не подлежащие обсуждению ... пожимают плечами . (Как это вопрос программирования, если программные инструменты исключены из ответа?)
Чарльз Даффи
1
@CharlesDuffy В настоящее время я использую библиотеку PHP для этого, и то, что для выполнения xls2csv требуется 1 секунда, занимает php 10 минут. Буквально.
user1390150

Ответы:

239

Приложение электронных таблиц 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
jmcnamara
источник
19
Действительно самый простой способ преобразования электронных таблиц. В сочетании с bash-скриптом он позволит вам обрабатывать несколько файлов в пакетном режиме. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneМетод LibreOffice, вероятно, мог обрабатывать другие форматы, но я не мог заставить его работать (он просто открывал пустой файл каждый раз, даже с --headlessаргументом).
sleblanc
6
@sebleblanc Не совсем без проблем. Установка является трудной задачей, учитывая количество зависимостей (если вы делаете это на автономном сервере). Пока gcc, intltool, zlib-devel, GTK ... GTK требуется glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber
11
Мне удалось установить его на безголовый сервер Debian с apt-get install gnumeric --no-install-recommends. Единственным недостатком является то, что он выдает много предупреждений. GConf-WARNING **: Клиенту не удалось подключиться к демону D-BUS во время работы. Простой ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1сделает свое дело.
Бенджамин Делихер,
7
Для записи в CSV вы можете захотеть, чтобы -Sфлаг писал несколько листов. Каждый идет в свой файл.
Эд Авис
5
@hhh Опция разделителя работает только с типом экспорта txt. Вы можете использовать эту функцию для печати на стандартный вывод: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
Exic
135

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

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

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

users ALL=(ALL) NOPASSWD: libreoffice
spiffytech
источник
35
как мне сказать libreoffice, что я хочу второй лист?
13:30
30
Разрешение sudo в libreoffice для всех без пароля открывает банку с червями. Пожалуйста, остерегайтесь последствий, в том числе возможности получения прав root на многопользовательской платформе
статья
5
это сработало для меня (sudo не требуется). Моя версия: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Брэд Хейн
5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenameработал на OS X для меня.
Нобу
12
Для преобразования в utf-8, сохраняя не-ascii символы, используйте вместо этого --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". См. Вики открытого офиса для деталей.
Арье Лейб Таурог
132

Если у вас уже есть среда рабочего стола, то я уверен, что 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.

andrewtweber
источник
Прекрасно работает, но я могу запустить только как sudo ( IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/prettytable-0.7.2-py2.7.egg/EGG-INFO/top_level.txt'). Теперь, когда я думаю об этом, я получил ту же ошибку с csvkit.
user2105469
2
.... Работал отлично для меня и позволял извлекать каждый лист в отдельные файлы, используя опцию -s - там, где libreoffice не смог обработать размер листа, у xlsx2csv не было проблем
Сорен
Спасибо! Очень удобно в убунту.
Zhuguowei
5
В Debian и Ubuntu есть xlsx2csvпакет, поэтому вам не нужно устанавливать его вручную, easy_installно вы можете использовать менеджер пакетов.
Йош
На MacOS вам понадобитсяsudo easy_install xlsx2csv
Франк Хинч
32

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

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

Он заботится о пробелах в имени файла.

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

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

Невиш
источник
13
Убедитесь, что вы закрыли все окна openoffice, прежде чем пытаться это сделать, иначе в противном случае произойдет сбой.
Такон
Кроме того, в Windows, команда, scalc.exeа не libreoffice. У меня сегодня работала на текущей стабильной версии LO.
AronVanAmmers
8

Другой вариант - для удобства использовать 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
Хольгер Брандл
источник
8

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

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

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

Akavall
источник
5

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

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

и вы сделали!

Паскаль-Луи Перес
источник
Очень полезно и спасибо, г-н Паскаль-Луи Перес
Картиккумар Нагарадж
1
Выше команды 'ssconvert' конвертируйте только 65536 строк, но у меня более одной строки не хватает, вы можете мне помочь?
Картиккумар Нагарадж
4

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

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

Павел Веллер
источник
1
Вы знаете, поддерживает ли это также .xlsx?
dimroc
1

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

Этот скрипт Python libreoffice отлично справляется с конвертацией одного листа в CSV.

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

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

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

Бенуа Даффез
источник