chuyển đổi tập tin CSV sang XLS trên linux


10

Tập lệnh Perl sau đây có thể chuyển đổi tệp CSV thành tệp XLS

vấn đề là tôi cần cài đặt trên máy Linux của khách hàng nhiều mô-đun Perl

để chạy tập lệnh Perl này và thực tế tôi không thể vì máy Linux là máy khách hàng (không cho phép cài đặt các mô-đun)

Vì vậy, tôi cần tìm một số thay thế khác cho kịch bản Perl này

Khách hàng đầu tiên có máy mũ đỏ Linux phiên bản 5.X

Và tôi muốn tìm một số tập lệnh bash / ksh / sh / awk có thể thực hiện công việc giống như tập lệnh perl

vì vậy tôi muốn tìm giải pháp thay thế khác chuyển đổi tệp CSV sang XLS

Xin tư vấn làm thế nào để tìm kịch bản này? hoặc lời khuyên khác để chuyển đổi CSV sang XLS trên máy 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";
    }
}

4
Tôi rất muốn đưa ra câu trả lời này . cheat: đổi tên file.csv thành file.xls. excel mở nó và bạn không bao giờ nhận thấy sự khác biệt .
Ramesh

câu hỏi cũng được hỏi tại stackoverflow.com/q/26101554/7552
glenn jackman

có nhưng không có câu trả lời từ stackoverflow nên có lẽ ở đây tôi sẽ nhận được câu trả lời hay - :)
maihabunash

2
@maihabunash, bạn nên xóa câu hỏi được đăng trong stack overflow hoặc tại đây. Nếu bạn có nó được đăng ở 2 nơi, nó sẽ bị đóng cửa.
Ramesh

Các tệp CSV (nói chung) rất khó phân tích, bạn có các giá trị ô với dòng mới, dấu ngoặc kép và dấu phẩy. Các tệp XLS (các tệp cũ, không phải các tệp xml XLSM hiện đại hơn) là các tệp nhị phân không tầm thường để tạo.
Anthon

Câu trả lời:


22

Để tự động chuyển đổi tệp CSV thành tệp XLS / XLSX, bạn cũng có thể sử dụng ssconvert (đi kèm với Gnumeric) hoặc unoconv (sử dụng LibreOffice).

Ví dụ về 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

Trong đó ssconvertcuộc gọi đầu tiên tạo tệp MS Excel 2007/2010 và cuộc gọi thứ hai là Excel 2007 cũ.

Bạn có thể kiểm tra các tập tin thông qua 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+

Bạn có thể liệt kê tất cả các định dạng tệp đầu ra được hỗ trợ thông qua:

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

Ví dụ Unoconv

$ unoconv --format  xls example.csv

tạo example.xls, là tệp Excel 97/2000 / XP.

Kiểm tra thông qua tập tin:

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

Bạn có thể liệt kê tất cả các định dạng tệp được hỗ trợ thông qua:

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

Xin tư vấn về cú pháp làm thế nào để cú pháp chuyển đổi csv thành xls?
maihabunash

@maihabunash, tôi đã thêm một số ví dụ.
maxschlepzig

Điều này: soffice --convert-to xlsx:"Calc MS Excel 2007 XML" filename.csv --headlesscũng khá hữu ích.
TryTryAgain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.