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

PHP 導出考核統計至 Excel 的完整實現方案

     編輯:PHP 相關知識

前言

在企業級應用開發中,數據導出功能是剛需。本文將詳細解析一個基於 PHP 實現的考核統計導出 Excel 功能,包含核心邏輯代碼與底層 Excel 生成類的完整實現,助你快速掌握服務端生成二進制 .xls 文件的技巧。

核心導出邏輯解析

daochu() 函數作為入口,主要完成以下流程:

  1. 引入 Excel 生成類 outExcel.class.php
  2. 設置 HTTP 響應頭,聲明文件類型為 Excel 並處理中文文件名編碼兼容性(IE、Firefox 等瀏覽器差異)
  3. 通過 PerformanceServices 服務層獲取考核基本信息與統計數據
  4. 初始化 SimpleExcel 類,寫入標題行、表頭與數據行
  5. 調用 excelEnd() 輸出文件結尾標記,完成下載

關鍵代碼片段

function daochu(){
    require_once 'outExcel.class.php';
    header("Content-Type: application/vnd.ms-excel;charset=utf-8");
    $kaoheCode = $_GET['kaoheCode'];
    $dao = new PerformanceServices();
    $kaoheinfo = $dao->getKaoheInfo($kaoheCode);
    $filename = $kaoheinfo['KH_NAME']."考核統計";
    // ... 文件名編碼兼容處理 ...
    header('Content-Type: application/octet-stream');
    // ... 瀏覽器差異化 Content-Disposition ...
    header("Pragma: no-cache");
    header("Expires: 0");

    $dates_excel = $dao->getTongjiInfo($kaoheCode);
    $mytime = date("Y-m-d H:i:s", $dates_excel['KH_TIME']);
    
    $excel = new SimpleExcel();
    $excel->excelItem(array("統計時間", $mytime));
    $excel->excelItem(array("序號", "姓 名", "部門", "分數"));
    $excel->colsAttrib(array("1", "a", "a", "1")); // 1=數值型, a=字符型
    
    $scores = explode(',', $dates_excel['KH_SCORES']);
    $i = 0;
    foreach ($scores as $v) {
        $i++;
        $r = explode(':', $v);
        $userCode = $r[0];
        $user = $dao->getUserInfo($userCode);
        $dept = $dao->getCellName($userCode);
        $excel->excelWrite(array($i, $user['QT_NAME'], $dept, $r[1]));
    }
    $excel->excelEnd();
}

底層 Excel 生成類:SimpleExcel 深度剖析

該類採用 BIFF 格式(Binary Interchange File Format)直接輸出二進制 .xls 文件流,無需依賴 PHPExcel 等重型庫,極其輕量高效。

核心方法說明

方法功能關鍵點
構造函數輸出 BIFF 文件頭標識pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0)
excelItem()寫入標題/表頭行逐單元格打包標籤 0x204 (LabelSST)
colsAttrib()定義列屬性數組值 "1" 表數值,"a" 表字符串
excelWrite()寫入數據行根據屬性選擇 0x203 (Number) 或 0x204 (Label)
excelEnd()輸出 EOF 標記pack("ss", 0x0A, 0x00)
iconvToData()編碼轉換UTF-8 → GB2312,確保 Excel 正確顯示中文

完整類代碼

<?php
class SimpleExcel {
    var $rowsNum = 0;
    var $attrib = array();
    var $in_charset = 'UTF-8';

    function SimpleExcel() {
        echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
        return;
    }

    function excelItem($string = array()) {
        for ($i = 0; $i < count($string); $i++) {
            $curStr = $this->iconvToData($string[$i]);
            $L = strlen($curStr);
            echo pack("ssssss", 0x204, 8 + $L, $this->rowsNum, $i, 0x0, $L);
            echo $curStr;
        }
        $this->rowsNum++;
        return;
    }

    function colsAttrib($string = array()) {
        $this->attrib = $string;
        return;
    }

    function excelWrite($string = array()) {
        for ($i = 0; $i < count($string); $i++) {
            $curStr = $this->iconvToData($string[$i]);
            if ($this->attrib[$i] == "1") {
                echo pack("sssss", 0x203, 14, $this->rowsNum, $i, 0x0);
                echo pack("d", $curStr);
            } else {
                $L = strlen($curStr);
                echo pack("ssssss", 0x204, 8 + $L, $this->rowsNum, $i, 0x0, $L);
                echo $curStr;
            }
        }
        $this->rowsNum++;
    }

    function excelEnd() {
        echo pack("ss", 0x0A, 0x00);
        return;
    }

    function iconvToData($data) {
        return iconv($this->in_charset, 'gb2312', $data);
    }
}
?>

實戰注意事項與優化建議

  • 編碼陷阱:輸出前必須 iconv('UTF-8', 'GB2312'),否則中文會亂碼;若項目統一 UTF-8,建議改用 UTF-16LE BOM 方案或引入 PhpSpreadsheet。
  • 大數據導出:當前實現將所有數據載入內存再輸出,百萬行級別易 OOM。建議改用 fwrite 分塊寫入臨時文件,或採用生成器模式流式輸出。
  • 格式擴展:僅支持基礎文本/數值,若需合併儲存格、樣式、公式,請遷移至 PhpSpreadsheet。
  • 安全性:$_GET['kaoheCode'] 直接用於查詢,務必在 Service 層做參數綁定/白名單校防 SQL 注入。

現代化替代方案對比

方案優點缺點適用場景
SimpleExcel (本文)零依賴、極快、文件極小功能極簡、編碼麻煩、維護成本高極簡導出、舊項目維護
PhpSpreadsheet功能全、支持 .xlsx/.ods、活躍維護內存佔用大、速度較慢複雜報表、樣式需求、現代項目
Box/Spout流式讀寫、常數內存、速度快不支持圖表/宏、樣式受限大數據導出、高併發場景
Laravel-Excel集成優雅、隊列導出、模板支持依賴 Laravel 生態Laravel 項目標配

總結

本文完整展示了從業務邏輯到底層二進制構造的 Excel 導出實現。雖然 SimpleExcel 在現代項目中已較少直接使用,但其「無依賴、直輸出二進制」的設計思想極具參考價值,適合理解 Excel 文件結構、排查導出亂碼、或在極度受限環境下快速落地。新項目建議優先選擇 PhpSpreadsheet 或 Box/Spout,獲得更好的可維護性與擴展性。

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