Excel::Writer::XLSX 不可读内容错误
Excel::Writer::XLSX Unreadable content error
我刚开始使用 Perl,现在正在使用
Excel::Writer::XLSX
查询 DB2 数据库并将数据导出到 .xlsx 文件。数据大约有 250k 行。
脚本 运行 没问题,但是当我尝试打开 Excel 文件时它抛出错误并要求修复文件。修复后,一些数据被替换为 inf
。
下面是我的代码片段。
while ( my $sqlStatement = ) {
$mSQL = $dbh->prepare( $sqlStatement )
or die "Can't prepare $sqlStatement";
$mSQL->execute()
or die "Can't execute $sqlStatement";
}
my $workbook = Excel::Writer::XLSX->new( $ARGV[2] );
$workbook->set_tempdir( '/tempDir/' );
$workbook->set_optimization();
my $worksheet = $workbook->add_worksheet();
$worksheet->keep_leading_zeros();
my $row = 0;
my $column = 0;
my @emptyRow = ();
$worksheet->write_row( $row++, $column, [ @{ $mSQL->{NAME_uc} } ] );
$worksheet->write_row( $row++, $column, [ @emptyRow ] );
while ( my @Row = $mSQL->fetchrow_array ) {
$worksheet->write_row( $row++, $column, [ @Row ] ); #, $cellFormat);
$count++;
}
$workbook->close();
有人可以就这个问题给我建议吗?
我终于弄明白了(感谢 John McNamara)。这是通过添加一个写处理程序解决的,该处理程序使用正则表达式来检查特定标记是否正在转换为 "inf",如果是,它会调用 write_string 子例程而不是 write_row。
下面是代码。
#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my $workbook = Excel::Writer::XLSX->new( 'write_handler5.xlsx' );
my $worksheet = $workbook->add_worksheet();
# Add a handler to match any numbers in order to check for and handle
# infinity.
$worksheet->add_write_handler( qr[\d], \&write_with_infinity );
# The following function is used by write() to pre-process any the data when a
# match is found. If it finds something that looks like a number but evaluates
# to infinity it write it as a string.
sub write_with_infinity {
my $worksheet = shift;
my @args = @_;
my $token = $args[2];
# Check if token looks like a number, in the same way as write().
if ( $token =~ /^([+-]?)(?=[0-9]|\.[0-9])[0-9]*(\.[0-9]*)?([Ee]([+-]?[0-9]+))?$/ ) {
# Check for infinity.
$token = $token + 0;
if ($token =~ /inf/) {
# Write the value as a string instead of a number.
return $worksheet->write_string( @args );
}
}
# Reject the match and return control to write()
return undef;
}
我刚开始使用 Perl,现在正在使用
Excel::Writer::XLSX
查询 DB2 数据库并将数据导出到 .xlsx 文件。数据大约有 250k 行。
脚本 运行 没问题,但是当我尝试打开 Excel 文件时它抛出错误并要求修复文件。修复后,一些数据被替换为 inf
。
下面是我的代码片段。
while ( my $sqlStatement = ) {
$mSQL = $dbh->prepare( $sqlStatement )
or die "Can't prepare $sqlStatement";
$mSQL->execute()
or die "Can't execute $sqlStatement";
}
my $workbook = Excel::Writer::XLSX->new( $ARGV[2] );
$workbook->set_tempdir( '/tempDir/' );
$workbook->set_optimization();
my $worksheet = $workbook->add_worksheet();
$worksheet->keep_leading_zeros();
my $row = 0;
my $column = 0;
my @emptyRow = ();
$worksheet->write_row( $row++, $column, [ @{ $mSQL->{NAME_uc} } ] );
$worksheet->write_row( $row++, $column, [ @emptyRow ] );
while ( my @Row = $mSQL->fetchrow_array ) {
$worksheet->write_row( $row++, $column, [ @Row ] ); #, $cellFormat);
$count++;
}
$workbook->close();
有人可以就这个问题给我建议吗?
我终于弄明白了(感谢 John McNamara)。这是通过添加一个写处理程序解决的,该处理程序使用正则表达式来检查特定标记是否正在转换为 "inf",如果是,它会调用 write_string 子例程而不是 write_row。 下面是代码。
#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my $workbook = Excel::Writer::XLSX->new( 'write_handler5.xlsx' );
my $worksheet = $workbook->add_worksheet();
# Add a handler to match any numbers in order to check for and handle
# infinity.
$worksheet->add_write_handler( qr[\d], \&write_with_infinity );
# The following function is used by write() to pre-process any the data when a
# match is found. If it finds something that looks like a number but evaluates
# to infinity it write it as a string.
sub write_with_infinity {
my $worksheet = shift;
my @args = @_;
my $token = $args[2];
# Check if token looks like a number, in the same way as write().
if ( $token =~ /^([+-]?)(?=[0-9]|\.[0-9])[0-9]*(\.[0-9]*)?([Ee]([+-]?[0-9]+))?$/ ) {
# Check for infinity.
$token = $token + 0;
if ($token =~ /inf/) {
# Write the value as a string instead of a number.
return $worksheet->write_string( @args );
}
}
# Reject the match and return control to write()
return undef;
}