PhpOffice\PhpSpreadsheet安装和基本的导入导出本文不在介绍,主要用来实现用设定好样式的模板,填充数据,导出Excel文件功能。
相关文章:
《ThinkPHP6 excel 导入功能完整实现》
《ThinkPHP6 excel 导出功能完整实现》
《ThinkPHP 6.0 phpspreadsheet操作Excel表格实例》
1.准备模板文件
创建一个xls/xlsx文件,命名为test,设定一下加粗、居中、合并、行高、列宽等等样式
2.加载模板文件
依赖
use PhpOffice\PhpSpreadsheet\IOFactory;
加载模板
$spreadsheet = IOFactory::load('./uploads/test.xlsx');
$sheet = $spreadsheet->getActiveSheet();
3.查询、处理数据
$key = ['id', 'product_name', 'product_desc', 'optionsNo', 'created_at'];
$data = Db::name('product')->order('id', 'asc')->field($key)->limit(0, 10)->select()->toArray();// 处理数据
foreach ($data as &$v) {$v['created_at'] = date('Y/m/d H:i:s', $v['created_at']);
}
unset($v);
4.导出具体实现
// 处理标题 因为合并了 使用A1即可赋值
$sheet->setCellValue('A1', '产品导出数据');// 行标题模板已有 不需处理// 处理内容从第三行开始
$row = 3;
foreach ($data as $item) {$column = 1;foreach ($item as $value) {$sheet->setCellValueByColumnAndRow($column, $row, $value);$column++;}$row++;
}// 文件下载
$filename = './uploads/product1.xlsx';
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($filename);
5.实现效果
可在设置导出的相应路径下,打开文件
6.浏览器下载
也可以改为激活浏览器下载文件
// 行标题模板已有 不需处理
// 处理内容从第三行开始
$row = 3;
foreach ($data as $item) {$column = 1;foreach ($item as $value) {$sheet->setCellValueByColumnAndRow($column, $row, $value);$column++;}$row++;
}$filename = 'product1.xls';
header('Content-Type:application/vnd.ms-excel');
header('Content-Disposition:attachment;filename='.$filename);
header('Cache-Control:max-age=0');$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('php://output');
总结:
ThinkPHP关于Excel操作的文章,算上这篇有4篇了,一开始是想用PHPExcel来实现的,这种很早以前就用过,现在已经不再更新了。然后找别的三方类库来实现,还是通过询问ChatGPT来找到的PhpOffice\PhpSpreadsheet。
接触后就开始摸索,先简单实现导入导出功能,之后如何设定样式,最后实现了模板导出。其实设定样式也不是目的,主要想实现模板导出Excel文件的,开始没找到怎么实现,就先用写了一大堆设定样式的代码来达到相同的目的。
最后实现导出很简单,就是用导入的方式先加载模板文件,之后把文件数据填充进去,重命名导出文件即可。