提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
使用ChatGPT生成的代码,生成的表格一直是乱码状态。
然后百度了几个方法都是一样的乱码,还有生成的文件错误,不能打开的问题。
应该是请求头header的问题。
最后去查了Spreadsheet官方文档,改了header才跑通的。
一、PhpOffice\PhpSpreadsheet是什么?
生成表格的库,我是看了PHPExcel那个库官方不更新了,加上这个库看起来功能强大,所以试一下好不好用。
二、使用步骤
1.使用 composer 来安装 PhpSpreadsheet:
*composer require phpoffice/phpspreadsheet*
2.安装好直接用
1)、创建一个新的 Spreadsheet 对象
代码如下(示例):
/** 创建一个新的 Spreadsheet 对象 **/
$spreadsheet = new Spreadsheet();
2)、修改表格样式
我这边是修改了列宽,还可以改很多格式,下面文档可以查看
详细格式修改文档
--- // 默认列宽
$spreadsheet->getActiveSheet()
->getDefaultColumnDimension()
->setWidth(15);
3)、写入表头
*setCellValueByColumnAndRow()*方法第一个代表列数,第二个代表行数。第一列就是A,以此类推。下面方法第一个写入的就是A1。
$columnIndex = 1;
foreach ($header as $item) {
$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, 1, $item);
$columnIndex++;
}
4)、循环写入数据
我这个方法传入的 d a t a 的数据和 data的数据和 data的数据和header都是关联数组,他们的key值是对应的,所以可以这样循环写入。我下面会给例子。
$header = [
'name' => '姓名',
'age' => '年龄'
];
$data = [
[
'name' => '小明',
'age' => 16,
],
[
'name' => '小黑',
'age' => 17,
],
];
$rowIndex = 2;
foreach ($data as $value) {
$columnIndex = 1;
foreach ($header as $key => $val) {
$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, $rowIndex, $value[$key]);
$columnIndex++;
}
$rowIndex++;
}
5)、创建 Excel writer
这里官方文档还有另一种createwriter的方法,我没用,我用的这个。
// 创建 Excel writer
$writer = new Xlsx($spreadsheet);
6)、设置文件名和 Content-Disposition 头部
// 设置文件名和 Content-Disposition 头部
$fileName = $fileName . date('Y-m-d', time()) . ".xlsx";
header('Content-Disposition: attachment; filename=' . $fileName);
我之前代码一直不能用就是这里的header不对,我记录下我两种不能用的前缀。
第一种:.xls结尾的文件,对应的是“vnd.ms-execl”,不能跑。
header('Content-Type: application/vnd.ms-execl');
header('Content-Disposition: attachment;filename=xx报表.xls');
header('Cache-Control: max-age=0');
$writer->save('php://output');
第二种:.xlsx结尾的文件,对应的是“vnd.openxmlformats-officedocument.spreadsheetml.sheet”,反正我都跑不了。
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $fileName . '"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
7)、将 Excel 文件写入到输出缓冲区
// 将 Excel 文件写入到输出缓冲区
$writer->save('php://output');
8)、将 Excel 文件写入到输出缓冲区
这两步我就看个热闹,他说作用是那就是了,反正能跑。
// 立即刷新输出缓冲区, 以确保Excel文件可以正确地下载。
flush();
exit;
总结
跑不了的方法就去找官方文档,跟着官方文档写就能跑了。
这是完整的方法代码:
```powershell
public function exportExcel(array $header, array $data, string $fileName = "")
{
/** 创建一个新的 Spreadsheet 对象 **/
$spreadsheet = new Spreadsheet();
// 默认列宽
$spreadsheet->getActiveSheet()
->getDefaultColumnDimension()
->setWidth(15);
$columnIndex = 1;
foreach ($header as $item) {
$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, 1, $item);
$columnIndex++;
}
$rowIndex = 2;
foreach ($data as $value) {
$columnIndex = 1;
foreach ($header as $key => $val) {
$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, $rowIndex, $value[$key]);
$columnIndex++;
}
$rowIndex++;
}
// 创建 Excel writer
$writer = new Xlsx($spreadsheet);
// 设置文件名和 Content-Disposition 头部
$fileName = $fileName . date('Y-m-d', time()) . ".xlsx";
header('Content-Disposition: attachment; filename=' . $fileName);
// 将 Excel 文件写入到输出缓冲区
$writer->save('php://output');
// 立即刷新输出缓冲区, 以确保Excel文件可以正确地下载。
flush();
exit;
}