convertir archivos CSV a XLS en Linux

10

El siguiente script de Perl puede convertir un archivo CSV a un archivo XLS

el problema es que necesito instalar en la máquina Linux del cliente muchos módulos Perl

para ejecutar este script Perl, y en realidad no puedo porque la máquina Linux es la máquina del cliente (no se permite instalar módulos)

Así que necesito encontrar alguna otra alternativa para este script Perl

El primer cliente tiene la máquina Linux Red-Hat versión 5.X

Y quiero encontrar algunos scripts bash / ksh / sh / awk que puedan hacer el trabajo de la misma manera que el script perl

así que quiero encontrar otra alternativa que convierta archivos CSV a XLS

Por favor, ¿cómo encontrar este script? u otro consejo para convertir CSV a XLS en una máquina 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
fuente
44
Estoy muy tentado a dar esta respuesta. truco: cambie el nombre de file.csv a file.xls. Excel lo abre y nunca se nota la diferencia .
Ramesh
pregunta también hecha
glenn jackman
sí, pero no hay respuesta de stackoverflow, así que quizás aquí obtenga una buena respuesta - :)
maihabunash
2
@maihabunash, debe eliminar la pregunta publicada en el desbordamiento de pila o aquí. Si lo tiene publicado en 2 lugares, se cerrará.
Ramesh
Los archivos CSV (en general) son difíciles de analizar, tiene valores de celda con líneas nuevas, comillas y comillas. Los archivos XLS (los antiguos, no los archivos XLSM xml más modernos) son archivos binarios que no son triviales de generar.
Anthon

Respuestas:

22

Para convertir automáticamente archivos CSV a XLS / XLSX, también puede usar ssconvert (que viene con Gnumeric) o unoconv (que usa LibreOffice).

Ejemplo de 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

Donde la primera ssconvertllamada crea un archivo MS Excel 2007/2010 y la segunda un Excel 2007 de la vieja escuela.

Puede consultar los archivos a través de 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+

Puede enumerar todos los formatos de archivo de salida compatibles a través de:

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

Ejemplo de Unoconv

$ unoconv --format  xls example.csv

que crea example.xls, que es un archivo Excel 97/2000 / XP.

Verificar por archivo:

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

Puede enumerar todos los formatos de archivo compatibles a través de:

$ 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
fuente
por favor consejos sobre la sintaxis cómo la sintaxis para convertir csv a xls?
maihabunash
@maihabunash, agregué algunos ejemplos.
maxschlepzig
Esto: soffice --convert-to xlsx:"Calc MS Excel 2007 XML" filename.csv --headlesses bastante útil también.
Try TryAgain