convertir un fichier CSV en XLS sur linux

10

Le script Perl suivant peut convertir un fichier CSV en fichier XLS

le problème est que je dois installer sur la machine Linux du client de nombreux modules Perl

afin d'exécuter ce script Perl, et en fait je ne peux pas parce que la machine Linux est la machine client (ne pas autoriser l'installation de modules)

J'ai donc besoin de trouver une autre alternative pour ce script Perl

Le premier client a la version 5.X de la machine Red Hat Hat

Et je veux trouver des scripts bash / ksh / sh / awk qui peuvent faire le même travail que le script perl

donc je veux trouver une autre alternative qui convertit CSV en fichier XLS

S'il vous plaît des conseils sur la façon de trouver ce script? ou d'autres conseils pour convertir CSV en XLS sur une machine 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, [email protected]
#

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
la source
4
Je suis tellement tenté de donner cette réponse. triche: renommez file.csv en file.xls. Excel l'ouvre et vous ne remarquez jamais la différence .
Ramesh
question également posée sur stackoverflow.com/q/26101554/7552
glenn jackman
oui mais pas de réponse de stackoverflow alors peut-être qu'ici j'obtiendrai une bonne réponse - :)
maihabunash
2
@maihabunash, vous devez supprimer la question postée dans le débordement de pile ou ici. Si vous l'avez affiché à 2 endroits, il sera fermé.
Ramesh
Les fichiers CSV (en général) sont difficiles à analyser, vous avez des valeurs de cellule avec des retours à la ligne, des guillemets et des virgules. Les fichiers XLS (les anciens, pas les fichiers xml XLSM les plus modernes) sont des fichiers binaires qui ne sont pas triviaux à générer.
Anthon

Réponses:

22

Pour convertir automatiquement des fichiers CSV en fichiers XLS / XLSX, vous pouvez également utiliser ssconvert (fourni avec Gnumeric) ou unoconv (qui utilise LibreOffice).

Exemple 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

Où le premier ssconvertappel crée un fichier MS Excel 2007/2010 et le second un fichier Excel 2007 old school.

Vous pouvez vérifier les fichiers via 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+

Vous pouvez répertorier tous les formats de fichiers de sortie pris en charge via:

$ 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
[..]

Exemple Unoconv

$ unoconv --format  xls example.csv

qui crée example.xls, qui est un fichier Excel 97/2000 / XP.

Vérifier via fichier:

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

Vous pouvez répertorier tous les formats de fichiers pris en charge via:

$ 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
la source
s'il vous plaît des conseils sur la syntaxe comment la syntaxe pour convertir csv en xls?
maihabunash
@maihabunash, j'ai ajouté quelques exemples.
maxschlepzig
Ceci: soffice --convert-to xlsx:"Calc MS Excel 2007 XML" filename.csv --headlessest également très utile.
TryTryAgain