конвертировать CSV в XLS файл на Linux

10

Следующий скрипт Perl может конвертировать файл CSV в файл XLS

проблема в том, что мне нужно установить на машину Linux много модулей Perl

для того, чтобы запустить этот скрипт Perl, и на самом деле я не могу, потому что машина Linux является машиной клиента (не разрешать устанавливать модули)

Поэтому мне нужно найти другую альтернативу для этого сценария Perl

Первый клиент получил Linux Red-Hat Machine версии 5.X

И я хочу найти несколько скриптов bash / ksh / sh / awk, которые могут выполнять работу так же, как и скрипт perl

поэтому я хочу найти другую альтернативу, которая конвертировать CSV в файл XLS

Посоветуйте, пожалуйста, как найти этот скрипт? или другой совет, чтобы конвертировать CSV в XLS на машине Linux

#!/usr/bin/perl -w

###############################################################################
#
# Example of how to use the WriteExcel module
#
# Simple program to convert a CSV comma-separated value file to an Excel file.
# This is more or less an non-op since Excel can read CSV files.
# The program uses Text::CSV_XS to parse the CSV.
#
# Usage: csv2xls.pl file.csv newfile.xls
#
#
# NOTE: This is only a simple conversion utility for illustrative purposes.
# For converting a CSV or Tab separated or any other type of delimited
# text file to Excel I recommend the more rigorous csv2xls program that is
# part of H.Merijn Brand's Text::CSV_XS module distro.
#
# See the examples/csv2xls link here:
#     L<http://search.cpan.org/~hmbrand/Text-CSV_XS/MANIFEST>
#
# reverse('©'), March 2001, John McNamara, jmcnamara@cpan.org
#

use strict;
use Spreadsheet::WriteExcel;
use Text::CSV_XS;

# Check for valid number of arguments
if ( ( $#ARGV < 1 ) || ( $#ARGV > 2 ) ) {
    die("Usage: csv2xls csvfile.txt newfile.xls\n");
}

# Open the Comma Separated Variable file
open( CSVFILE, $ARGV[0] ) or die "$ARGV[0]: $!";

# Create a new Excel workbook
my $workbook  = Spreadsheet::WriteExcel->new( $ARGV[1] );
my $worksheet = $workbook->add_worksheet();

# Create a new CSV parsing object
my $csv = Text::CSV_XS->new;

# Row and column are zero indexed
my $row = 0;

while (<CSVFILE>) {
    if ( $csv->parse($_) ) {
        my @Fld = $csv->fields;

        my $col = 0;
        foreach my $token (@Fld) {
            $worksheet->write( $row, $col, $token );
            $col++;
        }
        $row++;
    } else {
        my $err = $csv->error_input;
        print "Text::CSV_XS parse() failed on argument: ", $err, "\n";
    }
}
maihabunash
источник
4
Мне так хочется дать этот ответ. чит: переименуйте файл .csv в файл .xls. Excel открывает его, и вы никогда не заметите разницу .
Рамеш
вопрос также задавали на stackoverflow.com/q/26101554/7552
Гленн Джекман
да, но ответа от stackoverflow нет, поэтому, возможно, здесь я получу хороший ответ - :)
maihabunash
2
@maihabunash, вы должны либо удалить вопрос, размещенный в переполнении стека, либо здесь. Если он будет опубликован в 2 местах, он будет закрыт.
Рамеш
Файлы CSV (в общем) трудно анализировать, у вас есть значения ячеек с символами новой строки, кавычками и запятыми. Файлы XLS (старые, а не более современные файлы XML XLSM) - это двоичные файлы, которые генерировать нетривиально.
Антон

Ответы:

22

Для автоматического преобразования файлов CSV в файлы XLS / XLSX вы также можете использовать ssconvert (который поставляется с Gnumeric) или unoconv (который использует LibreOffice).

Пример SSConvert

$ echo -e 'surname,name,age\nCarlo,Smith,23\nJohn,Doe,46\nJane,Doe,69\nSarah,Meyer,23\n' \
     > example.csv
$ unix2dos example.csv
$ ssconvert example.csv example.xlsx
$ ssconvert example.csv example.xls

Первый ssconvertвызов создает файл MS Excel 2007/2010, а второй - файл старой школы Excel 2007.

Вы можете проверить файлы через file:

$ file example.csv
example.csv: ASCII text, with CRLF line terminators
$ file example.xls
example.xls: Composite Document File V2 Document, Little Endian, Os: Windows, Version 4.10,
   Code page: 1252, Create Time/Date: Tue Sep 30 20:23:18 2014
$ file example.xlsx 
example.xlsx: Microsoft Excel 2007+

Вы можете перечислить все поддерживаемые форматы выходного файла через:

$ ssconvert --list-exporters
ID                           | Description
[..]
Gnumeric_Excel:xlsx2         | ISO/IEC 29500:2008 & ECMA 376 2nd edition (2008);
                               [MS Excel 2010]
Gnumeric_Excel:xlsx          | ECMA 376 1st edition (2006); [MS Excel 2007]
Gnumeric_Excel:excel_dsf     | MS Excel 97/2000/XP & 5.0/95
Gnumeric_Excel:excel_biff7   | MS Excel 5.0/95
Gnumeric_Excel:excel_biff8   | MS Excel 97/2000/XP
[..]

Пример Unoconv

$ unoconv --format  xls example.csv

создает файл example.xls, который является файлом Excel 97/2000 / XP.

Проверить через файл:

$ file example.xls 
example.xls: Composite Document File V2 Document, Little Endian, Os: Windows, Version 1.0,
  Code page: -535, Revision Number: 0

Вы можете перечислить все поддерживаемые форматы файлов через:

$ unoconv --show
[..]
The following list of spreadsheet formats are currently available:

  csv      - Text CSV [.csv]
  dbf      - dBASE [.dbf]
[..]
  ooxml    - Microsoft Excel 2003 XML [.xml]
[..]
  xls      - Microsoft Excel 97/2000/XP [.xls]
  xls5     - Microsoft Excel 5.0 [.xls]
  xls95    - Microsoft Excel 95 [.xls]
[..]
maxschlepzig
источник
пожалуйста, совет о синтаксисе, как синтаксис для преобразования CSV в XLS?
махабунаш
@maihabunash, я добавил несколько примеров.
maxschlepzig
Это также soffice --convert-to xlsx:"Calc MS Excel 2007 XML" filename.csv --headlessвесьма полезно.
TryTryAgain
Пожалуйста, добавьте опции для слияния CSV в одинарные XLS. Не удалось найти ни в одной справочной странице по Unoconv или SSconvert
Любопытно