电子表格::WriteExcel-尽管单元格格式设置为文本,但值仍更改为科学记数法
我正在使用 PerlSpreadsheet::WriteExcel模块创建一个 .xls 电子表格(我知道Excel::Writer::XLSX.xls 格式,但为了向后兼容,我需要保留 .xls 格式),并且某些单元格没有正确写入。有一些单元格的值的形式为1E##,Excel 默认将其解释为科学记数法。为了解决这个问题,我使用set_num_format('@')强制单元格的格式为纯文本,但它不起作用。如果我在生成工作簿后查看 Excel 中的单元格格式,它已按预期设置为 Text,但值仍更改为表单的数字1E+##。
所用格式的声明:
my $formatRS = $workbook->add_format();
$formatRS->set_align('right');
$formatRS->set_align('top');
$formatRS->set_text_wrap();
$formatRS->set_size(8);
$formatRS->set_num_format('@');
my $formatLS = $workbook->add_format();
$formatLS->set_align('left');
$formatLS->set_align('top');
$formatLS->set_text_wrap();
$formatLS->set_size(8);
$formatLS->set_num_format('@');
写入数据:
$worksheet2->write($row, 0, "$Eq->[0]", $formatRS);
$worksheet2->write($row, 1, "$Eq->[1]", $formatLS);
$worksheet2->write($row, 2, "$Eq->[2]", $formatLS);
在写入数据的点处中断表明@Eq数组仍然包含正确的值,并且此后不会修改工作表。有没有办法阻止数据像这样被破坏?
编辑:编写了一个快速脚本来演示问题。这将创建一个包含三个单元格的工作簿。第一个值被保留,但第二个和第三个值被转换为数字,尽管单元格被格式化为文本。
use Spreadsheet::WriteExcel;
my $workbook = Spreadsheet::WriteExcel->new("Workbook_Test.xls");
my $format = $workbook->add_format();
$format->set_num_format('@');
my $worksheet1 = $workbook->add_worksheet('sheet');
$worksheet1->write(0, 0, "1E10B", $format);
$worksheet1->write(0, 1, "1E37", $format);
$worksheet1->write(0, 2, "1E10", $format);
回答
更改write为write_string对我有用:
$worksheet1->write_string(0, 0, "1E10B", $format);
$worksheet1->write_string(0, 1, "1E37", $format);
$worksheet1->write_string(0, 2, "1E10", $format);
我1E37在Excel里面看到了。
电子表格::WriteExcel提到了这一点write:
write() 方法充当几个更具体方法的通用别名
和
一般的规则是,如果数据看起来像一个东西,然后一个
东西被写入。
我怀疑它看到1E37并决定它看起来更像是一个数字而不是一个字符串,因此它使用write_number并将其转换为数字。
THE END
二维码