Excel匯出,支援副標題
阿新 • • 發佈:2020-08-19
<?php /** * Excel 助手 * sudo composer require phpoffice/phpspreadsheet */ namespace Common\Util; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Color; class ExcelUtil extends CommonUtil { public function __construct() { parent::__construct(); } /** * 匯出資料 */ public function exportExcel($expTitle, $expCellName, $expTableData, $subTitle) { $fileName = $expTitle; $spreadsheet = new Spreadsheet(); // 獲取活動的工作空間 $worksheet = $spreadsheet->getActiveSheet(); $cellNum = count($expCellName); $dataNum = count($expTableData); $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'); // 合併單元格 $worksheet->mergeCells('A1:' . $cellName[$cellNum - 1] . '1'); // 設定第一格的內容 $worksheet->setCellValue('A1', $expTitle); // 設定加粗 $worksheet->getStyle('A1')->getFont()->setBold(true); // 設定居中 $styleArray = [ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, ], ]; $worksheet->getStyle('A1')->applyFromArray($styleArray); // 設定顏色 $worksheet->getStyle('A1')->getFont()->getColor()->setARGB(Color::COLOR_DARKRED); // 設定標題 $worksheet->setTitle($expTitle); if ($subTitle) { // 合併單元格 $worksheet->mergeCells('A2:' . $cellName[$cellNum - 1] . '2'); // 設定第一格的內容 $worksheet->setCellValue('A2', $subTitle); // 設定居中 $styleArray = [ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, ], ]; $worksheet->getStyle('A2')->applyFromArray($styleArray); // 設定顏色 $worksheet->getStyle('A2')->getFont()->getColor()->setARGB(Color::COLOR_DARKGREEN); // 設定表格選單 for ($i = 0; $i < $cellNum; $i++) { $worksheet->setCellValue($cellName[$i] . (+3), $expCellName[$i][1]); $worksheet->getStyle($cellName[$i] . (+3))->getFont()->setBold(true); // 自動寬度 $worksheet->getColumnDimension($cellName[$i])->setAutoSize(true); } // 設定表格內容 for ($i = 0; $i < $dataNum; $i++) { for ($j = 0; $j < $cellNum; $j++) { $worksheet->setCellValue($cellName[$j] . ($i + 4), $expTableData[$i][$expCellName[$j][0]]); // 支援換行 if ($expCellName[$j][2] == 1) { $worksheet->getStyle($cellName[$j] . ($i + 4))->getAlignment()->setWrapText(true); } } } } else { // 設定表格選單 for ($i = 0; $i < $cellNum; $i++) { $worksheet->setCellValue($cellName[$i] . (+2), $expCellName[$i][1]); $worksheet->getStyle($cellName[$i] . (+2))->getFont()->setBold(true); // 自動寬度 $worksheet->getColumnDimension($cellName[$i])->setAutoSize(true); } // 設定表格內容 for ($i = 0; $i < $dataNum; $i++) { for ($j = 0; $j < $cellNum; $j++) { $worksheet->setCellValue($cellName[$j] . ($i + 3), $expTableData[$i][$expCellName[$j][0]]); // 支援換行 if ($expCellName[$j][2] == 1) { $worksheet->getStyle($cellName[$j] . ($i + 3))->getAlignment()->setWrapText(true); } } } } // 設定列寬為自動 // $spreadsheet->getActiveSheet()->getDefaultColumnDimension()->setWidth(20); // $worksheet->getDefaultColumnDimension()->setAutoSize(true); // 設定行高 $worksheet->getDefaultRowDimension()->setRowHeight(20); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); //告訴瀏覽器輸出07Excel檔案 //header('Content-Type:application/vnd.ms-excel');//告訴瀏覽器將要輸出Excel03版本檔案 header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx"'); //告訴瀏覽器輸出瀏覽器名稱 header('Cache-Control: max-age=0'); //禁止快取 $writer = new Xlsx($spreadsheet); $writer->save('php://output'); } }
使用
/** * 匯出資料 */ public function export_data() { $id = $_GET['survey_id']; $survey = M('survey'); $survey_info = $survey->where(array('id' => $id))->find(); if (!$survey_info) { $this->error('引數錯誤', 'index'); } // 獲取題目 $survey_question = M('survey_question'); $survey_question_item = M('survey_question_item'); $survey_answer = M('survey_answer'); $survey_question_list = $survey_question->where(['survey_id'=>$id,'deleted'=>0])->order('weight desc,id asc')->select(); foreach($survey_question_list as $k => &$v) { $v['subject'] = ($k+1).'、'.$v['subject']; if ($v['type'] == 1) { $v['type_str'] = '單選'; // 獲取選項和各選項答題數量 $item_list = $survey_question_item->where(['question_id'=>$v['id'],'deleted'=>0])->select(); foreach($item_list as $ik => &$iv) { $count = $survey_answer->where(['question_id'=>$v['id'],'answer'=>['like','%,'.$iv['id'].',%']])->count(); if ($ik+1 == count($item_list)) { $v['result'] .= $iv['option']."【".$count."個回答】"; } else { $v['result'] .= $iv['option']."【".$count."個回答】\r\n"; } } } if ($v['type'] == 2) { $v['type_str'] = '多選'; // 獲取選項和各選項答題數量 $item_list = $survey_question_item->where(['question_id'=>$v['id'],'deleted'=>0])->select(); foreach($item_list as $ik => &$iv) { $count = $survey_answer->where(['question_id'=>$v['id'],'answer'=>['like','%,'.$iv['id'].',%']])->count(); if ($ik+1 == count($item_list)) { $v['result'] .= $iv['option']."【".$count."個回答】"; } else { $v['result'] .= $iv['option']."【".$count."個回答】\r\n"; } } } if ($v['type'] == 3) { $v['type_str'] = '問答'; // 獲取回答結果 $answer_list = $survey_answer->where(['question_id'=>$v['id'],'deleted'=>0])->select(); foreach($answer_list as $ak => &$av) { if ($ak+1 == count($answer_list)) { $v['result'] .= "回答".($ak+1)."【".$av['answer']."】"; } else { $v['result'] .= "回答".($ak+1)."【".$av['answer']."】\r\n"; } } } } $survey_company = M('survey_company'); $survey_company_list = $survey_company->where(['survey_id' => $id, 'deleted' => 0])->select(); $company_count = count($survey_company_list); $sub_count = 0; foreach ($survey_company_list as $sv) { if ($sv['is_sub']) { $sub_count++; } } $company_sub_count = $sub_count; $subTitle = '本次分配了'.$company_count.'個企業,提交了'.$company_sub_count.'個企業'; $xlsCell = array( array('subject', '題目名稱'), array('type_str', '題目型別'), array('result', '答題結果'), ); $xlsName = '調查問卷《'.$survey_info['title'].'》統計結果'; $excelUtil = new ExcelUtil(); $excelUtil->exportExcel($xlsName, $xlsCell, $survey_question_list,$subTitle); }