使用Perl在Excel数据所在同一工作表中绘制直方图的问题求解
问题原因
- 图表创建逻辑写在了读取数据的
while循环内部,每读取一行数据就会新建一个图表对象,Excel::Writer::XLSX默认会将新建的图表作为独立工作表存放,因此出现了大量多余的独立图表 - 没有调用工作表的
insert_chart()方法将图表嵌入到存放数据的工作表中
修正后代码
use strict; use warnings; use Excel::Writer::XLSX; use IO::Uncompress::Gunzip qw(gunzip $GunzipError); { my $output_fn = 'result.xlsx'; my $input_fn = 'accuracy_final.txt.gz'; my $workbook = Excel::Writer::XLSX->new( $output_fn ); my $worksheet = $workbook->add_worksheet(); my $zip = IO::Uncompress::Gunzip->new( $input_fn ) or die "gunzip failed: $GunzipError\n"; my $col = 0; my $row = 1; while (!$zip->eof()) { my $line = $zip->getline(); chomp($line); next if $line !~ /\S/; # 跳过空行 my $value = $line; $worksheet->write( $row, $col, $value ); $row++; } # 图表创建和配置逻辑移到循环外部,仅生成1个图表 my $chart = $workbook->add_chart( type => 'line', embedded => 1 ); # 动态匹配实际读取的数据行数作为图表取值范围 $chart->add_series( values => "=Sheet1!\$A\$2:\$A\$$row", ); # 将图表嵌入到数据工作表的指定位置,可自行调整放置坐标 $worksheet->insert_chart( 'C2', $chart ); $workbook->close(); }
关键改动说明
- 将图表创建、配置、嵌入的逻辑全部移到了数据读取循环的外部,避免重复生成多余图表
- 新增
embedded => 1参数声明图表为嵌入式类型,不会生成独立工作表 - 调用
$worksheet->insert_chart()方法,将图表嵌入到数据工作表的指定位置,示例中以C2单元格为左上角放置图表 - 图表数据范围改为动态计算,根据实际读取到的数据行数
$row设置取值终点,避免固定写死5000行的冗余问题
内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

