批量導出excel思想:
- 把需要下載的excel文件都生成並保存到一個指定的臨時目錄
- new 一個壓縮文件包,把目錄中的文件都添加都壓縮文件包中
- header()下載壓縮文件包,刪除臨時目錄和壓縮文件包
/**
* [Export_transcript 導出班級學生信息]
* @author Jim
* @datetime 2020-5-25 T21:40:29+0800
*/
public function Export_transcript(){
$students = array(
array(
array("一班","張三","男","21"),
array("一班","李四","男","22"),
array("一班","王五","男","21")
),
array(
array("二班","張三2","男","21"),
array("二班","李四2","男","22"),
array("二班","王五2","男","21")
),
array(
array("三班","張三3","男","21"),
array("三班","李四3","男","22"),
array("三班","王五3","男","21")
)
);
//循環生成每個班級的excel文件
foreach ($students as $key => $student){
$filename = "filename-".$key;//設置excel文件名稱
$headArr = array();//空表頭
$this->create_excel($filename,$headArr,$student);
}
$path = "Public/Download/tem";
rmdir($path);
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=班級學生信息.zip'); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進制文件
header('Content-Length: '. filesize("transcript.zip")); //告訴瀏覽器,文件大小
readfile("transcript.zip");
unlink('transcript.zip');
exit();
}
/**
* [create_excel 生成excel並保存到指定目錄]
* @author Jim
* @datetime 2020-05-14T15:46:00+0800
* @param $fileName (string) 導出後的文件名
* @param $headArr (array) 表頭信息
* @param $data (array) 導出的數據
*/
private function create_excel($fileName,$headArr,$data){
//引入PHPExcel擴展文件
vendor('PHPExcel\PHPExcel');
vendor('PHPExcel.Writer.Excel5');
vendor('PHPExcel.IOFactory.php');
//對數據進行檢驗
if(empty($data) || !is_array($data)){
die("data must be a array");
}
//檢查文件名
if(empty($fileName)){
exit;
}
$date = date("Y_m_d",time());
$fileName .= "_{$date}.xls";
//創建PHPExcel對象,注意,不能少了\
$objPHPExcel = new \PHPExcel();
//設置表頭 超過26列
$key = 0;
foreach($headArr as $v){
//注意,不能少了。將列數字轉換爲字母\
$colum = \PHPExcel_Cell::stringFromColumnIndex($key);
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
$key += 1;
}
$column = 2; //從第二行寫入數據 第一行是表頭
$objActSheet = $objPHPExcel->getActiveSheet();
foreach($data as $key => $rows){ //行寫入
$span = 0;
foreach($rows as $keyName=>$value){// 列寫入
$j = \PHPExcel_Cell::stringFromColumnIndex($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
}
$column = 2;
$objActSheet = $objPHPExcel->getActiveSheet();
foreach($data as $key => $rows){ //行寫入
$span = ord("A");
foreach($rows as $keyName=>$value){// 列寫入
$j = chr($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
}
$fileName = iconv("utf-8", "gb2312", $fileName);
//設置活動單指數到第一個表,所以Excel打開這是第一個表
$objPHPExcel->setActiveSheetIndex(0);
ob_end_clean();
ob_start();
// 新建一個目錄存放批量下載的excel文件,最後在批量下載
$path = "Public/Download/tem/";
if(!is_dir($path)){
mkdir(iconv("UTF-8", "GBK", $path),0777,true);
}
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save($path.$fileName); //保存到$path目錄
$zip = new \ZipArchive();
if ($zip->open('transcript.zip', \ZipArchive::CREATE) === TRUE) {
// 將保存的文件添加到zip文
$zip->addFile($path.$fileName,$fileName);
// 關閉zip文件
$zip->close();
}
// 單獨直接導出excel文件
// header('Content-Type: application/vnd.ms-excel');
// header("Content-Disposition: attachment;filename=\"$fileName\"");
// header('Cache-Control: max-age=0');
// $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
// $objWriter->save('php://output'); //文件通過瀏覽器下載
// exit;
}