【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据
目录
前言
一、安装
二、API使用
三、完整实例
四、效果图
前言
为什么使用PhpSpreadsheet?
由于PHPExcel不再维护,所以建议使用PhpSpreadsheet来导出exlcel,但是PhpSpreadsheet由于是个新的类库,所以只支持PHP7.1及以上的版本。
PhpSpreadsheet有哪些功能?
PhpSpreadsheet提供了丰富的API,包括单元格设置、文档属性、图片、日期、函数等,基本满足项目需求。
先介绍如何安装和使用常用的AIP,实例代码放在最后,如果想直接使用可直接跳到第三部分完整实例。
一、安装
使用compose安装PhpSpreadsheet,在项目根目录下执行命令,PhpSpreadsheet会安装到/vendor/下
composer require phpoffice/phpspreadsheet
二、API使用
1、引用和实例化
使用composer安装完成后,可在项目中直接使用PhpSpreadsheet。
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;//实例化
$spreadsheet = new Spreadsheet();
// 获取工作表
$sheet = $spreadsheet->getActiveSheet();
这里引用了多个PhpSpreadsheet类,下面介绍每个类的作用
1、\Spreadsheet:工作表
2、\Writer\Xlsx:导出excel
3、\IOFactory:导出excel
4、\Style\Alignment:设置单元格文字水平、垂直居中
5、\Style\Border:设置单元格边框样式
6、\Style\Fill:设置单元格背景颜色
7、\Worksheet\Drawing:写入图片
2、 设置单元格的值
把单元格A1的值设置为药品不良反应事件报告表
$sheet->setCellValue('A1', '药品不良反应事件报告表');
3、合并单元格
把单元格A1到N1合并
$sheet->mergeCells('A1:N1');
4、拆分单元格
$sheet->unmergeCells('A1:A4');
5、单元格文字样式
可以设置某一区域的单元格,也可以设置一行或一个单元格的样式
// 字体大小
$sheet->getStyle('A1')->getFont()->setSize(12);
// 文字加粗
$sheet->getStyle('A1:N1')->getFont()->setBold(true);
// 字体设置
$sheet->getStyle('A1:N1')->getFont()->setName('黑体');
6、单元格文字水平、垂直居中
给单元格A1中的文字设置水平、垂直居中。需要注意的是需要引用Style\Alignment
use PhpOffice\PhpSpreadsheet\Style\Alignment;// 水平、垂直居中
$alignstyle = ['alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中'vertical' => Alignment::VERTICAL_CENTER, //垂直居中],
];$sheet->getStyle('A1')->applyFromArray($alignstyle);
7、单元格边框样式
给单元格A4到B4加边框,可以单独设置上、下、左、右、全面边框,需要引用\Style\Border
use PhpOffice\PhpSpreadsheet\Style\Border;
// 边框样式
$borderstyle = ['borders' => ['outline' => ['borderStyle' => Border::BORDER_THIN,'color' => ['argb' => '000000'],],],
];$sheet->getStyle('A4:B4')->applyFromArray($borderstyle);
8、设置单元格背景颜色
给单元格A4设置背景颜色,需要引用\Style\Fill
use PhpOffice\PhpSpreadsheet\Style\Fill;$sheet->getStyle('A4')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('D9D9D9');
9、设置行高
// 第一行行高设置为30
$sheet->getRowDimension(1)->setRowHeight(30);// 设置默认行高
$sheet->getDefaultRowDimension()->setRowHeight(20);
10、设置列宽
// 设置A列的列宽
$sheet->getColumnDimension('A')->setWidth(15);// 设置所有单元格的列宽
$sheet->getDefaultColumnDimension()->setWidth('15');
11、设置文字颜色
setRGB:颜色值带#号
setARGB:颜色值不带#号
$sheet->getStyle('B3')->getFont()->getColor()->setRGB('#AEEEEE');$sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000');
12、设置超链接
给单元格E6中的文字设置超链接
$sheet->setCellValue('E6', '百度');
$sheet->getCell('E6')->getHyperlink()->setUrl('www.baidu.com');
13、设置sheet的标题
// 设置sheet名称
$sheet->setTitle('ADR报告');
14、使用函数
SUM:求和
VERAGE:平均数
MIN:最小值
MAX:最大值
$sheet->setCellValue('A3', '=SUM(A1:A2)');
15、写入图片
往单元格里写入图片,需要引用\Worksheet\Drawing
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
//写入图片
$drawing = new Drawing();
$drawing->setName('Logo')->setDescription('Logo')->setPath('../files/1.jpg')->setHeight(30)->setCoordinates('D6')->setOffsetX(50)->setOffsetY(6);
$drawing->setRotation(25);
$drawing->getShadow()->setVisible(true);
$drawing->getShadow()->setDirection(45);$drawing->setWorksheet($sheet);
16、导出xlsx文件
需要引用IOFactory
use PhpOffice\PhpSpreadsheet\IOFactory;// MIME 协议,文件的类型,不设置,会默认html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// MIME 协议的扩展
header('Content-Disposition: attachment;filename="' . iconv("utf-8", "GB2312", $filename) . '.xlsx');
// 缓存控制
header('Cache-Control:max-age=0');
$write = IOFactory::createWriter($spreadsheet, 'Xlsx');
$write->save('php://output');
17、导出xls文件
需要引用IOFactory
use PhpOffice\PhpSpreadsheet\IOFactory;// MIME 协议,文件的类型,不设置,会默认html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// MIME 协议的扩展
$filename = date('Y-m-d').'工作报告单';
header('Content-Disposition:attachment;filename='.$filename .'.xls');
// 缓存控制
header('Cache-Control:max-age=0');
$write = IOFactory::createWriter($spreadsheet, 'Xls');
$write->save('php://output');
三、完整实例
$adrinfo = array();if (!empty($adrinfo)) {//实例化
$spreadsheet = new Spreadsheet();$filename = $adrinfo['name'].'_ADR报告'.date('YmdHis').rand(10000, 99999); //导出文件名$sheet = $spreadsheet->getActiveSheet();//样式
// 边框样式
$borderstyle = ['borders' => ['outline' => ['borderStyle' => Border::BORDER_THIN,'color' => ['argb' => '000000'],],],
];
// 水平、垂直居中
$alignstyle = ['alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中'vertical' => Alignment::VERTICAL_CENTER, //垂直居中],
];第一行 表头/
// 合并单元格
$sheet->mergeCells('A1:N1');
// 设置表格第一行显示内容
$sheet->setCellValue('A1', '药品不良反应/事件报告表');
$sheet->getStyle('A1')->getFont()->setSize(12); // 设置单元格字体大小// 水平、垂直居中
$sheet->getStyle('A1')->applyFromArray($alignstyle);// 设置行高
$sheet->getRowDimension(1)->setRowHeight(30);//设置列宽
$sheet->getDefaultColumnDimension()->setWidth('15');// 加粗
$sheet->getStyle('A1:N1')->getFont()->setBold(true);
// 设置sheet名称
$sheet->setTitle($adrinfo['name'].'_ADR报告');内容
// 第2行
$sheet->setCellValue('A2','首次/跟踪:');
$sheet->setCellValue('B2','首次报告');
// 设置单元格背景颜色
// $sheet->getStyle('A2')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('D9D9D9');
// 设置行高
$sheet->getRowDimension('2')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A2:N2')->applyFromArray($alignstyle);// 第3行
$sheet->setCellValue('A3','已知/新的:');
$sheet->setCellValue('C3','一般/严重:');$sheet->setCellValue('E3',$adrinfo['qingkuang']);
// 合并单元格
$sheet->mergeCells('E3:N3');
$sheet->getRowDimension('3')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A3:D3')->applyFromArray($alignstyle);// 第4行
$sheet->setCellValue('A4','患者姓名');
$sheet->setCellValue('B4',$adrinfo['name']);
$sheet->setCellValue('C4','性别');
$sheet->setCellValue('D4',$adrinfo['xingbie']);
$sheet->setCellValue('E4','出生日期');
$sheet->setCellValue('F4',$adrinfo['nianyue']);
$sheet->setCellValue('G4','或年龄');
$sheet->setCellValue('H4',$adrinfo['nianling']);
$sheet->setCellValue('I4','岁');
// 设置边框
$sheet->getStyle('A4:B4')->applyFromArray($borderstyle);
$sheet->getStyle('C4:D4')->applyFromArray($borderstyle);
$sheet->getStyle('E4:F4')->applyFromArray($borderstyle);
$sheet->getStyle('G4:N4')->applyFromArray($borderstyle);
// 设置行高
$sheet->getRowDimension('4')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A4:N4')->applyFromArray($alignstyle);// 第5行
$sheet->setCellValue('A5','民族:');
$sheet->setCellValue('B5',$adrinfo['minzu']);
$sheet->setCellValue('C5','体重:');
$sheet->setCellValue('D5',$adrinfo['tizhong']);
$sheet->setCellValue('E5','千克');
$sheet->setCellValue('G5','联系方式:');
$sheet->setCellValue('H5',$adrinfo['dianhua']);
// 设置边框
$sheet->getStyle('A5:B5')->applyFromArray($borderstyle);
$sheet->getStyle('C5:F5')->applyFromArray($borderstyle);
$sheet->getStyle('G5:N5')->applyFromArray($borderstyle);
// 设置行高
$sheet->getRowDimension('5')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A5:N5')->applyFromArray($alignstyle);// 第6行
$sheet->setCellValue('A6','原患疾病:');
$sheet->setCellValue('G6','医院名称:');
$sheet->setCellValue('H6',$adrinfo['member']['danwei']);
$sheet->setCellValue('K6','病历号/门诊号:');
$sheet->setCellValue('L6',$adrinfo['jiuzhenhao']);
// 设置边框
$sheet->getStyle('A6:F6')->applyFromArray($borderstyle);
$sheet->getStyle('G6:J6')->applyFromArray($borderstyle);
$sheet->getStyle('K6:N6')->applyFromArray($borderstyle);
// 合并单元格
$sheet->mergeCells('B6:F6');
$sheet->mergeCells('H6:J6');
// 设置行高
$sheet->getRowDimension('6')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A6:N6')->applyFromArray($alignstyle);
// 设置单元格背景颜色
// $sheet->getStyle('A6')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('D9D9D9'); // 第7行
$sheet->setCellValue('A7','既往药品不良反应/事件:');// 设置边框
$sheet->getStyle('A7:B7')->applyFromArray($borderstyle);
$sheet->getStyle('C7:N7')->applyFromArray($borderstyle);
// 合并单元格
$sheet->mergeCells('C7:N7');
// 设置行高
$sheet->getRowDimension('7')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A7:B7')->applyFromArray($alignstyle);
// 设置单元格背景颜色
// $sheet->getStyle('A7')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('D9D9D9'); // 第8行
$sheet->setCellValue('A8','家族药品不良反应/事件:');
$sheet->setCellValue('B8','不详');
// 设置边框
$sheet->getStyle('A8:N8')->applyFromArray($borderstyle);
// 设置行高
$sheet->getRowDimension('8')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A8:N8')->applyFromArray($alignstyle);
// 设置单元格背景颜色
// $sheet->getStyle('A8')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('D9D9D9'); // 第9行
$sheet->setCellValue('A9','相关重要信息:');
$sheet->setCellValue('B9',$adrinfo['huanzheqingkuang'].';过敏:'.$adrinfo['guomin']);
// 设置边框
$sheet->getStyle('A9:N9')->applyFromArray($borderstyle);
// 合并单元格
$sheet->mergeCells('B9:N9');
// 设置行高
$sheet->getRowDimension('9')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A9')->applyFromArray($alignstyle);// 设置单元格背景颜色
// $sheet->getStyle('A9')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('D9D9D9'); // 第10行 怀疑药品
$sheet->setCellValue('B10','批准文号')->setCellValue('C10','商品名')->setCellValue('D10','通用名')->setCellValue('E10','生产厂家')->setCellValue('F10','生产批号')->setCellValue('G10','次剂量')->setCellValue('H10','给药途径')->setCellValue('I10','频次')->setCellValue('J10','开始用药日期')->setCellValue('K10','停止用药日期')->setCellValue('L10','用药原因')->setCellValue('M10','停药是否消失减轻')->setCellValue('N10','再次用药是否再出现');// 统计共上传了多少条药品记录
$cc = count($adrinfo['yaowu']);
// 下一项开始行序号
$i = 10+$cc;// 设置边框
$sheet->getStyle('A10')->applyFromArray($borderstyle); $sheet->getStyle('B10')->applyFromArray($borderstyle); $sheet->getStyle('C10')->applyFromArray($borderstyle); $sheet->getStyle('D10')->applyFromArray($borderstyle);
$sheet->getStyle('E10')->applyFromArray($borderstyle); $sheet->getStyle('F10')->applyFromArray($borderstyle); $sheet->getStyle('G10')->applyFromArray($borderstyle); $sheet->getStyle('H10')->applyFromArray($borderstyle);
$sheet->getStyle('I10')->applyFromArray($borderstyle); $sheet->getStyle('J10')->applyFromArray($borderstyle); $sheet->getStyle('K10')->applyFromArray($borderstyle); $sheet->getStyle('L10')->applyFromArray($borderstyle);
$sheet->getStyle('M10')->applyFromArray($borderstyle); $sheet->getStyle('N10')->applyFromArray($borderstyle);
// 设置行高
$sheet->getRowDimension('10')->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A10:N10')->applyFromArray($alignstyle);if (!empty($adrinfo['yaowu'])) {// 合并单元格$sheet->mergeCells('A11:A'.$i);$sheet->setCellValue('A11','怀疑药品');// 水平、垂直居中$sheet->getStyle('A11:A'.$i)->applyFromArray($alignstyle);// 设置边框$sheet->getStyle('A11:A'.$i)->applyFromArray($borderstyle); $k = 0;foreach ($adrinfo['yaowu'] as $v) {$k++;$sheet->setCellValue('B'.($k+10), str_replace('批准文号:','',$v[3])) //->setCellValue('C'.($k+10), str_replace('药品','',$v[0])) ->setCellValue('D'.($k+10), str_replace('药名:','',$v[0])) ->setCellValue('E'.($k+10), str_replace('公司:','',$v[1])) ->setCellValue('F'.($k+10), str_replace('产品批号:','',$v[2])) ->setCellValue('G'.($k+10), str_replace('用量:','',$v[5])) ->setCellValue('H'.($k+10), str_replace(array('如何用药:','/'),'',$v[7])) ->setCellValue('I'.($k+10), str_replace(array('频次:','/'),'',$v[6])) ->setCellValue('J'.($k+10), str_replace('开始服用该药的日期:','',$v[9])) ->setCellValue('K'.($k+10), str_replace('停止服用该药的日期:','',$v[10])) ->setCellValue('L'.($k+10), str_replace('为什么患者要使用这个药品:','',$v[8]))->setCellValue('M'.($k+10), str_replace('停药是否消失减轻:','',$v[12]))->setCellValue('N'.($k+10), str_replace('再次用药是否再出出现:','',$v[13]));// 设置边框$sheet->getStyle('B'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('C'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('D'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('E'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('F'.($k+10))->applyFromArray($borderstyle);$sheet->getStyle('G'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('H'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('I'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('J'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('K'.($k+10))->applyFromArray($borderstyle);$sheet->getStyle('L'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('M'.($k+10))->applyFromArray($borderstyle); $sheet->getStyle('N'.($k+10))->applyFromArray($borderstyle);// 设置行高$sheet->getRowDimension(($k+10))->setRowHeight(22);// 水平、垂直居中$sheet->getStyle('B'.($k+10).':N'.($k+10))->applyFromArray($alignstyle);}
}// 并用药品
$sheet->setCellValue('A'.($i+1),'并用药品');
// 合并单元格
$sheet->mergeCells('A'.($i+1).':A'.($i+2));
// 水平、垂直居中
$sheet->getStyle('A'.($i+1).':A'.($i+2))->applyFromArray($alignstyle);
// 设置边框
$sheet->getStyle('A'.($i+1).':A'.($i+2))->applyFromArray($borderstyle);
$sheet->getStyle('B'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('C'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('D'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('E'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('F'.($i+1))->applyFromArray($borderstyle);
$sheet->getStyle('G'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('H'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('I'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('J'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('K'.($i+1))->applyFromArray($borderstyle);
$sheet->getStyle('L'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('M'.($i+1))->applyFromArray($borderstyle); $sheet->getStyle('N'.($i+1))->applyFromArray($borderstyle);
$sheet->getStyle('B'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('C'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('D'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('E'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('F'.($i+2))->applyFromArray($borderstyle);
$sheet->getStyle('G'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('H'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('I'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('J'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('K'.($i+2))->applyFromArray($borderstyle);
$sheet->getStyle('L'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('M'.($i+2))->applyFromArray($borderstyle); $sheet->getStyle('N'.($i+2))->applyFromArray($borderstyle);// 设置行高
$sheet->getRowDimension(($i+1))->setRowHeight(22);
$sheet->getRowDimension(($i+2))->setRowHeight(22);// p($i+3);
// 不良反应事件名称
$sheet->setCellValue('A'.($i+3),'不良反应/事件名称:');
$sheet->setCellValue('G'.($i+3),'不良反应/事件发生时间:');
$sheet->setCellValue('H'.($i+3),$adrinfo['blfydate']);
// 设置边框
$sheet->getStyle('A'.($i+3).':F'.($i+3))->applyFromArray($borderstyle);
$sheet->getStyle('G'.($i+3).':N'.($i+3))->applyFromArray($borderstyle);
// 合并单元格
$sheet->mergeCells('B'.($i+3).':F'.($i+3));// 设置行高
$sheet->getRowDimension(($i+3))->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A'.($i+3).':N'.($i+3))->applyFromArray($alignstyle);// 不良反应过程描述
$sheet->setCellValue('A'.($i+4),'不良反应/事件过程描述(包括症状、体征、临床检验等)及处理情况(可附页):');
$jiancha_str = '';
if (!empty($adrinfo['jiancha'])) {$jiancha_str = "相关检查检验情况:\r\n";foreach ($adrinfo['jiancha'] as $v){$jiancha_str .= "检查日期:".str_replace("日期:","",$v[0]).";".$v[1].";".$v[2].";".$v[3].";".$v[4].";".$v[5].";\r\n";}
}
$str = "描述:".$adrinfo['blfyxijie']."。\r\n".$jiancha_str;
$sheet->setCellValue('A'.($i+5),$str);
$sheet->mergeCells('A'.($i+5).':N'.($i+5));
// 设置行高
$sheet->getRowDimension($i+5)->setRowHeight(50);
// 设置边框
$sheet->getStyle('A'.($i+4).':N'.($i+5))->applyFromArray($borderstyle);
// 水平、垂直居中
// $sheet->getStyle('A'.($i+5).':N'.($i+5))->applyFromArray($alignstyle);// 不良反应/事件的结果:
$sheet->setCellValue('A'.($i+6),'不良反应/事件的结果:');
// 设置边框
$sheet->getStyle('A'.($i+6).':N'.($i+6))->applyFromArray($borderstyle);
// 设置行高
$sheet->getRowDimension(($i+6))->setRowHeight(22);
// 合并单元格
// $sheet->mergeCells('B'.($i+6).':N'.($i+6));// 对原患疾病的影响
$sheet->setCellValue('A'.($i+7),'对原患疾病的影响:');
// 设置边框
$sheet->getStyle('A'.($i+7).':N'.($i+7))->applyFromArray($borderstyle);
// 合并单元格
$sheet->mergeCells('B'.($i+7).':N'.($i+7));
// 设置行高
$sheet->getRowDimension(($i+7))->setRowHeight(22);// 关联性评价
$sheet->setCellValue('A'.($i+8),'关联性评价');
$sheet->mergeCells('A'.($i+8).':A'.($i+9));
$sheet->setCellValue('B'.($i+8),'报告人评价:');
$sheet->setCellValue('K'.($i+8),'签名:');
$sheet->setCellValue('L'.($i+8),$adrinfo['member']['name']);
$sheet->setCellValue('B'.($i+9),'报告单位评价:');
$sheet->setCellValue('K'.($i+9),'签名:');
// 设置边框
$sheet->getStyle('A'.($i+8).':N'.($i+9))->applyFromArray($borderstyle);
// 水平、垂直居中
$sheet->getStyle('A'.($i+8).':B'.($i+9))->applyFromArray($alignstyle);
// 设置行高
$sheet->getRowDimension(($i+8))->setRowHeight(22);
$sheet->getRowDimension(($i+9))->setRowHeight(22);// 报告人信息
$sheet->setCellValue('A'.($i+10),'报告人信息');
$sheet->mergeCells('A'.($i+10).':A'.($i+11));
$sheet->setCellValue('B'.($i+10),'联系电话:');
$sheet->setCellValue('C'.($i+10),$adrinfo['member']['tel']);
$sheet->setCellValue('F'.($i+10),'职业:');
$sheet->setCellValue('I'.($i+10),'报告人科室:');
$sheet->setCellValue('B'.($i+11),'电子邮箱:');
$sheet->setCellValue('C'.($i+11),$adrinfo['member']['email']);
$sheet->setCellValue('F'.($i+11),'签名:');
$sheet->setCellValue('G'.($i+11),$adrinfo['member']['name']);
$sheet->setCellValue('I'.($i+11),'报告日期:');
$sheet->setCellValue('J'.($i+11),date('Y-m-d',$adrinfo['createtime']));// 设置边框
$sheet->getStyle('A'.($i+10).':N'.($i+11))->applyFromArray($borderstyle);
// 水平、垂直居中
$sheet->getStyle('A'.($i+10).':N'.($i+11))->applyFromArray($alignstyle);
// 设置行高
$sheet->getRowDimension(($i+10))->setRowHeight(22);
$sheet->getRowDimension(($i+11))->setRowHeight(22);// 报告单位信息
$sheet->setCellValue('A'.($i+12),'报告单位信息');
$sheet->setCellValue('B'.($i+12),'单位名称:');
$sheet->setCellValue('C'.($i+12),$adrinfo['member']['danwei']);
$sheet->setCellValue('F'.($i+12),'联系人:');
$sheet->setCellValue('I'.($i+12),'电话:');
// 设置边框
$sheet->getStyle('A'.($i+12).':N'.($i+12))->applyFromArray($borderstyle);
// 设置行高
$sheet->getRowDimension(($i+12))->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A'.($i+12).':N'.($i+12))->applyFromArray($alignstyle);// 备注
$sheet->setCellValue('A'.($i+13),'备注');
$sheet->setCellValue('B'.($i+13),$adrinfo['qitayaowu']);
// 设置边框
$sheet->getStyle('A'.($i+13).':N'.($i+13))->applyFromArray($borderstyle);
// 设置行高
$sheet->getRowDimension(($i+13))->setRowHeight(22);
// 水平、垂直居中
$sheet->getStyle('A'.($i+13).':N'.($i+13))->applyFromArray($alignstyle);ob_end_clean(); //清除缓冲区,避免乱码header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// MIME 协议的扩展
header('Content-Disposition: attachment;filename="' . iconv("utf-8", "GB2312", $filename) . '.xlsx');
// 缓存控制
header('Cache-Control:max-age=0');
$write = IOFactory::createWriter($spreadsheet, 'Xlsx');
$write->save('php://output');
四、效果图
如果想使用PHPExcel来导入或导出数据,可以参看
【PHPExcel】Thinkphp5+PHPExcel实现批量上传表格数据-CSDN博客
【PHPExcel】使用PHPExcel实现数据批量导出为excel表格-CSDN博客
【PHPExcel】使用PHPExcel实现数据批量导入到数据库-CSDN博客
相关文章:

【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据
目录 前言 一、安装 二、API使用 三、完整实例 四、效果图 前言 为什么使用PhpSpreadsheet? 由于PHPExcel不再维护,所以建议使用PhpSpreadsheet来导出exlcel,但是PhpSpreadsheet由于是个新的类库,所以只支持PHP7.1及以上的版…...

Python剪辑视频
import os from moviepy.editor import VideoFileClipvideo_dir r"E:\学习\视频剪辑" s_video_file "1.mp4" d_video_file "剪辑片段1.mp4" s_video_path os.path.join(video_dir, s_video_file) # 原视频文件路径 d_video_path os.path…...

LabVIEW提高开发效率技巧----高效文件I/O
在LabVIEW开发中,文件I/O操作常常是性能瓶颈之一,特别是处理大数据时,如何高效地存储和读取数据显得尤为重要。本文将详细介绍如何利用TDMS Streaming来实现高效的文件I/O,并结合具体例子说明在实际开发中的应用技巧。 1. 什么是T…...

影刀RPA接口_查询应用主流程参数结构
影刀接口_查询应用主流程参数结构 链接 import requests from time import sleepaccessKeyId"XXX" accessKeySecret"XXX"#1.获取token def get_access_token():url"https://api.yingdao.com/oapi/token/v2/token/create"headers{"Content…...

2d实时数字人聊天语音对话使用案例,对接大模型
参看: https://github.com/wan-h/awesome-digital-human-live2d 电脑环境: ubuntu 1060ti 下载: git clone https://github.com/wan-h/awesome-digital-human-live2d.gitdocker部署; cd awesome-digital-human-live2d docker-compose -f docker-compose-quickStart.ya…...

LeetCode | 69.x的平方根
这道题很适合用二分来解决,算是二门入门的一个练手题吧思想就是首先设置两个指针,一个是0,一个是x,相当于在数轴上划定一个区域 [ 0 , x ]然后计算数轴中间值和我们想要找的值的大小关系,因为数轴是有序的,…...

使用Windows创建一个MFC应用【带界面】
MFC使用教程【对初学者保姆型友好!】 目录 前提条件 1:创建MFC应用程序 2. 项目结构解读 引用 外部依赖项 头文件 源文件 资源文件 文件功能详解 项目的主要流程 步骤2:配置OpenCV 安装OpenCV 包含目录与库文件 步骤3࿱…...

springboot整合lombok
只需要引入lombok依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version></dependency> 然后application.yml配置文件中加上 logging: level: …...

使用Arcgis批量自动出图
操作方法如下: 1 2 3 4 5 6 7 设置好选项,开始打印。 8 生成pdf。 第一步:shp放到数据库中,标注转注记,然后编辑注记,符号样式设置好。准备出图:(转注记时候尽量压盖监测等选最…...

Web Worker加载外部文件实践
概述 在Web Worker 多线程编程一文中介绍了Web Worker的编程思想,碰巧最近工作中某个工程需要加载外部文件,最大的文件大小达到30MB,Web Worker无疑是不错的选择。 编程实现 不用 Web Worker 加载外部文件使用原生的fetch方法读取文件,其核心代码如下: function loadland…...

2024年中国工业大模型行业发展研究报告|附43页PDF文件下载
工业大模型伴随着大模型技术的发展,逐渐渗透至工业,处于萌芽阶段。 就大模型的本质而言,是由一系列参数化的数学函数组成的计算系统,且是一个概率模型,其工作机制是基于概率和统计推动进行的,而非真正的理解…...

99. UE5 GAS RPG 被动技能实现
在这一篇,我们在之前打下的基础下,实现一下被动技能。 被动技能需要我们在技能栏上面选择升级解锁技能后,将其设置到技能栏,我们先增加被动技能使用的标签。 FGameplayTag Abilities_Passive_HaloOfProtection; //被动技能-守护光…...

U盘装系统,使用U盘启动,提示需要装驱动
今天装win10系统,用的是U盘启动,但安装过程中出现了找不到驱动程序无法完成安装的问题,逛了许多的论坛,换过两三个iso文件都不顶用,使用了许多种方式,都安装失败,最后在某个论坛看到一种安装方式…...

gaussdb 主备 8 数据库安全学习
1 用户及权限 1.1 默认权限机制-未开启三权分立 1.1.1 数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和销毁对象,以及通过GRANT将对象的权限授予其他用户。 1.1.2 GaussDB支持以下的…...

React 基础阶段学习计划
React 基础阶段学习计划 目标 能够创建和使用React组件。理解并使用State和Props。掌握事件处理和表单处理。 学习内容 环境搭建 安装Node.js和npm 访问 Node.js官网 下载并安装最新版本的Node.js。打开终端或命令行工具,输入 node -v 和 npm -v 检查是否安装…...

FFmpeg的简单使用【Windows】--- 指定视频的时长
目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善,可以先去看上一个案例然后再…...

请求参数中字符串的+变成了空格
前端请求 后端接收到的结果 在URL中,某些字符(包括空格、、&、? 等)需要被编码。具体而言,在URL中,空格通常被编码为 或 %20。因此,如果你在请求参数中使用 ,它会被解释为一个空格。 如果…...

前端开发攻略---使用AJAX监控网络请求进度
1、XHR实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title></head&…...

[已解决]DockerTarBuilder永久解决镜像docker拉取异常问题
前阵子发现阿里云的docker加速镜像失效了(甚至连nginx都拉取不了),重新换了并且加多了网络上比较常用的dokcer加速源,可以解决一部分问题,但仍然有一些镜像的某个版本或一些比较冷的镜像就是拉取不了,原因未…...

机器学习实战27-基于双向长短期记忆网络 BiLSTM 的黄金价格模型研究
大家好,我是微学AI,今天给大家介绍一下机器学习实战27-基于双向长短期记忆网络 BiLSTM 的黄金价格模型研究。本文针对黄金价格预测问题,展开基于改造后的长短期记忆网络BiLSTM的黄金价格模型研究。文章首先介绍了项目背景,随后详细…...

阿拉伯应用市场的特点
阿拉伯应用程序市场是一个充满活力和快速增长的行业,由年轻、精通技术的人口、高智能手机渗透率和整个地区数字化程度的提高所塑造。作为世界上最大的消费群体之一,阿拉伯语受众为希望扩大影响力的开发商和品牌提供了巨大的潜力。 文化相关性在应用程序…...

音频响度归一化 - python 实现
在处理音频样本时,往往我们的音频样本由于录制设备,环境,人发音的音量大小的不同影响,会造成音频响度不统一,分布在一个不同的响度值域上。为了让语音模型更好的学习音频特征,就有必要对音频的响度进行归一…...

嵌入式硬件设计详解
嵌入式硬件设计详解 嵌入式硬件设计是一个复杂而精细的过程,它涉及将微控制器(MCU)、微处理器(MPU)或数字信号处理器(DSP)等核心芯片与其他外围电子元件(如传感器、执行器、存储器、…...

Linux防火墙与SElinux
文章目录 一、防火墙介绍二、iptables和firewalld的区别操作方式:配置层面:性能和管理: 三、iptables与firewalld的优缺点iptablesfirewalld 四、iptables的工作流程五、firewalld的工作流程六、iptables安装与使用6.1、关闭firewalld服务6.2…...

【MySQL】基本查询(上):创建、读取
1.Create(创建) 语法: INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...value_list: value, [, value] ... 接下来我们用这个下表作为例子: -- 创建一张学生表 CREATE TABLE students ( id INT UNSIGN…...

在线刷题系统测试报告
一、项目背景 1. 本项目是一个在线刷题系统,灵感来源于力扣和牛客等刷题平台,旨在锻炼自己的代码能力和剖析系统整体结构与各模块之间关系的能力。系统支持用户注册与登录,查看题目列表与题目详情,在线提交代码并提供反馈。 2. 该…...

即时通讯增加Redis渠道
情况说明 在本地和服务器分别启动im服务,当本地发送消息时,会发现服务器上并没有收到消息 初版im只支持单机版,不支持分布式的情况。此次针对该情况对项目进行优化,文档中贴出的代码非完整代码,可自行查看参考资料[2] 代码结构调…...

C++list
list简介 list是我们的链表,而且是带头双向循环链表,如下图 我们都知道,链表是由一个一个的节点组成的,它的成员由下面几个部分组成 通过对前面string,vector的学习,其实再来看我们的链表及其成员函数,是…...

设计模式 - 结构型
结构型 适配器模式,代理模式,桥接模式,装饰器模式,外观模式,组合模式,享元模式, 单一职责避免子类爆炸Bridge 模式对象的实现Decorator 模式对对象的职责,不生成子类接口隔离Adapt…...

STM32编码器接口
一、概述 1、Encoder Interface 编码器接口概念 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用…...