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

PHP 導出帶樣式 Excel 的兩種方案:HTML 表格法與 Spreadsheet_Excel_Writer 庫法

     編輯:PHP 綜合知識

方案一:HTML 表格偽裝法(零依賴、最簡單)

核心原理

設置 Content-Type: application/vnd.ms-excel 響應頭,輸出帶內聯樣式的 HTML <table>,Excel 打開時會自動渲染樣式。

控制器代碼

public function export() {
    $fileName = "成績單-" . date("Y-m-d_H-i-s");
    
    header("Content-Type: application/vnd.ms-excel; charset=utf-8");
    header("Content-Disposition: attachment; filename={$fileName}.xls");
    header("Cache-Control: max-age=0");
    
    // 此處可進行數據查詢、模板賦值
    $this->display(); // 輸出 HTML 模板
}

視圖模板 export.html

<html xmlns:o="urn:schemas-microsoft-com:office:office" 
      xmlns:x="urn:schemas-microsoft-com:office:excel" 
      xmlns="https://www.w3.org/TR/REC-html40">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="ProgId" content="Excel.Sheet">
    <meta name="Generator" content="Microsoft Excel 11">
</head>
<body>
    <table border="1" cellpadding="0" cellspacing="0" width="100%">
        <tr>
            <td colspan="5" align="center"><h2>成績單</h2></td>
        </tr>
        <tr style="background:#4472C4; color:white; font-weight:bold;">
            <td style="width:54pt" align="center">編號</td>
            <td style="width:54pt" align="center">姓名</td>
            <td style="width:54pt" align="center">語文</td>
            <td style="width:54pt" align="center">數學</td>
            <td style="width:54pt" align="center">英語</td>
        </tr>
        <tr>
            <td align="center">1</td>
            <td style="background:#C6EFCE" align="center">張三</td>
            <td style="background:#BDD7EE" align="center">90</td>
            <td style="background:#C6EFCE" align="center">85</td>
            <td style="background:#BDD7EE" align="center">100</td>
        </tr>
        <tr>
            <td align="center">2</td>
            <td style="background:#C6EFCE" align="center">李四</td>
            <td style="background:#BDD7EE" align="center">99</td>
            <td style="background:#C6EFCE" align="center">85</td>
            <td style="background:#BDD7EE" align="center">80</td>
        </tr>
    </table>
</body>
</html>

支持的樣式屬性

  • background-color / background:單元格背景
  • color:字體顏色
  • font-weight: bold:加粗
  • text-align:對齊
  • border:邊框
  • width/height:列寬/行高
  • mso-number-format:數字格式(如 @ 文本、0.00 兩位小數)

合並單元格

<td colspan="3">跨三列</td>
<td rowspan="2">跨兩行</td>

方案二:Spreadsheet_Excel_Writer 庫(真正的 .xls 二進制格式)

安裝依賴

# PEAR 安裝
pear install OLE
pear install Spreadsheet_Excel_Writer

# 或 Composer (非官方分支)
composer require phpoffice/spreadsheet-excel-writer

完整導出代碼

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$filename = date('YmdHis') . '.xls';
$workbook->send($filename); // 發送下載頭

$workbook->setVersion(8); // Excel 97+ 格式
$sheet = $workbook->addWorksheet('成績單');
$sheet->setInputEncoding('utf-8');

// 定義格式
$titleFmt = $workbook->addFormat([
    'Size' => 14, 'Align' => 'center', 'Bold' => 1,
    'Color' => 'white', 'FgColor' => 'navy', 'Border' => 1
]);
$headerFmt = $workbook->addFormat([
    'Size' => 12, 'Align' => 'center', 'Bold' => 1,
    'FgColor' => 'silver', 'Border' => 1
]);
$dataFmt = $workbook->addFormat([
    'Size' => 10, 'Align' => 'center', 'Border' => 1
]);

// 列寬
$sheet->setColumn(0, 4, 15);

// 寫入標題(合並單元格)
$sheet->write(0, 0, '成績單', $titleFmt);
$sheet->mergeCells(0, 0, 0, 4);

// 表頭
$headers = ['編號', '姓名', '語文', '數學', '英語'];
foreach ($headers as $col => $h) {
    $sheet->write(1, $col, $h, $headerFmt);
}

// 數據
$data = [
    [1, '張三', 90, 85, 100],
    [2, '李四', 99, 85, 80],
];
foreach ($data as $rowIdx => $row) {
    foreach ($row as $colIdx => $val) {
        $sheet->write($rowIdx + 2, $colIdx, $val, $dataFmt);
    }
}

$workbook->close();

方案對比與選型建議

維度HTML 表格法Spreadsheet_Excel_Writer
依賴無PEAR/Composer 包
格式HTML 偽裝 .xls真正 BIFF .xls 二進制
樣式豐富度基本 CSS 子集完整 Excel 格式支持
大數據性能較差(字符串拼接)較好(流式寫入)
兼容性Excel/WPS/LibreOffice 皆可Excel 完美,其他可能有差異
維護狀態長期可用PEAR 庫已停止更新

現代最佳選擇:PhpSpreadsheet (繼承 PHPExcel)

composer require phpoffice/phpspreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello')->getStyle('A1')->getFont()->setBold(true)->setSize(14);

$writer = new Xlsx($spreadsheet);
$writer->save('php://output'); // 直接輸出下載

優勢

  • 支持 .xlsx/.xls/.csv/.ods 多格式
  • 活躍維護、文檔完善、功能豐富(圖表、圖片、公式、數據驗證)
  • 內存優化模式處理大文件
  • PSR-4 自動加載,現代框架無縫集成

總結

  • 簡單報表、內部工具:HTML 表格法 最快
  • 需真實 .xls、兼容舊系統:Spreadsheet_Excel_Writer
  • 新項目首選 PhpSpreadsheet,功能最全、維護最好
  • 超大數據導出(>10萬行):使用 分塊寫入 + 臨時文件 + 流式下載 避免內存溢出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved