Spreadsheet::WriteExcel - 尽管单元格格式为文本,但值更改为科学记数法

Spreadsheet::WriteExcel - Values are changed to scientific notation despite cell being formatted as Text

我正在使用 Perl Spreadsheet::WriteExcel 模块创建 .xls 电子表格(我知道 Excel::Writer::XLSX,但我需要保留 .xls 格式以实现向后兼容),有些单元格是写得不正确。有一些单元格具有 1E## 形式的值,默认情况下 Excel 解释为科学记数法。为了解决这个问题,我使用 set_num_format('@') 将单元格格式强制为纯文本,但它不起作用。如果我在生成工作簿后查看 Excel 中的单元格格式,它已按我的预期设置为文本,但值仍已更改为 1E+##.[=20 形式的数字=]

正在使用的格式声明:

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

我在 Excel 里面看到 1E37

Spreadsheet::WriteExcelwrite 提到了这个:

the write() method acts as a general alias for several more specific methods

The general rule is that if the data looks like a something then a something is written.

我怀疑它看到 1E37 并认为它看起来更像一个数字而不是字符串,所以它使用 write_number 并将其转换为数字。