使用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");
我在这里完全失去了,我找不到任何答案。求救!
答案 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。