You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:57:17