php phpoffice/phpspreadsheet 讀取 生成 excel檔案
阿新 • • 發佈:2022-04-20
利用composer安裝PhpSpreadsheet到專案目錄
https://packagist.org/packages/phpoffice/phpspreadsheet
// 引入包
composer require phpoffice/phpspreadsheet
匯出程式碼
<?php use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Style\Alignment; include_once "./vendor/autoload.php"; /** * 數字轉字母(類似excel列標) * @param $index * @param int $start * @return string */ function intToChr($index, int $start = 65): string { $str = ''; if (floor($index / 26) > 0) { $str .= intToChr(floor($index / 26) - 1); } return $str . chr($index % 26 + $start); } /** * 每個sheet設定 * @param $spreadsheet * @param $sheetIndex * @param $data */ function handlingMultipleSheet($spreadsheet, $sheetIndex, $data) { // 建立sheet $spreadsheet->createSheet(); // 設定當前的活動sheet $activeSheet = $spreadsheet->setActiveSheetIndex($sheetIndex); // 設定每個sheet中的名稱 title $activeSheet->setCellValue('A1', $data['title']); // 這是你的資料鍵名 $rows = $data['rows'][0]; // 計算你所佔的列數 $columnsCount = count($rows); // 求k-v值的所佔行數 $infoNum = ceil(count($data['info']) / 2); // 下面的詳細資訊的開始行數 $infoStart = $infoNum + 2; $cellName = []; for ($column = 0; $column < $columnsCount; $column++) { array_push($cellName, intToChr($column)); } // 設定標題欄的名稱 $sheet = $spreadsheet->getActiveSheet($sheetIndex)->setTitle($data['info']['姓名:']); // 合併標題欄單元格 $spreadsheet->getActiveSheet($sheetIndex)->mergeCells('A1:' . $cellName[$columnsCount - 1] . '1'); // 設定標題欄的字型大小 $spreadsheet->getActiveSheet($sheetIndex)->getStyle('A1')->getFont()->setSize(20); // 中部資料居中 $spreadsheet->getActiveSheet($sheetIndex)->getStyle('A1')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $spreadsheet->getActiveSheet($sheetIndex)->getStyle('A')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $spreadsheet->getActiveSheet($sheetIndex)->getStyle('B')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $spreadsheet->getActiveSheet($sheetIndex)->getStyle('C')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $spreadsheet->getActiveSheet($sheetIndex)->getStyle('D')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $spreadsheet->getActiveSheet($sheetIndex)->getStyle('E')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $spreadsheet->getActiveSheet($sheetIndex)->getStyle('F')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $spreadsheet->getActiveSheet($sheetIndex)->getStyle('G')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); // 低部資料居中 $spreadsheet->getActiveSheet($sheetIndex)->getStyle($infoStart)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); // 低部資料標題欄加粗 $spreadsheet->getActiveSheet($sheetIndex)->getStyle($infoStart)->getFont()->setBold(true); // 低部資料資訊迴圈 foreach ($data['rows'] as $key => $item) { //迴圈設定單元格: //$key+$infoStart,因為第一行是表頭,所以寫到表格時 從第資料行開始寫 for ($i = 0; $i < $columnsCount; $i++) { $sheet->setCellValue(intToChr($i) . ($key + $infoStart), $item[$i]); // 固定列寬 $spreadsheet->getActiveSheet($sheetIndex)->getColumnDimension(intToChr($i))->setWidth(20); } } // 中聞資料處理 $rowNumber = 1; $infoIndex = 0; foreach ($data['info'] as $key => $value) { if ($infoIndex % 2 == 0) { $rowNumber++; $infoCellName1 = 'A' . $rowNumber; $infoCellMegreRange = 'B' . $rowNumber . ':C' . $rowNumber; $infoCellName2 = 'B' . $rowNumber; } else { $infoCellName1 = 'D' . $rowNumber; $infoCellMegreRange = 'E' . $rowNumber . ':F' . $rowNumber; $infoCellName2 = 'E' . $rowNumber; } $spreadsheet->setActiveSheetIndex($sheetIndex)->setCellValue($infoCellName1, $key); $spreadsheet->getActiveSheet($sheetIndex)->mergeCells($infoCellMegreRange); $spreadsheet->setActiveSheetIndex($sheetIndex)->setCellValue($infoCellName2, $value); $infoIndex++; } } /** * 多sheet的匯出 * @param $datas * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ function exportExecl($datas) { $name = '完成情況-' . date("Y-m-d", time()); $spreadsheet = new Spreadsheet(); foreach ($datas as $key => $data) { handlingMultipleSheet($spreadsheet, $key, $data); } header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="' . $name . '.xlsx"'); header('Cache-Control: max-age=0'); $writer = new Xlsx($spreadsheet); $writer->save('php://output'); //刪除清空: $spreadsheet->disconnectWorksheets(); unset($spreadsheet); exit; } // 要匯出的資料 $datas = [ [ 'title' => '張三完成情況', 'info' => [ '姓名:' => '張三', '所在地:' => '北京市', '收貨地址:' => '河北', '聯絡方式:' => '13900000000', '日期:' => '2022-04-20', '備註1:' => '優秀', '備註2:' => '100分' ], 'rows' => [ [ '編號', '姓名', '性別', '手機', '備註3', '備註4', '備註5' ], [ "AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG" ], [ "AA", "BB", "CC", "DD", "EE", "FF", "GG" ] ] ], [ 'title' => '李四完成情況', 'info' => [ '姓名:' => '李四', '所在地:' => '北京市', '收貨地址:' => '河北', '聯絡方式:' => '13900000000', '日期:' => '2022-04-20', '備註1:' => '優秀', '備註2:' => '100分' ], 'rows' => [ [ '編號', '姓名', '性別', '手機', '備註3', '備註4', '備註5' ], [ "1", "2", "3", "4", "5", "6", "7" ], [ "11", "22", "33", "44", "55", "66", "77" ] ] ] ]; exportExecl($datas);