Converter xlsx em csv no Linux com linha de comando

266

Estou procurando uma maneira de converter arquivos xlsx para arquivos csv no Linux.

Eu não quero usar PHP / Perl ou algo assim, já que estou olhando para processar vários milhões de linhas, então preciso de algo rápido. Encontrei um programa nos repositórios Ubuntu chamado xls2csv, mas ele converterá apenas arquivos xls (Office 2003) (que estou usando atualmente), mas preciso de suporte para os arquivos mais recentes do Excel.

Alguma ideia?

user1390150
fonte
10
Pensando que nada implementado com uma linguagem de script vai ser lento por natureza parece ... um pouco equivocada, particularmente desde que as bibliotecas interessantes nesses idiomas tendem a ter backends escritos em C.
Charles Duffy
2
O Excel costumava ser limitado a 65536 linhas. Agora são 1.048.576 ( support.microsoft.com/kb/120596 ). vai ser difícil encaixar "cortar milhões de linhas" nele. apenas dizendo ...
Pavel Veller
1
O @Pavel pode estar sobre vários arquivos.
Charles Duffy
2
... pessoalmente, eu faria isso usando a biblioteca xlsv para Python, mas como as abordagens baseadas em script são descritas como fora de questão ... encolho de ombros . (Como é que é uma questão de programação, se ferramentas programáticas são excluídos da resposta?)
Charles Duffy
1
@CharlesDuffy Atualmente, estou usando uma biblioteca PHP para fazer isso, e o que leva xls2csv 1 segundo para fazer leva php 10 minutos para fazer. Literalmente.
User1390150

Respostas:

239

O aplicativo de planilha Gnumeric vem com um utilitário de linha de comando chamado ssconvert, que pode converter entre vários formatos de planilha:

$ 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

Para instalar no Ubuntu:

apt-get install gnumeric

Para instalar no Mac:

brew install gnumeric
jmcnamara
fonte
19
Realmente o método mais fácil de converter planilhas. Combinado com um script bash, ele permite processar vários arquivos em lote. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneO método LibreOffice provavelmente poderia processar outros formatos, mas eu não consegui fazê-lo funcionar (ele simplesmente abriria um arquivo em branco toda vez, mesmo com o --headlessargumento).
Sleblanc
6
@sebleblanc Não é muito fácil. A instalação é um problema devido ao número de dependências (se você estiver fazendo isso em um servidor sem cabeça). Até agora gcc, intltool, zlib-devel, GTK ... GTK requer glib, atk, pango, cairo, cairo-objeto, gdk-pixbuf-2.0 ...
andrewtweber
11
Eu consegui instalá-lo em um servidor debian sem cabeça com apt-get install gnumeric --no-install-recommends. A única desvantagem é que ele dispara muitos avisos GConf-WARNING **: O cliente não conseguiu se conectar ao daemon D-BUS durante a execução. Um simples ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1fará o truque.
Benjamin Delichere 18/03/2014
7
Para gravar em csv, convém que o -Ssinalizador escreva várias folhas. Cada um vai para seu próprio arquivo.
Ed Avis
5
@hhh A opção separadora funciona apenas com o tipo de exportação txt. Você pode usar isso para impressão na saída padrão: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic 5/09/17
135

Você pode fazer isso com o LibreOffice:

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

Por razões que não estão claras para mim, você pode precisar executar isso com o sudo. Você pode fazer o LibreOffice funcionar com o sudo sem exigir uma senha, adicionando esta linha ao seu arquivo sudoers:

users ALL=(ALL) NOPASSWD: libreoffice
spiffytech
fonte
35
como eu diria ao libreoffice que eu quero a segunda folha?
dmeu
30
Permitir que o sudo libreoffice para todos sem senha está abrindo uma lata de worms. Por favor, cuidado com as consequências, incluindo a possibilidade de aquisição de permissões de root em uma plataforma multi-usuário
Interarticle
5
isso funcionou para mim (sudo não é necessário). Minha versão: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein
5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenametrabalhou no OS X para mim.
Nobu
12
Para converter em utf-8, preservando caracteres não-ascii, use em seu lugar --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Consulte o wiki do escritório aberto para obter detalhes.
Aryeh Leib Taurog
132

Se você já possui um ambiente de área de trabalho, tenho certeza que o Gnumeric / LibreOffice funcionaria bem, mas em um servidor sem cabeça (como o Amazon Web Services), eles exigem dezenas de dependências que você também precisa instalar.

Eu encontrei esta alternativa Python:

https://github.com/dilshod/xlsx2csv

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

Demorou 2 segundos para instalar e funciona como um encanto.

Se você tiver várias planilhas, poderá exportar todas de uma vez ou uma de cada vez:

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

Ele também vincula a várias alternativas criadas em Bash, Python, Ruby e Java.

andrewtweber
fonte
Funciona muito bem, mas posso executar apenas como 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'). Agora que penso nisso, recebi o mesmo erro com csvkit.
User2105469
2
.... estava trabalhando muito bem para mim e permitindo a extração de cada folha para arquivos individuais usando a opção -s - onde libreoffice não foi capaz de lidar com o tamanho da folha, xlsx2csv não tinha problemas
Soren
Obrigado! Muito conveniente no ubuntu.
Zhuguowei 16/11/2015
5
No Debian e no Ubuntu há o xlsx2csvpacote, então você não precisa instalá-lo manualmente, easy_installmas pode usar o seu gerenciador de pacotes.
Josch
No MacOS, você precisará de umsudo easy_install xlsx2csv
Frank Hintsch
32

No bash, usei este comando libreoffice para converter todos os meus arquivos xlsx no diretório atual:

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

Ele cuida dos espaços no nome do arquivo.

Tentei novamente alguns anos depois, e não funcionou. Este tópico fornece algumas dicas, mas a solução mais rápida foi executar como root (ou executar umsudo libreoffice ). Não é elegante, mas rápido.

Use o comando scalc.exe no Windows

Neves
fonte
13
Certifique-se de fechar todas as janelas do openoffice antes de tentar isso, pois, caso contrário, falhará silenciosamente.
Tacone
Além disso, no Windows, o comando é scalc.exemelhor que libreoffice. Trabalhou para mim hoje na versão atual estável do LO.
AronVanAmmers
31

Use csvkit

in2csv data.xlsx > data.csv

Para detalhes, verifique seus excelentes documentos

Holger Brandl
fonte
8

Outra opção seria usar R através de um pequeno invólucro de bash por conveniência:

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
Holger Brandl
fonte
8

Se o .xlsxarquivo tiver muitas planilhas, o -ssinalizador poderá ser usado para obter a planilha desejada. Por exemplo:

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

second_sheet.csvconteria dados da 2ª folha em my_file.xlsx.

Akavall
fonte
5

Usando o aplicativo de planilha Gnumeric que vem, um utilitário de linha de comando chamado ssconvert é realmente super simples:

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

e pronto!

Pascal-Louis Perez
fonte
Muito útil e Obrigado Mr.Pascal-Louis Perez
Karthickkumar Nagaraj
1
Acima do comando 'ssconvert', apenas converta 65536 linhas, mas tenho mais de uma sem linhas. Você pode me ajudar?
Karthickkumar Nagaraj
4

Se você estiver OK para executar a linha de comando Java, poderá fazê-lo com o Excel Extractor do Apache POI HSSF . Ele tem um mainmétodo que diz ser o extrator de linha de comando . Este parece apenas despejar tudo. Eles apontam para este exemplo que se converte em CSV . Você precisaria compilá-lo antes de poder executá-lo, mas ele também possui ummain método, portanto você não precisará codificar muito por si só para fazê-lo funcionar.

Outra opção que pode funcionar, mas exigirá algum trabalho do outro lado, é fazer com que seus arquivos do Excel cheguem até você como Dados XML do Excel ou Planilha XML do que a MS chamar nesse formato hoje em dia. Isso abrirá um novo mundo de oportunidades para você cortar e cortar da maneira que desejar.

Pavel Veller
fonte
1
Você sabe se isso também suporta .xlsx?
dimroc
1

Como outros disseram, libreofficepode converter arquivos xls para csv. O problema para mim foi a seleção da folha.

Esse script Python do libreoffice faz um bom trabalho na conversão de uma única planilha para CSV.

O uso é:

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

A única desvantagem (do meu lado) é que --headlessparece não funcionar. Eu tenho uma janela LO que aparece por um segundo e sai.
Tudo bem para mim, é a única ferramenta que faz o trabalho rapidamente.

Benoit Duffez
fonte