在資料庫管理與報表製作的實務工作中,將 MySQL 資料匯出為 Excel 檔案是常見需求。本文介紹一個基於 Perl 的命令列工具,能夠高效地將 MySQL 查詢結果直接生成 Excel 97-2003 格式 (.xls) 的檔案,支援大量資料處理與中文編碼轉換,適合在 Linux 環境下自動化部署。
此腳本採用 Perl 語言編寫,核心依賴以下 CPAN 模組:
使用方式簡單:perl my2Excel.pl <輸出檔名> ",即可從指定資料表抓取符合條件的資料並寫入 .xls 檔案。
my $hostname = '192.168.1.133';
my $username = 'user';
my $passWord = 'pass';
my $dbname = 'db';
my $trans_compress = 1; # 啟用壓縮傳輸
實際部署時請修改上述連線參數,建議透過設定檔或環境變數管理敏感資訊。
die "syntax: my2Excel.pl \"[where expression]\""
unless @ARGV == 2;
my $sql = $ARGV[1];
$sql =~ s/\"//g; # 移除雙引號
my $dbh = DBI->connect(
"DBI:mysql:mysql_compression=$trans_compress;database=$dbname;host=$hostname",
$username, $passWord
) or die $DBI::errstr;
my $sth = $dbh->prepare($sql) or die $dbh->errstr;
my $rows = $sth->execute() or die $sth->errstr;
warn "rows: $rows found.\n";
腳本接受兩個參數:輸出檔名與 WHERE 條件子句(不含 WHERE 關鍵字)。執行查詢後取得欄位名稱陣列 @{$sth->{NAME}}。
my @cols = ('A:A','B:B','C:C', ..., 'ZZ:Z'); # 支援至 ZZ 欄
for my $i (0 .. $#cols_name) {
$sheet->set_column($cols[$i], length($cols_name[$i]) + 4);
$sheet->write_unicode($sheet_col, $i, $map->to_unicode($cols_name[$i]), $title_style);
}
$sheet->freeze_panes(1, 0); # 凍結標題列
預先定義 Excel 欄位字母對應表,自動依欄位名稱長度調整寬度,並以粗體置中格式寫入標題列。
my $map = Unicode::Map->new("gb2312");
my $report = Spreadsheet::WriteExcel::Big->new($ARGV[0]) or die "無法建立報表:$!";
while (my @row = $sth->fetchrow_array) {
$sheet_col++;
for my $i (0 .. $#cols_name) {
next if $row[$i] eq '';
$sheet->write_unicode($sheet_col, $i, $map->to_unicode($row[$i]));
}
}
warn "all done!!!\n";
使用 Unicode::Map 將資料從資料庫編碼(通常為 UTF-8)轉為 GB2312 再寫入 Excel,確保中文顯示正常。Spreadsheet::WriteExcel::Big 解決了舊版模組無法處理 65,535 列以上資料的限制。
END {
$report->close() if $report;
$dbh->disconnect();
}
END 區塊確保程式結束時正確關閉檔案與資料庫連線,避免資源洩漏。
# 匯出 users 表中 status=1 的所有資料
perl my2Excel.pl active_users.xls "SELECT * FROM users WHERE status = 1"
# 匯出訂單表近 30 天資料
perl my2Excel.pl recent_orders.xls "SELECT * FROM orders WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)"
gb2312 改為 cp950 或 big5--defaults-file 或環境變數pandas + openpyxl 或 xlsxwriter,支援 .xlsx 格式且維護性更佳此 Perl 腳本提供了一個輕量、可自動化的 MySQL 轉 Excel 解決方案,特別適合舊版 Linux 伺服器環境或需整合至 Shell 腳本流程的場景。透過模組化設計,易於擴充支援更多資料來源、輸出格式或編碼選項。