Преобразуйте файл .xlsx (MS Excel) в .csv в командной строке с полями, разделенными точкой с запятой


31

Я понимаю, что это не совсем вопрос, связанный с Unix / Linux. Но так как это то, что я буду делать в Linux, я надеюсь, что у кого-то есть ответ.

У меня есть онлайн файл Excel ( .xlsx), который периодически обновляется (кем-то еще). Я хочу написать сценарий и вставить его как cronjob, чтобы обработать этот лист Excel. Но чтобы сделать это, мне нужно преобразовать это в текстовый файл (а .csv) с разделенными точкой с запятой столбцами. К сожалению, нельзя разделять запятыми, поскольку в некоторых столбцах есть запятые. Можно ли вообще сделать это преобразование из оболочки? У меня установлен Open office, и я могу сделать это с помощью его графического интерфейса, но хочу знать, возможно ли это сделать из командной строки. Благодарность!

PS: У меня также есть компьютер Mac, так что если какое-то решение может работать там, это тоже хорошо. :)

Ответы:


21

OpenOffice поставляется с программой unoconv для выполнения преобразования формата в командной строке.

unoconv -f csv filename.xlsx

Для более сложных требований вы можете анализировать файлы XLSX Spreadsheet::XLSXв Perl или openpyxlPython. Например, вот быстрый скрипт для распечатки листа в виде CSV-файла, разделенного точкой с запятой (предупреждение: не проверено, введено непосредственно в браузере):

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

unoconv не поставлялся с моим OO, но я установил его, и он отлично работает (преобразует в файл, разделенный запятыми, но не точку с запятой)! Благодарность! Мне все еще нужно будет выяснить, как я получу свои поля, которые содержат запятые. Но все равно спасибо.
allrite

@allrite О, я пропустил требование точки с запятой в качестве разделителей. Мое предложение сделать обработку в Python или Perl все еще остается в силе. Но я также добавил скрипт (непроверенный) для преобразования в CSV ;в качестве разделителя.
Жиль "ТАК - перестань быть злым"

Благодарность! Я использовал Spreadsheet :: XLSX, но использовал код в предоставленной вами ссылке CPAN. Работает :)
allrite

1
У анонимного пользователя были проблемы с этим
Майкл Мрозек

9

https://github.com/dilshod/xlsx2csv

Хорошо сработало для меня. Около 85 МБ XLSX-файла конвертируется примерно за 3 минуты на SSD Mac Book Pro.


1
Хорошо работал в OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvработал хорошо и способность определить разделитель, спасибо +!
HHH

6

Я использую Perl xls2csv для преобразования xlsфайлов в csv.

Не уверен, что если он xlsxтоже работает .

Около:

К сожалению, нельзя разделять запятыми, поскольку в некоторых столбцах есть запятые

вот почему было введено цитирование:

1,2,"data,data, more data"

спасибо за совет, я попробую это. Я все еще предпочитаю разделить точкой с запятой, так как после преобразования CSV файл проходит через awkсценарии. И просто проще передать точку с запятой в качестве разделителя полей awk. Я мог бы искать запятые внутри кавычек, чтобы заменить их чем-то еще ... теперь это другой вопрос :)
allrite

Спасибо @neurino. Вместо этого я использовал метод Жиля, но все равно спасибо за ответ.
allrite

1

Я использую PHP. Просто установите библиотеку PHPExel с http://phpexcel.codeplex.com/ и, вероятно, вам тоже понадобятся функции XML.

Это мой код:

<?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));
?>

Вы можете отменить процесс или использовать другой формат Excel / CSV. Посмотрите на разные файлы php в каталоге PHPExcel.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.