用 Perl 实现 Csv 到 Xlsx 的格式转换,支持长数字 。
** 文章“xlsx、xls、csv 间格式转换的.vbs代码”, 虽实现了 Excel2Csv, Excel2Xls 和Excel2Xlsx, 但它对 长数字 的处理仍有所不足。
# filename: csv2xlsx.pl
# Functin: Trans .csv File to .xlsx
#
# Env: Windows, strawberry-perl-5.xx, https://strawberryperl.com/releases.html
# Module install:
# C:\>cpanm Text::CSV
# C:\>cpanm Excel::Writer::XLSX
# C:\>cpanm Spreadsheet::WriteExcel
#
# csv2xlsx.pl => csv2xlsx.BAT : c:\> Pl2BAT %xxPath%\csv2xlsx.pl
# Usage:
# csv2xlsx.pl < abc.csv > anyany.xlsx
# csv2xlsx[.BAT] < abc.csv > anyany.xlsx
#
my ($FS) =(','); # 定义CSV输入、输出分隔符
# my @strRow= qw/ 0 /; # 定义以string格式输出的“行”, 才能将长数字显示出来
# my @strCol= qw/ 0 3 6 /; # 定义以string格式输出的”列“, 才能将长数字显示出来
#
use Spreadsheet::WriteExcel;
use Excel::Writer::XLSX;
use Encode qw/encode decode/;
use Text::CSV; # 支持 Field 带","号
my $csv=Text::CSV->new({
binary=>1,
auto_diag=>1,
sep_char=>$FS # not really needed as this is the default//if is ","
});
# my %strRow,%strCol;
# foreach (@strRow) {
# $strRow{$_}="string";
# }
# foreach (@strCol) {
# $strCol{$_}="string";
# }
open my $fh, '>', \my $str_To_STDOUT or die "Failed to open filehandle: $!";
my $workbook = Excel::Writer::XLSX->new($fh);
# Add a worksheet
$worksheet = $workbook->add_worksheet();
my $row = 0;
while ( my $fields=$csv->getline(STDIN) ){
chomp $line;
my $col=0;
while ( my $fld = $fields->[$col] ) {
# MethodXX: 根据 输出单元 长度,决定是否以 string 格式输出
{
if ( length $_ > 11 ) {
$worksheet->write_string($row, $col, decode("gbk",$fld));
} else {
$worksheet->write($row, $col, decode("gbk",$fld));
}
# --------------------------------------------------
$col+=1;
}
}
$row+=1;
}
$workbook->close();
# 用 STDOUT 作为输出:
binmode STDOUT;
print $str_To_STDOUT;