Chuyển đổi tệp .xlsx (MS Excel) thành .csv trên dòng lệnh với các trường được phân tách bằng dấu chấm phẩy


31

Tôi nhận ra rằng đây không phải là một câu hỏi hoàn toàn liên quan đến unix / linux. Nhưng vì đây là điều tôi sẽ làm trên linux, tôi hy vọng ai đó có câu trả lời.

Tôi có một tệp excel trực tuyến ( .xlsx) được cập nhật định kỳ (bởi người khác). Tôi muốn viết một kịch bản và đặt nó dưới dạng cronjob để xử lý bảng excel đó. Nhưng để làm điều đó, tôi cần chuyển đổi nó thành một tệp văn bản (vì vậy a .csv) với các cột được phân tách bằng dấu chấm phẩy. Thật không thể phân tách bằng dấu phẩy vì một số cột có dấu phẩy trong đó. Có phải tất cả có thể thực hiện việc chuyển đổi này từ shell? Tôi đã cài đặt Open office và tôi có thể làm điều này bằng cách sử dụng GUI của nó, nhưng muốn biết liệu có thể làm điều này từ dòng lệnh hay không. Cảm ơn!

PS: Tôi cũng có một máy Mac, vì vậy nếu một số giải pháp có thể hoạt động ở đó, điều đó cũng tốt. :)

Câu trả lời:


21

OpenOffice đi kèm với chương trình unoconv để thực hiện chuyển đổi định dạng trên dòng lệnh.

unoconv -f csv filename.xlsx

Đối với các yêu cầu phức tạp hơn, bạn có thể phân tích các tệp XLSX bằng Spreadsheet::XLSXPerl hoặc openpyxlbằng Python. Ví dụ: đây là tập lệnh quickie để in ra một bảng tính dưới dạng tệp CSV được phân tách bằng dấu chấm phẩy (cảnh báo: chưa được kiểm tra, được nhập trực tiếp trong trình duyệt):

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 không đi kèm với OO của tôi, nhưng tôi đã cài đặt nó và nó hoạt động rất tốt (chuyển đổi thành tệp được phân tách bằng dấu phẩy, chứ không phải dấu chấm phẩy)! Cảm ơn! Tôi vẫn sẽ cần phải tìm ra cách tôi sẽ có được các trường có dấu phẩy. Nhưng dù sao cũng cảm ơn.
allrite

@allrite Ồ, tôi đã bỏ lỡ yêu cầu về dấu chấm phẩy làm dấu phân cách. Đề nghị của tôi để thực hiện xử lý trong Python hoặc Perl vẫn đứng. Nhưng tôi cũng đã thêm một tập lệnh (chưa được kiểm tra) để chuyển đổi sang CSV với ;tư cách là dấu phân cách.
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn! Tôi đã sử dụng Bảng tính :: XLSX, nhưng đã sử dụng mã trong liên kết CPAN mà bạn cung cấp. Nó hoạt động :)
allrite

1
Một người dùng ẩn danh có vấn đề với điều này
Michael Mrozek

9

https://github.com/dilshod/xlsx2csv

Làm việc tốt cho tôi. Khoảng 85 MB tệp XLSX được chuyển đổi trong khoảng 3 phút trên ổ SSD Mac Book Pro.


1
Hoạt động tốt trong OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvhoạt động tốt và khả năng xác định dấu phân cách, cảm ơn bạn +!
hhh

6

Tôi đang sử dụng xls2csv của Perl để chuyển đổi xlstệp thành csv.

Không chắc tho nếu nó hoạt động với xlsxquá.

Trong khoảng:

Thật không thể phân tách bằng dấu phẩy vì một số cột có dấu phẩy trong đó

đó là lý do tại sao trích dẫn đã được giới thiệu:

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

cảm ơn vì tiền boa, tôi sẽ thử nó Tôi vẫn thích dấu chấm phẩy được phân tách, vì sau khi chuyển đổi csv, tệp sẽ chuyển qua awkcác tập lệnh. Và nó dễ dàng hơn để vượt qua dấu chấm phẩy như là dấu phân cách trường awk. Tôi có thể tìm dấu phẩy bên trong dấu ngoặc kép để thay thế chúng bằng một cái gì đó khác ... bây giờ đó là một câu hỏi khác :)
allrite

Cảm ơn @neurino. Tôi đã sử dụng phương pháp Gilles thay thế, nhưng dù sao cũng cảm ơn vì đã trả lời.
allrite

1

Tôi sử dụng PHP. Chỉ cần cài đặt thư viện PHPExel từ http://phpexcel.codeplex.com/ và có lẽ bạn cũng cần các hàm XML.

Đây là mã của tôi:

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

Bạn có thể hoàn nguyên quy trình hoặc sử dụng định dạng Excel / CSV khác nhau. Nhìn vào các tệp php khác nhau trong thư mục PHPExcel.

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.