Convierta un archivo .xlsx (MS Excel) a .csv en la línea de comando con campos separados por punto y coma

31

Me doy cuenta de que esta no es una pregunta totalmente relacionada con Unix / Linux. Pero como esto es algo que haré en Linux, espero que alguien tenga una respuesta.

Tengo un archivo de Excel en línea ( .xlsx) que se actualiza periódicamente (por otra persona). Quiero escribir un script y ponerlo como un cronjob para procesar esa hoja de Excel. Pero para hacer eso, necesito convertir eso en un archivo de texto (entonces a .csv) con columnas separadas por punto y coma. Desafortunadamente, no se puede separar por comas, ya que algunas columnas tienen comas. ¿Es posible hacer esta conversión desde shell? Tengo Open Office instalado y puedo hacer esto usando su GUI, pero quiero saber si es posible hacerlo desde la línea de comandos. ¡Gracias!

PD: También tengo una máquina Mac, así que si alguna solución puede funcionar allí, eso también es bueno. :)

todo bien
fuente

Respuestas:

21

OpenOffice viene con el programa unoconv para realizar conversiones de formato en la línea de comando.

unoconv -f csv filename.xlsx

Para requisitos más complejos, puede analizar archivos XLSX con Spreadsheet::XLSXPerl o openpyxlPython. Por ejemplo, aquí hay un script rápido para imprimir una hoja de trabajo como un archivo CSV separado por punto y coma (advertencia: no probado, escrito directamente en el navegador):

perl -MSpreadsheet::XLSX -e '
    $\ = "\n"; $, = ";";
    my $workbook = Spreadsheet::XLSX->new()->parse($ARGV[0]);
    my $worksheet = ($workbook->worksheets())[0];
    my ($row_min, $row_max) = $worksheet->row_range();
    my ($col_min, $col_max) = $worksheet->col_range();
    for my $row ($row_min..$row_max) {
        print map {$worksheet->get_cell($row,$_)->value()} ($col_min..$col_max);
    }
' filename.xlsx >filename.csv
Gilles 'SO- deja de ser malvado'
fuente
¡unoconv no vino con mi OO, pero lo instalé y funciona muy bien (se convierte en un archivo separado por comas, sin embargo, no con punto y coma)! ¡Gracias! Todavía tendré que descubrir cómo obtendré mis campos que contienen comas. Pero gracias de todos modos.
Allrite
@allrite Oh, me había perdido el requisito de punto y coma como separadores. Mi sugerencia para hacer el procesamiento en Python o Perl sigue en pie. Pero también he agregado un script (no probado) para convertir a CSV ;como separador.
Gilles 'SO- deja de ser malvado'
¡Gracias! Utilicé Spreadsheet :: XLSX, pero utilicé el código en el enlace de CPAN que proporcionó. Funciona :)
allrite
1
Un usuario anónimo tuvo problemas con esto
Michael Mrozek
9

https://github.com/dilshod/xlsx2csv

Funcionó bien para mí. Aproximadamente 85 MB de archivo XLSX convertido en aproximadamente 3 minutos en una Mac Book Pro SSD.

Bohumir Zamecnik
fuente
1
Funcionó bien en OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvfuncionó bien y la capacidad de definir el deliminador, gracias +!
hhh
6

Estoy usando xls2csv de Perl para convertir xlsarchivos csv.

No estoy seguro si funciona con xlsx.

Acerca de:

Desafortunadamente, no se puede separar por comas ya que algunas columnas tienen comas en ellas

por eso se ha introducido la cita:

1,2,"data,data, more data"
neurino
fuente
gracias por el consejo, lo intentaré. Todavía prefiero el punto y coma separados, ya que después de la conversión de CSV, el archivo pasa por awkscripts. Y es más fácil pasar el punto y coma como separador de campo awk. Podría buscar comas dentro de las comillas para reemplazarlas con algo más ... ahora esa es otra pregunta :)
Allrite
Gracias @neurino. En su lugar, utilicé el método Gilles, pero gracias por la respuesta de todos modos.
allrite
1

Yo uso PHP Simplemente instale la biblioteca PHPExel desde http://phpexcel.codeplex.com/ y probablemente también necesite funciones XML.

Este es mi código:

<?php

error_reporting(E_ALL);
date_default_timezone_set('Europe/London');

/** PHPExcel_IOFactory */

require_once '/home/markov/Downloads/1.7.6/Classes/PHPExcel/IOFactory.php';

$file="RIF394305.xlsx"; //PATH TO CSV FILE

// Check prerequisites

if (!file_exists($file)) {
    exit("Please run 06largescale.php first.\n");
}

$objReader = PHPExcel_IOFactory::createReader('Excel2003XML');

$objPHPExcel = $objReader->load($file);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');

$objWriter->save(str_replace('.xlsx', '.csv',$file));
?>

Puede revertir el proceso o usar un formato diferente de Excel / CSV. Mire los diferentes archivos php en el directorio PHPExcel.

magilda
fuente