首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 導出 Excel 實戰:Spreadsheet_Excel_Writer 從入門到樣式進階

     編輯:PHP 綜合知識

為什麼選擇 Spreadsheet_Excel_Writer?

  • 純 PHP 實現,無需 COM 元件或 Java 橋接
  • 產生真正的 BIFF (Excel 97-2003 .xls) 格式,相容性極佳
  • 支援儲存格樣式、合併、公式、多工作表、頁首頁尾
  • PEAR 官方維護,穩定成熟

安裝

# PEAR 安裝
pear install Spreadsheet_Excel_Writer-0.9.4

# Composer (非官方分支,含 PHP 7/8 相容修正)
composer require pear/spreadsheet_excel_writer

基礎範例:產生簡單報表

<?php
require_once 'Spreadsheet/Excel/Writer.php';

// 1. 建立工作簿並直接輸出到瀏覽器
$workbook = new Spreadsheet_Excel_Writer();
$workbook->send('sales_report.xls'); // 必須在任何輸出前呼叫

// 2. 新增工作表
$sheet = $workbook->addWorksheet('銷售明細');

// 3. 定義格式
$headerFmt = $workbook->addFormat([
    'Bold'   => 1,
    'Size'   => 12,
    'Color'  => 'white',
    'FgColor'=> 'navy',
    'Align'  => 'center',
    'Border' => 1,
]);
$numberFmt = $workbook->addFormat(['NumFormat' => '#,##0.00', 'Align' => 'right']);
$dateFmt   = $workbook->addFormat(['NumFormat' => 'YYYY-MM-DD', 'Align' => 'center']);

// 4. 寫入標題列
$headers = ['日期', '商品', '數量', '單價', '金額'];
foreach ($headers as $col => $title) {
    $sheet->write(0, $col, $title, $headerFmt);
}

// 5. 模擬資料寫入
$data = [
    ['2024-01-15', '筆記型電腦', 5, 25000, 125000],
    ['2024-01-16', '滑鼠', 20, 350, 7000],
    ['2024-01-17', '螢幕', 3, 8500, 25500],
];
foreach ($data as $rowIdx => $row) {
    $r = $rowIdx + 1;
    $sheet->write($r, 0, $row[0], $dateFmt);
    $sheet->write($r, 1, $row[1]);
    $sheet->write($r, 2, $row[2]);
    $sheet->write($r, 3, $row[3], $numberFmt);
    $sheet->writeFormula($r, 4, "=C{$r}*D{$r}", $numberFmt); // 公式
}

// 6. 設定欄寬
$sheet->setColumn(0, 0, 12);
$sheet->setColumn(1, 1, 20);
$sheet->setColumn(2, 4, 14);

// 7. 關閉並輸出
$workbook->close();
?>

進階技巧

需求實現方式
合併儲存格$sheet->mergeCells('A1:E1'); // 標題跨欄
凍結窗格$sheet->freezePanes([1, 0]); // 凍結首列
自動過濾$sheet->autofilter(0, 0, count($data), 4);
資料驗證 (下拉)$sheet->dataValidationList(1, 1, count($data), 1, ['筆電','滑鼠','螢幕']);
插入圖片$sheet->insertBitmap(0, 5, 'logo.bmp'); // 僅支援 BMP
頁首/頁尾$sheet->setHeader('&L報表&R第 &P 頁'); $sheet->setFooter('&C機密');
隱藏網格線$sheet->hideGridLines();

常見坑點與解決

  • 中文亂碼:確保 PHP 檔案為 UTF-8,且資料已為 UTF-8;Writer 內部會自動轉 Latin1,若出現問號請檢查 iconv('UTF-8', 'CP936', $str) (繁體用 CP950)。
  • 大數據量記憶體爆炸:Writer 將整個檔案建立在記憶體,超過 5 萬列建議改用 PhpSpreadsheet (支援串流寫入 .xlsx) 或分批生成多檔案打包下載。
  • 公式不計算:.xls 由 Excel 開啟時會自動重算;若需純 PHP 讀取計算結果,需 PhpSpreadsheet 的計算引擎。
  • PHP 8 相容:官方 PEAR 套件停更,請用 composer require pear/spreadsheet_excel_writer 社群維護分支。

對比:何時遷移到 PhpSpreadsheet?

  • 需要 .xlsx (OOXML) 格式
  • 資料量 > 5 萬列 / 記憶體受限
  • 需支援圖表、樞紐分析表、豐富條件格式
  • PHP 8.1+ 專案

PhpSpreadsheet API 相似,遷移成本低,長期維護更安心。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved