为什么我不能使用Perl的Spreadsheet :: WriteExcel将图表添加到Excel电子表格中

时间:2010-02-23 18:03:09

标签: perl excel charts

使用Spreadsheet::WriteExcel在电子表格中创建图表时,其创建的文件会出现错误读取

  

Excel在“Report.xls”中找到了不可读的内容

然后问我是否要恢复它。我已经解决了代码中的问题行是我实际插入图表的地方,用

$chartworksheet->insert_chart(0, 0, $linegraph, 10, 10);

如果我注释掉这一行,数据就可以了(当然,没有图表)。其余的相关代码如下(此处未定义的任何变量都在代码的前面定义,如$lastrow)。

printf("Creating\n");
my $chartworksheet = $workbook->add_worksheet('Graph');
my $linegraph = $workbook->add_chart(type => 'line', embedded => 1);
$linegraph->add_series(values => '=Data!$D$2:$D$lastrow', name => 'Column1');
$linegraph->add_series(values => '=Data!$E$2:$E$lastrow', name => 'Column2');
$linegraph->add_series(values => '=Data!$G$2:$G$lastrow', name => 'Column3');
$linegraph->add_series(values => '=Data!$H$2:$H$lastrow', name => 'Column4');
$linegraph->set_x_axis(name => 'x-axis');
$linegraph->set_y_axis(name => 'y-axis');
$linegraph->set_title(name => 'title');
$linegraph->set_legend(position => 'bottom');
$chartworksheet->activate();
$chartworksheet->insert_chart(0, 0, $linegraph, 10, 10);
printf("Finished\n");

我在这里完全失去了,我找不到任何答案。求救!

2 个答案:

答案 0 :(得分:4)

看表达式:

'=Data!$D$2:$D$lastrow'

$lastrow中是Spreadsheet::WriteExcel某个约定还是来自脚本的变量被插入到字符串表达式中?如果它是你的var,那么这段代码可能不会在单引号内做你想做的事情,你可能想要使用像

这样的东西
'=Data!$D$2:$D' . $lastrow
"=Data!\$D\$2:\$D:$lastrow"
sprintf('=Data!$D2:$D%d',$lastrow)

答案 1 :(得分:1)

正如专家小组正确指出的那样,问题在于你在系列字符串上使用单引号而$lastrow没有插值。

使用xl_range_formula()实用程序函数以编程方式生成图表系列字符串时,可以完全避免这些类型的问题。

$chart->add_series(
    categories    => xl_range_formula( 'Sheet1', 1, 9, 0, 0 ),
    values        => xl_range_formula( 'Sheet1', 1, 9, 1, 1 ),
);

# Which is the same as:
$chart->add_series(
    categories    => '=Sheet1!$A$2:$A$10',
    values        => '=Sheet1!$B$2:$B$10',
);

有关详细信息,请参阅WriteExcel文档的以下部分:Working with Cell Ranges