如何使用Perl将SQL查询控制台输出内容自动写入Excel文件
实现思路
核心逻辑是按「初始化数据库→初始化Excel对象→写入标题/表头→遍历SQL查询结果逐行写入Excel→关闭Excel文件」的顺序执行,避免两段逻辑独立运行的冲突。
整合后完整可运行代码
use strict; use warnings; use Excel::Writer::XLSX; # 初始化数据库连接 init_db_connections(); # 初始化Excel对象 my $workbook = Excel::Writer::XLSX->new( 'perl.xlsx' ); my $worksheet = $workbook->add_worksheet(); # 配置标题格式 my $title_format = $workbook->add_format(); $title_format->set_bold(); $title_format->set_color( 'black' ); $title_format->set_underline; # 写入标题、表头 my $cur_row = 0; $worksheet->write( $cur_row, 0, 'SQL Report', $title_format ); # 可选:设置列宽优化显示,0-2列宽度设为20字符 $worksheet->set_column(0, 2, 20); $cur_row++; # 写入字段表头 $worksheet->write($cur_row, 0, 'Row1'); $worksheet->write($cur_row, 1, 'Row2'); $worksheet->write($cur_row, 2, 'Row3'); $cur_row++; # 执行SQL查询 my $curHnd = INV::DBI::execute('----'.':------') or die $INV::DBI::errstr; # 遍历查询结果写入Excel while (my $db_row = $curHnd->fetchrow_hashref()) { # 写入当前行三个字段 $worksheet->write($cur_row, 0, $db_row->{Row1}); $worksheet->write($cur_row, 1, $db_row->{Row2}); $worksheet->write($cur_row, 2, $db_row->{Row3}); # 行号自增准备写下一条 $cur_row++; # 如果需要保留控制台打印,可在这里加原来的printf逻辑 } # 关闭Excel文件,必须放在所有写入操作完成后 $workbook->close(); exit 0; sub init_db_connections { INV::DBI::init({ ------ => '--------', ------- => q{select Row1, Row2, Row3 from table1 } }); }
关键调整说明
- 重命名了SQL返回的行变量为
$db_row,避免和Excel的行号变量$cur_row冲突,防止变量覆盖导致的写入异常 - 统一了执行顺序,将Excel初始化操作放在SQL查询之前,保证游标返回结果时可以直接写入,不需要额外存储全部查询结果
- 补充了字段表头行,Excel内容结构更清晰,不需要的话可以删除对应代码段
$workbook->close()必须放在所有写入操作完成后执行,过早关闭会导致数据无法写入文件
内容的提问来源于stack exchange,提问作者K4M41D
相关产品推荐
相关产品推荐

