Perl使用Excel::Writer::XLSX写入多行数据到Excel仅存1行如何解决
问题现象
- 读取文本文件数据写入Excel时,文本内共2行数据,最终生成的Excel仅保留第1行,第2行数据丢失
- 源文本数据如下:
1957041.0F1,9850-LOGOUT PROBE,B27A,Waiting,12 4511533.021,9050-OFFLOAD SEND,B18A,24,Waiting,12
- 实际输出的Excel仅包含1行内容:
1957041.0F1,9850-LOGOUT PROBE,B27A,Waiting,12
问题根因
代码存在3处明显逻辑错误:
- 核心错误:
$workbook->close被放在遍历文件的内层循环中,处理完第1行数据时就直接关闭了Excel工作簿,后续第2行写入时文件句柄已失效,根本无法写入内容 - 多余的内层
for循环无意义:读取每一行时用$.获取当前行号,又从1循环到当前行号重复执行写入,处理第2行时会覆盖之前第1行写入的内容 - 字段分割不匹配:源文件第2行有6个逗号分隔字段,split时仅定义了5个变量接收,会导致列数据错位
修正后可运行代码
use strict; use Excel::Writer::XLSX; # 新建工作簿和工作表 my $workbook = Excel::Writer::XLSX->new( 'C:/Users/pphyuphway/Downloads/myExcel.xlsx' ); my $worksheet = $workbook->add_worksheet(); # 打开源文本文件 my $file = "C:/Users/pphyuphway/Downloads/lot.txt"; open( my $fh4, "<", $file) or die "Could not open file '$file' $!"; # Excel行索引从0开始计数 my $row_idx = 0; # 逐行读取文本 while (my $line = <$fh4>) { chomp $line; # 去除每行末尾的换行符,避免单元格带多余空行 # 按逗号分割字段,匹配源文件6个字段的结构 my ($lot, $step, $designID, $col4, $col5, $col6) = split(/,/, $line); # 逐列写入当前行,列索引从0开始,列对应关系可根据业务需求调整 $worksheet->write($row_idx, 0, $lot); $worksheet->write($row_idx, 1, $designID); $worksheet->write($row_idx, 2, $step); $worksheet->write($row_idx, 3, $col6); $worksheet->write($row_idx, 4, $col4); $worksheet->write($row_idx, 5, $col5); # 行索引自增,准备写入下一行 $row_idx++; } # 所有数据写入完成后,再关闭文件句柄和工作簿 close $fh4; $workbook->close;
修正要点
- 将
$workbook->close移动到所有写入操作完成后,避免提前关闭文件导致写入失败 - 删除冗余的内层for循环,逐行读取逐行写入,不会出现重复覆盖内容的问题
- 增加
chomp处理每行末尾的换行符,避免写入单元格时出现多余空白 - 调整split接收字段的数量,匹配源文件每行的字段个数,避免列错位
- 改用行列索引的write调用方式,比拼接单元格地址字符串更稳定,不易出错
内容的提问来源于stack exchange,提问作者Pann Phyu Phway
相关产品推荐
相关产品推荐

