前瞻
- 本文檔需求:在有的時候,需要將顯示的列表數據導出excel進行操作,比如:log日志,調查問卷等。本文將舉例將log日志導出:
- 框架:thinkphp3.2
正文:
-
前期準備:
-
百度搜索phpexcel,找到官網,如下:
-
進入官網,點擊download
解壓(應該有幾個文件夾,只需要PHPexcel文件即可)
也可以去我網盤拉下來
鏈接:http://pan.baidu.com/s/1dEZtkBn 密碼:582d
將文件夾PHPexcel放到
項目路徑\ThinkPHP\Library\Vendor
下(方便調用,如果放在別的地方用include能夠引用到PHPexcel.php就可以)
-
-
開始程序
- 在使用到的控制器中添加如下代碼:
//頁面
<table class="search_tab">
<tr>
<th width="50">導出向導:</th>
<td><input type="text" name="bid" placeholder="開始id"></td>
<td><input type="text" name="eid" placeholder="結束id"></td>
<td>
<a href="javascript:;" onclick="output()" class="addrule">導出excle</a>
</td>
</tr>
</table>
<script>
//添加規則function output(){
var bid = $( "input[name='bid']" ).val();
var eid = $( "input[name='eid']" ).val();
url = 'output/bid/'+bid+'/eid/'+eid;//這個url自己根據情況自己拼接就可以了,我這里是跳轉到控制器文件的output方法
location.href = url;
}
</script>
//控制器文件
/**
*
*日志導出為excel
* @param int $begin 開始id
* @param int $end 結束id
*/
public function output() {
//導出商家信息Excel
$begin = I('get.bid');
$end = I('get.eid');
$xlsName = "log";
//此處設置的是excel表的頭部標題那一樣,這塊需要注意log_id,operator這些要和數據庫的字段對應,操作用戶,操作用戶ip等根據需要自己編輯,和列表的<th></th>一樣就可以
$xlsCell = array(
array('log_id', 'ID'),
array('operator', '操作用戶'),
array('ip', '操作用戶ip'),
array('msg', '操作描述'),
array('id', '操作id'),
array('func', '操作標題'),
array('time', '操作時間'),
);
$condition['log_id'] = array(between,array($begin,$end));
//$log的數據要是個二維關聯數組,key的值要和$xlsCell的對應,只有對應上的才有數據,我的數據表存的是json數據,所以需要轉化下(下面有我的數據表),正常數據情況下,直接select的數據就可以使用,不用改變
$log = M('Log')->where($condition)->order('log_time')->select();
//將log_desc字段的json數據取出來(注意:數據還是二維數組)
foreach( $log as $k=>$vo ) {
$vo['log_desc'] = json_decode( $vo['log_desc'] );
$log[$k]['operator'] = $vo['log_desc']->operator;
$log[$k]['ip'] = $vo['log_desc']->ip;
$log[$k]['msg'] = $vo['log_desc']->msg;
$log[$k]['id'] = $vo['log_desc']->id;
$log[$k]['func'] = $vo['log_desc']->func;
$log[$k]['time'] = date('Y-m-d H:i:s',$vo['log_desc']->time);
unset($log[$k]['log_desc']);
unset($log[$k]['log_time']);
}
$this->exportExcel($xlsName, $xlsCell, $log);
}
//所有日志表格導出模板
public function exportExcel($expTitle, $expCellName, $expTableData) {
$xlsTitle = iconv('utf-8', 'gb2312', $expTitle); //文件名稱
$fileName = 'log日志表' . date('_YmdHis'); //or $xlsTitle 文件名稱可根據自己情況設定
$cellNum = count($expCellName);
$dataNum = count($expTableData);
vendor("PHPExcel.PHPExcel");//此處開始調用phpexcel類,如果放置目錄不和我的一樣,那就用include_once調用即可
$objPHPExcel = new\PHPExcel();
$cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(22);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(22);
$objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(15);
$objPHPExcel->getActiveSheet(0)->mergeCells('A1:' . $cellName[$cellNum - 1] . '1');//合并單元格
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'log日志表')->getStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
for ($i = 0; $i < $cellNum; $i++) {
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
}
// Miscellaneous glyphs, UTF-8
for ($i = 0; $i < $dataNum; $i++) {
for ($j = 0; $j < $cellNum; $j++) {
$objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j] . ($i + 3), " ".$expTableData[$i][$expCellName[$j][0]]);
}
}
ob_end_clean(); //清除緩沖區,避免亂碼
header('pragma:public');
header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle. '.xls"');
header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新窗口打印inline本窗口打印
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
}
-
我的數據表
-
下面這種數據表就不需要了修改了,查詢出來就可以
-
代碼完成,點擊導出就可以了
注意
- 如果excel不出現數據,差看下面是否與數據庫字段對應上
$xlsCell = array(
array('log_id', 'ID'),
array('operator', '操作用戶'),
array('ip', '操作用戶ip'),
array('msg', '操作描述'),
array('id', '操作id'),
array('func', '操作標題'),
array('time', '操作時間'), );
-
如果不是使用的tp框架,把文件放入項目之后,自己在下方使用include,include_once等引入即可,根據框架使用查詢語言獲取數據,原生的也是一樣的
-
如果導出數據之后,excel的中文數據都是FALSE,應該是字符集的問題,設置utf-8格式就可以了,應該和下面對應就行