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

30

Eu percebo que isso não é uma questão inteiramente relacionada ao unix / linux. Mas como isso é algo que eu vou fazer no linux, espero que alguém tenha uma resposta.

Eu tenho um arquivo de 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 (portanto, .csv ) com colunas separadas por ponto-e-vírgula. Não pode ser separado por vírgula, infelizmente, porque algumas colunas têm 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 a partir da linha de comando. Obrigado!

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

    
por allrite 01.11.2011 / 04:45

4 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 com Spreadsheet::XLSX em Perl ou openpyxl em 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
    
por 01.11.2011 / 23:13
8

link

Trabalhei bem para mim. Cerca de 85 MB de arquivos XLSX convertidos em cerca de 3 minutos em um SSD do Mac Book Pro.

    
por 04.04.2013 / 19:02
6

Estou usando o xls2csv do Perl para converter xls arquivos em csv .

Não tenho certeza se funciona com xlsx também.

Sobre:

It can't be comma separated unfortunately since some columns have commas in them

é por isso que o quoting foi introduzido:

1,2,"data,data, more data"
    
por 01.11.2011 / 23:22
1

Eu uso PHP. Basta instalar a biblioteca PHPExel do link e provavelmente você precisa de funções XML também.

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 um formato diferente do Excel / CSV. Olhe para a os diferentes arquivos php no diretório PHPExcel.

    
por 28.01.2012 / 17:54