Converter um arquivo .xlsx (MS Excel) em .csv na linha de comando com campos separados por ponto e vírgula

31

Percebo que essa não é uma questão totalmente unix / linux. Mas como isso é algo que farei no linux, espero que alguém tenha uma resposta.

Eu tenho um arquivo excel online ( .xlsx) que é atualizado periodicamente (por outra pessoa). Eu quero escrever um script e colocá-lo como um cronjob para processar essa planilha do excel. Mas, para fazer isso, preciso convertê-lo em um arquivo de texto (então a .csv) com colunas separadas por ponto e vírgula. Infelizmente, não pode ser separado por vírgula, pois algumas colunas possuem vírgulas. É possível fazer essa conversão do shell? Eu tenho o Open Office instalado e posso fazer isso usando sua GUI, mas quero saber se é possível fazer isso na linha de comando. Obrigado!

PS: Eu também tenho uma máquina Mac; portanto, se alguma solução puder funcionar lá, isso também será bom. :)

allrite
fonte

Respostas:

21

O OpenOffice vem com o programa unoconv para realizar conversões de formato na linha de comando.

unoconv -f csv filename.xlsx

Para requisitos mais complexos, você pode analisar arquivos XLSX Spreadsheet::XLSXno Perl ou openpyxlno Python. Por exemplo, aqui está um script rápido para imprimir uma planilha como um arquivo CSV separado por ponto e vírgula (aviso: não testado, digitado diretamente no 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- parar de ser mau'
fonte
O unoconv não veio com o meu OO, mas eu o instalei e ele funciona muito bem (converte para arquivo separado por vírgula, embora sem ponto-e-vírgula)! Obrigado! Ainda precisarei descobrir como obter meus campos que contêm vírgulas. Mas obrigado de qualquer maneira.
allrite
@ allrite Oh, eu tinha perdido o requisito de ponto e vírgula como separadores. Minha sugestão para fazer o processamento em Python ou Perl ainda permanece. Mas também adicionei um script (não testado) para converter em CSV ;como separador.
Gilles 'SO- stop be evil'
Obrigado! Usei Spreadsheet :: XLSX, mas usei o código no link CPAN que você forneceu. Funciona :)
allrite
1
Um usuário anônimo teve problemas com isso
Michael Mrozek
9

https://github.com/dilshod/xlsx2csv

Funcionou bem para mim. Um arquivo XLSX de 85 MB foi convertido em cerca de 3 minutos em um SSD do Mac Book Pro.

Bohumir Zamecnik
fonte
1
Funcionou bem no OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvfuncionou bem e a capacidade de definir o deliminador, obrigado +!
Hhh
6

Estou usando o xls2csv do Perl para converter xlsarquivos em csv.

Não tenho certeza se funciona com isso xlsxtambém.

Sobre:

Infelizmente, não pode ser separado por vírgula, pois algumas colunas possuem vírgulas.

é por isso que a citação foi introduzida:

1,2,"data,data, more data"
neurino
fonte
obrigado pela dica, vou tentar isso. Eu ainda prefiro o ponto e vírgula separado, pois após a conversão do csv, o arquivo passa por awkscripts. E é mais fácil passar ponto e vírgula como o separador de campos awk. Eu poderia procurar vírgulas entre aspas para substituí-los com outra coisa ... agora que é uma outra questão :)
allrite
Obrigado @neurino. Eu usei o método Gilles, mas obrigado pela resposta de qualquer maneira.
allrite
1

Eu uso PHP. Basta instalar a biblioteca PHPExel em http://phpexcel.codeplex.com/ e provavelmente você também precisará de funções XML.

Este é o meu 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));
?>

Você pode reverter o processo ou usar diferentes formatos Excel / CSV. Veja os diferentes arquivos php no diretório PHPExcel.

magilda
fonte