商務用戶習慣使用 Excel 分析資料。雖可透過 ODBC 連結資料庫,但部署連線環境複雜。開發人員直接從資料庫產出 .xls 檔,再透過 Email 或網站下發,是更輕量且通用的方案。
John McNamara 開發的 Perl 模組,能動態產生真正的 Excel 二進位檔,支援:
use DBI;
use Spreadsheet::WriteExcel;
# 連線資料庫
my $dbh = DBI->connect('dbi:Oracle:','scott','tiger') || die $DBI::errstr;
print "Generating Excel Spreadsheet\n";
# 建立活頁簿與工作表
my $workbook = Spreadsheet::WriteExcel->new("emp.xls");
my $worksheet = $workbook->add_worksheet();
# 定義格式
my $fmt = {
HEADER => $workbook->add_format(bold=>1, align=>'center', bottom=>2, bg_color=>'silver'),
ENAME => $workbook->add_format(bold=>1, color=>'blue'),
MONEY => $workbook->add_format(num_format=>'$#,##0.00', align=>'right'),
TOTAL => $workbook->add_format(num_format=>'$#,##0.00', align=>'right', bold=>1, top=>2),
};
# 寫入標題列
my $r = 1;
$worksheet->write($r-1, 0, 'Employee', $fmt->{HEADER});
$worksheet->write($r-1, 1, 'Salary', $fmt->{HEADER});
$worksheet->write($r-1, 2, 'Commission',$fmt->{HEADER});
$worksheet->write($r-1, 3, 'Total', $fmt->{HEADER});
$r++;
# 查詢資料並寫入,含公式計算總薪
my $sth = $dbh->prepare('SELECT * FROM emp') || die $DBI::errstr;
$sth->execute;
while (my $row = $sth->fetchrow_hashref) {
$worksheet->write($r-1, 0, $row->{ENAME}, $fmt->{ENAME});
$worksheet->write($r-1, 1, $row->{SAL}, $fmt->{MONEY});
$worksheet->write($r-1, 2, $row->{COMM}, $fmt->{MONEY});
$worksheet->write($r-1, 3, "=B$r+C$r", $fmt->{MONEY}); # Excel 公式
$r++;
}
# 總計列
$worksheet->write($r-1, 0, '', $fmt->{TOTAL});
$worksheet->write($r-1, 1, "=SUM(B2:B".($r-1).")", $fmt->{TOTAL});
$worksheet->write($r-1, 2, "=SUM(C2:C".($r-1).")", $fmt->{TOTAL});
$worksheet->write($r-1, 3, "=B$r+C$r", $fmt->{TOTAL});
print "Processed " . ($r-2) . " rows\n";
$sth->finish;
此方案無需用戶端安裝任何驅動程式,即可獲得專業級 Excel 報表,是資料對帳、管理報表自動化的最佳選擇。