php excel匯出匯入(PhpSpreadsheet)


最近案子開始往PHP8移動,順便把舊版的phpexcel給換掉,記錄一下匯出匯入的使用方式。

套件網址:https://github.com/PHPOffice/PhpSpreadsheet
似乎是phpoffice內的功能的樣子,不過目前只有使用到PhpSpreadsheet這部分的功能。
由於執行的伺服器沒辦法跑composer,這邊用的是別人打包好的函式庫,差別應該只有include檔案有差異而已。

方法

匯出應該直接輸出需要的資料就可以了,目前還沒有碰到其他問題

		$today = date("Ymd");
		$CntDisposition = "Content-Disposition: attachment;filename=\"";
		$CntDisposition = $CntDisposition . $today . "\"_chumonshosai.xlsx";
		header($CntDisposition);
		header('Cache-Control: max-age=0');
		require_once("libraries/PhpSpreadSheet-main/PhpOffice/autoload.php");
		

		$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
		$sheet = $spreadsheet->getActiveSheet();
		$sheet->setCellValue('A1', 'aaaaaaa');
		$sheet->setCellValue('B1', 'bbbbbb');
		$sheet->setCellValue('C1', 'cccccccc');


		$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
		$writer->save('php://output');

匯入的部分要注意時間格式的讀取,時間的格式抓出來會是類似時間戳的數字,需要用excelToTimestamp把時間轉換回來。

		$file = $_FILES["file"];
		if($file["type"] != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"){
			echo '檔案格式錯誤,請確認檔案格式為xlsx';
			exit;
		}
		require_once("libraries/PhpSpreadSheet-main/PhpOffice/autoload.php");

		$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
		$reader->setReadDataOnly(true);//忽略樣式
		$spreadsheet = $reader->load($file["tmp_name"]);
		
		$sheet = $spreadsheet->getSheet(0);//讀取第一個表
		
		//獲取單元格的集合
		$cellCollection = $sheet->getCellCollection();
		//獲取具有單元格記錄的工作表的最高列和最高行。
		$column = $cellCollection->getHighestRowAndColumn();

		//內容取出 裝進array中
		$data = array();
		$startline = 3;
		$coltoname = array('A'=>'a_name'
						  ,'B'=>'b_name'
						  ,'C'=>'c_name');
		for($i = $startline; $i <= $column['row']; $i++){//行
			$datarow = array();
			for($j = 'A'; $j <= $column['column']; $j++){//列
				if(isset($coltoname[$j])){
					$key = $j.$i;
					$value = $sheet->getCell($key)->getFormattedValue();
					if($value!='' 
					&& ($j=='C')){//時間轉換處理
						$date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp((int)$value);
						$value = date('Y-m-d', $date).'  ';
					}
					$datarow[$coltoname[$j]] = $value;
				}
			}
			$data[] = $datarow;
		}

參考資料

https://stackoverflow.com/questions/44304795/how-to-retrieve-date-from-table-cell-using-phpspreadsheet
https://stackoverflow.com/questions/70785023/php-create-an-excel-table

Tags : php