在使用 DWZ 前端框架搭配 ThinkPHP 開發後台管理系統時,常需實現列表頁面的數據導出 Excel 功能。本文分享一個完整的解決方案,包含前端 jQuery 獲取勾選 ID 與後端 PHP 生成 Excel 下載的完整代碼。
核心邏輯:獲取當前頁面(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);
}
});
});
採用原生 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;
}
此方案輕量、無第三方依賴,適合中小型專案快速實現數據導出需求。