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

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

No quiero usar PHP / Perl ni nada de eso ya que estoy buscando procesar varios millones de líneas, así que necesito algo rápido. Encontré un progtwig en los repositorys 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?

La aplicación de hoja de cálculo Gnumeric viene con una utilidad de línea de comandos 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 

Puedes hacer esto con LibreOffice:

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

Por razones que no tengo claras, es posible que deba ejecutar esto con sudo. Puede hacer que LibreOffice trabaje con sudo sin requerir una contraseña agregando esta línea a su archivo sudoers:

 users ALL=(ALL) NOPASSWD: libreoffice 

Si ya tiene un entorno de Escritorio, 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 de Python:

https://github.com/dilshod/xlsx2csv

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

Tomó 2 segundos para instalar y funciona como un encanto.

Si tiene varias hojas, puede exportar 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 enlaza con varias alternativas construidas en Bash, Python, Ruby y Java.

Use csvkit

 in2csv data.xlsx > data.csv 

Para detalles verifique sus excelentes documentos

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 

Cuida espacios en el nombre del archivo.

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

Use el comando scalc.exe en Windows

Otra opción sería usar R a través de un pequeño contenedor 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 

Si el archivo .xlsx tiene muchas hojas, se puede usar la bandera -s para obtener la hoja que desea. Por ejemplo:

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

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

Si está bien para ejecutar la línea de comandos de Java, puede hacerlo con Apache POI HSSF’s Excel Extractor . Tiene un método main que dice ser el extractor de línea de comandos . Este parece simplemente volcar todo. Señalan a este ejemplo que se convierte a CSV . Tendría que comstackrlo antes de poder ejecutarlo, pero también tiene un método main , por lo que no debería tener que hacer demasiada encoding para que funcione.

Otra opción que podría volar pero requerirá algo de trabajo en el otro extremo es hacer que sus archivos de Excel lleguen a usted como datos XML de Excel o hoja de cálculo XML de cualquier MS que llame ese formato actualmente. Te abrirá un nuevo mundo de oportunidades para que puedas cortarlo y cortarlo como quieras.

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

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

¡y tu estas listo!

Como otros dijeron, libreoffice puede 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 en CSV.

El uso es:

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

El único inconveniente (en mi extremo) es que – sin --headless no 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.

Puede probar la hoja de cálculo Open / LibreOffice. No es una herramienta de línea de comandos, pero hay una buena posibilidad de que sean compatibles con xlsx. Vea http://www.libreoffice.org/features/calc/ . Menciona el soporte xlsx.