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

DWZ 與 ThinkPHP 整合實現數據導出 Excel 功能實戰

     編輯:PHP 綜合知識

專案背景

在使用 DWZ 前端框架搭配 ThinkPHP 開發後台管理系統時,常需實現列表頁面的數據導出 Excel 功能。本文分享一個完整的解決方案,包含前端 jQuery 獲取勾選 ID 與後端 PHP 生成 Excel 下載的完整代碼。

前端 jQuery 實作

核心邏輯:獲取當前頁面(navTab 或 dialog)中被勾選的記錄 ID,組成字串傳遞給後端導出處理。

$(function(){
    /**
     * 獲取已選記錄的 ID
     * @param string selectedIds checkbox 的 name 屬性
     * @param string targetType 彈窗類型:navTab 或 dialog
     * @return string 逗號分隔的 ID 字串
     */
    function _getIds(selectedIds, targetType){
        var ids = "";
        var $box = targetType == "dialog" ? $.pdialog.getCurrent() : navTab.getCurrentPanel();
        
        $box.find("input:checked").filter("[name='" + selectedIds + "']").each(function(i){
            var val = $(this).val();
            ids += (i == 0 ? val : "," + val);
        });
        return ids;
    }

    // 導出 Excel 按鈕點擊事件(class=iconn)
    $(".iconn").click(function(){
        var targetType = "navTab";
        var selectedIds = "ids";
        var postType = "string";
        var ids = _getIds(selectedIds, targetType);
        
        if(!ids){
            alertMsg.error($(".iconn").attr("warn"));
            return false;
        } else {
            // 開啟新視窗請求導出,避免阻塞當前頁面
            window.open("__URL__/memberExport/ids/" + ids);
        }
    });
});

後端 ThinkPHP 控制器實作

採用原生 PHP header 輸出 Excel 格式,不依賴 PHPExcel 庫,輕量高效:

<?php
// 會員信息導出到 Excel
public function memberExport(){
    $id = $_REQUEST['ids']; // 獲取已選數據的 ID
    
    if(!$id){
        $this->error('非法操作!');
        return;
    }
    
    // 設定下載標頭
    $filename = date('Y-m-d');
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Type: application/force-download");
    header("Content-Type: application/vnd.ms-excel; charset=gb2312");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header('Content-Disposition: attachment; filename="' . $filename . '.xls"');
    header("Content-Transfer-Encoding: binary");
    
    // 查詢條件
    $map['id'] = array('in', $id);
    
    // 表頭欄位(需轉碼為 gbk 避免中文亂碼)
    $title = "用戶名\t姓名\t部門\t職務\t身份證\t職稱\t學歷\t畢業時間\t錄用時間";
    $title = iconv('utf-8', 'gbk', $title);
    echo $title;
    
    set_time_limit(0);
    $offset = 0;
    $length = 100;
    
    $Member = M('Member');
    $list = $Member->where($map)->order('id desc')->select();
    
    if(!$list){
        $this->error('操作錯誤!');
        return;
    }
    
    foreach($list as $key => $row){
        echo "\n";
        echo iconv('utf-8', 'gbk', $row['username']) . "\t";
        echo iconv('utf-8', 'gbk', $row['name']) . "\t";
        echo iconv('utf-8', 'gbk', $row['department']) . "\t";
        echo iconv('utf-8', 'gbk', $row['zhiwu']) . "\t";
        echo iconv('utf-8', 'gbk', $row['sfz']) . "\t";
        echo iconv('utf-8', 'gbk', $row['zhicheng']) . "\t";
        echo iconv('utf-8', 'gbk', $row['xueli']) . "\t";
        echo iconv('utf-8', 'gbk', $row['bytime']) . "\t";
        echo iconv('utf-8', 'gbk', $row['lytime']) . "\t";
    }
    
    $offset += $length;
}

關鍵技術點解析

  • DWZ 表格選取:利用 `navTab.getCurrentPanel()` 獲取當前標籤頁 DOM,配合 checkbox name 篩選
  • window.open 下載:避免 AJAX 無法直接觸發瀏覽器下載行為
  • 原生 Excel 輸出:使用 `\t` 分隔欄位、`\n` 換行,配合 `application/vnd.ms-excel` MIME 類型
  • 編碼轉換:`iconv('utf-8', 'gbk', ...)` 解決中文在 Excel 顯示亂碼問題
  • 分批處理:預留 `$offset`、`$length` 變數,大數據量時可擴展分頁查詢

擴展建議

  1. 大數據量時建議啟用分批查詢,避免記憶體溢出
  2. 可整合 PHPExcel 或 PhpSpreadsheet 支援 .xlsx 格式與樣式設定
  3. 增加導出欄位配置化,支援動態選擇導出欄位
  4. 加入導出日誌記錄,便於審計追蹤

此方案輕量、無第三方依賴,適合中小型專案快速實現數據導出需求。

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