Вопрос по xlsx, linux, converter, csv, excel – Конвертируйте xlsx в csv в Linux с помощью командной строки

205

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

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

Есть идеи?

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

Ваш Ответ

11   ответов
7

Другой вариант - использовать 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
0

Как говорили другие,libreoffice может конвертировать XLS файлы в CSV. Для меня проблемой был выбор листа.

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

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

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

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

24

использованиеcsvkit

in2csv data.xlsx > data.csv

Для деталей проверьте их отличнодокументы

117

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

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

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

users ALL=(ALL) NOPASSWD: libreoffice
это сработало для меня (sudo не требуется). Моя версия: libreoffice-calc-3.6.7.2-4.fc18.x86_64
как мне сказать libreoffice, что я хочу второй лист?
Разрешение sudo на libreoffice для всех без пароля открывает банку с червями. Пожалуйста, остерегайтесь последствий, в том числе возможности получения root-прав на многопользовательской платформе.
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename работал на OS X для меня.
Чтобы преобразовать в utf-8, сохраняя не-ascii символы, используйте вместо--convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1", Увидетьopen office wiki для деталей.
4

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

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

и все готово!

Над командой "ssconvert" только конвертируйте 65536 строк, но у меня более одной строки не хватает, вы можете мне помочь?
Очень полезно и спасибо мистер Паскаль-Луи Перес
99

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

Хорошо .. работал очень хорошо
Работает отлично, но я могу запустить только как 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.
.... Работал отлично для меня и позволял извлекать каждый лист в отдельные файлы, используя опцию -s - там, где libreoffice не смог обработать размер листа, у xlsx2csv не было проблем
В Debian и Ubuntu естьxlsx2csv пакет, поэтому вам не нужно вручную устанавливать его черезeasy_install но можете использовать свой менеджер пакетов.
Спасибо! Очень удобно в убунту.
186

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

To install on Ubuntu:

apt-get install gnumeric

To install on Mac:

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

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

25

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

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

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

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

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

работал как шарм, спасибо :)
Кроме того, в Windows командаscalc.exe скорее, чемlibreoffice, У меня сегодня работала на текущей стабильной версии LO.
Убедитесь, что вы закрыли все окна openoffice, прежде чем пытаться это сделать, иначе в противном случае произойдет сбой.
Спасибо! Я пытался много раз, до сих пор нет CSV генерируется.
3

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

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

Вы знаете, поддерживает ли это также .xlsx?
7

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

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

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

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