批量导出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;
}