Перетворити xlsx в CSV в Linux за допомогою командного рядка


266

Я шукаю спосіб перетворення xlsx-файлів у CSV-файли в Linux.

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

Будь-які ідеї?


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 хвилин. Буквально.
користувач1390150

Відповіді:


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

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прапор написав кілька аркушів. Кожен переходить у свій файл.
Ed Avis,

5
@hhh Параметр роздільника працює лише з типом експорту txt. Ви можете використовувати це для друку для stdout : ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic

135

Це можна зробити за допомогою LibreOffice:

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

З незрозумілих мені причин, можливо, вам доведеться запустити це з судо. Ви можете змусити LibreOffice працювати з sudo, не вимагаючи пароля, додавши цей рядок до файлу sudoers:

users ALL=(ALL) NOPASSWD: libreoffice

35
як я можу сказати libreoffice, що хочу другий аркуш?
dmeu

30
Дозволити sudo для звільнення для всіх, хто не має пароля, це відкрити банку з хробаками. Будьте обачні про наслідки, включаючи можливість отримання дозволів root на багатокористувацькій платформі
Interarticle

5
це працювало для мене (судо не потрібно). Моя версія: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein

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". Докладніше див. У вікі на відкритому офісі .
Aryeh Leib Taurog

132

Якщо у вас вже є середовище Desktop, я впевнений, що 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.
користувач2105469

2
.... Підходив для мене чудово і дозволяв витягувати кожен аркуш до окремих файлів за допомогою опції -s - де libreoffice не зміг обробити розмір аркуша, xlsx2csv не мав проблем
Soren

Дякую! Дуже зручно в ubuntu.
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 (або виконати a sudo libreoffice). Не елегантно, але швидко.

Використовуйте команду scalc.exe в Windows


13
Переконайтесь, що ви закриєте всі вікна відкриття, перш ніж намагатися це зробити, оскільки в іншому випадку це мовчки не вийде.
tacone

Також у Windows команда scalc.exeшвидше, ніж libreoffice. Сьогодні працював для мене на поточній стабільній версії LO.
AronVanAmmers


8

Іншим варіантом було б використовувати R для невеликої баш-обгортки для зручності:

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.


5

Використання програми Gnumeric для електронних таблиць, яка приходить, утиліта командного рядка під назвою ssconvert справді дуже проста:

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

і ви закінчили!


Дуже корисно і спасибі, пан Паскаль-Луї Перс
Картіккумар Нагарадж

1
Вище команда 'ssconvert' конвертує лише 65536 рядків, але у мене більше одного бракує рядків. Чи можете ви мені допомогти?
Karthickkumar Nagaraj

4

Якщо ви готові запустити командний рядок Java, ви можете зробити це за допомогою Excel Extractor Apache POI HSSF . Він має в mainметод , який говорить, що командний рядок екстрактор . Цей, здається, просто скидає все. Вони вказують на цей приклад, який перетворюється на CSV . Вам потрібно буде скомпілювати його, перш ніж запустити його, але він також має mainметод, тому вам не потрібно робити багато кодування як таке, щоб змусити його працювати.

Інший варіант, який може летіти, але потребуватиме певної роботи з іншого кінця, - це змусити ваші файли Excel прийти до вас як XML-дані Excel або електронна таблиця XML будь-якого виклику MS, який форматується в ці дні. Це відкриє для вас цілий новий світ можливостей, щоб нарізати і порізати так, як вам захочеться.


1
Чи знаєте ви, чи це також підтримує .xlsx?
dimroc

1

Як говорили інші, libreofficeможна конвертувати файли xls в CSV. Проблемою для мене був вибір аркуша.

Цей сценарій libreoffice Python прекрасно справляється з перетворенням одного аркуша в CSV.

Використання:

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

Єдиний недолік (на моєму кінці) - це --headless, здається, не працює. У мене є вікно LO, яке з’являється на секунду, а потім закривається.
Зі мною все гаразд, це єдиний інструмент, який швидко виконує роботу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.