PHP#資料Excel導出的一些策略
導出其實在任何類型的後端系統都比較常見的excel導出其實在任何類型的後端系統都比較常見的用
做備份、底稿,理想情況下針對業務資料的任何業務操作都不應該依靠從後端業務系統導出資料然後人工進行干涉處理,但現實很骨感。 。 。資料導出這類的功能在有條件的情況下是須要封裝起來的,只有一個資料出口,在後續的業務規則調整變更時會真正的體現出它的價值。當一個典型的應用系統出現了五花八門的資料匯出需求,說明這個應用系統的業務分析做的不夠好或很差,當使用者只想用應用系統匯出資料來輔助他們的業務流程時,最恐怖的情況就會是使用者和資料庫的距離只是隔著一個匯出按鈕。 。 。
環境
1.PHP5.5.14 (cli) (built: Sep 9 201419:09:25) 2.PHP Excel 1.7.8 (http://www.codeplex.com/PHPExcel
)處理邏輯其實的關鍵點這套規則是否能適應業務流程,最基本的辦法就是將資料導出的流程抽象化為3
個基礎階段,而後每個階段可以再進行逐步的細化:1.
導出規則的定義2.
業務資料與導出規則的適配3.導出規則解析建構
Excel沒有進行任何封裝,沒有關注效能或其它擴展性問題。<?php namespace org\ybygjy\comp\excel; /** * Excel组件封装 * <p>1.统一处理工程中针对excel的数据导出</p> * @author WangYanCheng * @version 2015-1-22 */ class ExcelComp { /** * 构造函数 */ public function __construct() { require_once 'org/ybygjy/library/excel/PHPExcel.php'; } /** * 测试入口 */ public function doTest() { //构造原始数据 $dataArray = $this->buildData(); //导出 $this->doExportData($dataArray); } /** * 解析传递的原始数据并导出 * @param $dataArr */ public function doExportData($dataArr) { $phpObjExcel = new \PHPExcel(); $worksSheet = $phpObjExcel->setActiveSheetIndex(0); //构造表头数据_Begin $tmpColTitles = []; $firstDataEntry = $dataArr[0]; //分配列索引 $colIndex = 0; foreach($firstDataEntry as $key => $val) { if (preg_match('/^_/', $key)) { continue; } if (is_array($val)) { //取array下的列名称 $val = $val[0]; $rowNums = count($val); foreach ($val as $innerKey => $innerValue) { $tmpColTitles[] = array( 'parentKey' => $key, 'key' => $innerKey, 'colIndex' => $colIndex ); $colIndex++; } } else { $tmpColTitles[] = array( 'key'=>$key, 'colIndex'=>$colIndex ); $colIndex++; } } for($i = 0; $i < count($tmpColTitles); $i++) { $tmpObj = $tmpColTitles[$i]; $key = $tmpObj['key']; $colIndex = $tmpObj['colIndex']; $worksSheet->setCellValueByColumnAndRow($colIndex,1,$key); } //构造表头数据_End //填充单元格数据 $currRow = 2; foreach ($dataArr as $dataEntry) { $mergeRow = $dataEntry['_DIMENSION']; foreach ($tmpColTitles as $colEntry) { $key = $colEntry['key']; $colIndex = $colEntry['colIndex']; $parentKey = (isset($colEntry['parentKey']) ? $colEntry['parentKey'] : null); if (empty($parentKey)) { $value = $dataEntry[$key]; if ($mergeRow == 1) { $worksSheet->setCellValueByColumnAndRow($colIndex, $currRow, $value); } else { $worksSheet->mergeCellsByColumnAndRow($colIndex, $currRow, $colIndex, ($currRow + $mergeRow - 1))->setCellValueByColumnAndRow($colIndex, $currRow, $value); } } else { $tmpDataArr = $dataEntry[$parentKey]; $innerRow = $currRow; for($index = 0; $index < count($tmpDataArr); $index++) { $innerDataEntry = $tmpDataArr[$index]; $value = $innerDataEntry[$key]; $worksSheet->setCellValueByColumnAndRow($colIndex, $innerRow, $value); $innerRow++; } } } $currRow += $mergeRow; } header('Content-Type: application/vnd.ms-excel'); header('Content-Type: application/force-download'); header('Content-Type: application/octet-stream'); header('Content-Type: application/download'); header('Content-Disposition: attachment;filename="HelloWord.xls"'); header('Cache-Control: max-age=0'); header('Cache-Control: max-age=1'); header('Cache-Control: no-cache, must-revalidate'); header('Pragma: public'); $objWriter = \PHPExcel_IOFactory::createWriter($phpObjExcel, 'Excel5'); $objWriter->save('php://output'); } /** * 构造测试数据 * @return multitype:multitype:string number multitype:multitype:string */ private function buildData() { $rtnData = array( array( 'name'=>'YanCheng_01', 'age'=>'20', 'addr'=>array( array( 'country'=>'China', 'province'=>'ShanDong' ), array( 'country'=>'China', 'province'=>'BeiJing' ) ), '_DIMENSION'=>2 ), array( 'name'=>'YanCheng_02', 'age'=>'21', 'addr'=>array( array( 'country'=>'China', 'province'=>'LanZhou' ), array( 'country'=>'China', 'province'=>'NingXia' ) ), '_DIMENSION'=>2 ), array( 'name'=>'YanCheng_03', 'age'=>'22', 'addr'=>array( array( 'country'=>'China', 'province'=>'JiaYuGuan' ) ), '_DIMENSION'=>1 ) ); return $rtnData; } }
以上就介紹了PHP#資料Excel導出的一些策略,包括了方面的內容,希望對PHP教學有興趣的朋友有幫助。