Convierta xlsx a csv en Linux con línea de comando

266

Estoy buscando una manera de convertir archivos xlsx a archivos csv en Linux.

No quiero usar PHP / Perl ni nada de eso, ya que estoy tratando de procesar varios millones de líneas, por lo que necesito algo rápido. Encontré un programa en los repositorios de Ubuntu llamado xls2csv pero solo convertirá archivos xls (Office 2003) (que estoy usando actualmente) pero necesito soporte para los archivos más nuevos de Excel.

¿Algunas ideas?

usuario1390150
fuente
10
Pensar que cualquier cosa implementada con un lenguaje de scripting va a ser lento por naturaleza parece ... un poco equivocado, particularmente porque las bibliotecas interesantes en esos idiomas tienden a tener backends escritos en C.
Charles Duffy
2
Excel solía estar limitado a 65536 filas. Ahora son 1.048.576 ( support.microsoft.com/kb/120596 ). va a ser difícil colocar "cortar millones de líneas" en él. solo digo ...
Pavel Veller
1
@Pavel podría estar sobre varios archivos.
Charles Duffy
2
... personalmente, haría esto usando la biblioteca xlsv para Python, pero dado que los enfoques basados ​​en secuencias de comandos se describen como descartados ... encogerse de hombros . (¿Cómo es una pregunta de programación si las herramientas programáticas se excluyen de la respuesta?)
Charles Duffy
1
@CharlesDuffy Actualmente estoy usando una biblioteca PHP para hacer esto, y lo que toma xls2csv 1 segundo para hacer, toma php 10 minutos para hacerlo. Literalmente.
user1390150

Respuestas:

239

La aplicación de hoja de cálculo Gnumeric viene con una utilidad de línea de comando llamada ssconvert que puede convertir entre una variedad de formatos de hoja de cálculo:

$ 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 en Ubuntu:

apt-get install gnumeric

Para instalar en Mac:

brew install gnumeric
jmcnamara
fuente
19
Realmente el método más sencillo para convertir hojas de cálculo. Combinado con un script bash, le permitirá procesar por lotes múltiples archivos. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneEl método LibreOffice probablemente podría procesar otros formatos, pero no pude hacerlo funcionar (simplemente abriría un archivo en blanco cada vez, incluso con el --headlessargumento).
sleblanc
66
@sebleblanc No es muy fácil. La instalación es difícil dada la cantidad de dependencias (si está haciendo esto en un servidor sin cabeza). Hasta ahora gcc, intltool, zlib-devel, GTK ... GTK requiere glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber
11
Logré instalarlo en un servidor Debian sin cabeza con apt-get install gnumeric --no-install-recommends. El único inconveniente es que dispara muchas advertencias GConf-WARNING **: El cliente no pudo conectarse al daemon D-BUS durante la ejecución. Un simple ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1hará el truco.
Benjamin Delichere
77
Para escribir en csv es posible que desee que la -Sbandera escriba varias hojas. Cada uno va a su propio archivo.
Ed Avis
55
@hhh La opción de separador solo funciona con el tipo de exportación txt. Puede usar esta opción para imprimir la salida estándar: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic
135

Puedes hacer esto con LibreOffice:

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

Por razones que no me quedan claras, es posible que deba ejecutar esto con sudo. Puede hacer que LibreOffice funcione con sudo sin requerir una contraseña agregando esta línea al archivo de sudoers:

users ALL=(ALL) NOPASSWD: libreoffice
spiffytech
fuente
35
¿Cómo le diría a libreoffice que quiero la segunda hoja?
dmeu
30
Permitir que sudo a libreoffice para todos sin contraseña es abrir una lata de gusanos. Tenga cuidado con las consecuencias, incluida la posibilidad de adquirir permisos de root en una plataforma multiusuario
Interarticle
55
esto funcionó para mí (no se requiere sudo). Mi versión: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein
55
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenameTrabajé en OS X para mí.
Nobu
12
Para convertir a utf-8, preservando caracteres no ascii, use en su lugar --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Ver wiki de open office para más detalles.
Aryeh Leib Taurog
132

Si ya tiene un entorno de escritorio, entonces estoy seguro de que Gnumeric / LibreOffice funcionaría bien, pero en un servidor sin cabeza (como Amazon Web Services), requieren docenas de dependencias que también necesita instalar.

Encontré esta alternativa a Python:

https://github.com/dilshod/xlsx2csv

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

Tomó 2 segundos para instalar y funciona de maravilla.

Si tiene varias hojas, puede exportarlas todas a la vez, o una a la vez:

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

También se vincula a varias alternativas creadas en Bash, Python, Ruby y Java.

andrewtweber
fuente
Funciona muy bien, pero solo puedo ejecutarlo 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'). Ahora que lo pienso, recibí el mismo error csvkit.
user2105469
2
.... Estaba trabajando muy bien para mí y permitir la extracción de cada hoja a archivos individuales utilizando la opción -s - LibreOffice donde no era capaz de manejar el tamaño de la hoja, xlsx2csv tenía ningún problema
Soren
¡Gracias! Muy conveniente en ubuntu.
zhuguowei
55
En Debian y Ubuntu está el xlsx2csvpaquete, por lo que no necesita instalarlo manualmente, easy_installpero puede usar su administrador de paquetes.
josch
En MacOS necesitarás unsudo easy_install xlsx2csv
Frank Hintsch
32

En bash, utilicé este comando de libreoffice para convertir todos mis archivos xlsx en el directorio actual:

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

Se ocupa de espacios en el nombre del archivo.

Intenté nuevamente algunos años después, y no funcionó. Este hilo da algunos consejos, pero la solución más rápida fue ejecutar como root (o ejecutar a sudo libreoffice). No elegante, pero rápido.

Use el comando scalc.exe en Windows

neves
fuente
13
Asegúrese de cerrar todas las ventanas de oficina abierta antes de intentar esto, ya que de lo contrario fallará silenciosamente.
tacone
Además, en Windows, el comando es scalc.exemás que libreoffice. Trabajó para mí hoy en la versión LO estable actual.
AronVanAmmers
31

Use csvkit

in2csv data.xlsx > data.csv

Para más detalles, consulte sus excelentes documentos

Holger Brandl
fuente
8

Otra opción sería usar R a través de un pequeño envoltorio bash para mayor comodidad:

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
fuente
8

Si el .xlsxarchivo tiene muchas hojas, -sse puede usar la bandera para obtener la hoja que desea. Por ejemplo:

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

second_sheet.csvcontendría datos de la segunda hoja en my_file.xlsx.

Akavall
fuente
5

Usando la aplicación de hoja de cálculo Gnumeric que viene, una utilidad de línea de comandos llamada ssconvert es realmente súper simple:

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

¡y tu estas listo!

Pascal-Louis Perez
fuente
Muy útil y gracias Sr.Pascal-Louis Perez
Karthickkumar Nagaraj
1
El comando anterior 'ssconvert' solo convierte 65536 líneas, pero tengo más de una falta de líneas, ¿pueden ayudarme?
Karthickkumar Nagaraj
4

Si puede ejecutar la línea de comandos de Java, puede hacerlo con el Extractor de Excel de Apache POI HSSF . Tiene un mainmétodo que dice ser el extractor de línea de comando . Este parece simplemente deshacerse de todo. Señalan este ejemplo que convierte a CSV . Tendría que compilarlo antes de poder ejecutarlo, pero también tiene un mainmétodo, por lo que no debería tener que codificar mucho para que funcione.

Otra opción que puede volar pero requerirá algo de trabajo en el otro extremo es hacer que sus archivos de Excel lleguen a usted como Excel XML Data u XML Spreadsheet de lo que MS llame ese formato en estos días. Le abrirá un mundo completamente nuevo de oportunidades para que pueda cortarlo y cortarlo en dados de la manera que desee.

Pavel Veller
fuente
1
¿Sabes si esto también es compatible con .xlsx?
dimroc
1

Como otros dijeron, libreofficepuede convertir archivos xls a csv. El problema para mí fue la selección de la hoja.

Este script de Python de libreoffice hace un buen trabajo al convertir una sola hoja a CSV.

El uso es:

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

El único inconveniente (por mi parte) es que --headlessno parece funcionar. Tengo una ventana LO que aparece por un segundo y luego se cierra.
Eso está bien conmigo, es la única herramienta que hace el trabajo rápidamente.

Benoit Duffez
fuente