遇到一个需要导出导入excel文件的需求,这两天一直在搞这个,昨天没更并不是因为偷懒哈😁
hpSpreadsheet下载
上一篇文章已经解释很清楚了:http://119.23.67.123/2021/06/05/composer-phpspreadsheet/
PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式 PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到
- 把下载好 的插件放进工程根目录
- 在php文件中导入
<?php
require 'vendor/autoload.php';
//使用Spreadsheet类
use PhpOffice\PhpSpreadsheet\Spreadsheet;
//xlsx格式类
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
//可以生成多种格式类
//use PhpOffice\PhpSpreadsheet\IOFactory;
- 实例化Spreadsheet对象
// 实例化 Spreadsheet 对象
$spreadsheet = new Spreadsheet();
// 获取工作薄
$worksheet= $spreadsheet->getActiveSheet();
- excel表头设置
//表头数组
$title = ['订单号', '样品/礼品', '收件人','手机号','地址','快递单号'];
/**
* 参数说明
* setCellValueByColumnAndRow(参数1,参数2,参数3)
* 参数1:列位置
* 参数2:行位置
* 参数3:单元格的值
*/
//表头
//设置单元格内容 遍历表头的数组设置到单元格上
foreach ($title as $key => $value) {
$worksheet->setCellValueByColumnAndRow($key+1, 1, $value);
}
- 设置工作表的名称
//设置工作表标题名称
$worksheet->setTitle('工作表格1');
效果:
- 从数据库中获取数据,并按照自己想要的数据排序好
//表单数据
$dataResult = array(); //todo:导出数据(自行设置)
$sql = "SELECT * FROM exchange_record WHERE status=0 and address is not null LIMIT 1000";//
$result = $conn->query($sql);
//>0就是有数据
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
global $sql;
//创建一个数组 记录每条数据,按我们要的顺序添加进去。
$d = array();
$d["order_id"] = $row["order_id"];
//查 样品/礼品 名字
s
//根据id查名字
$result2 = $conn->query($sql);
// 输出数据
while($row2 = $result2->fetch_assoc()) {
$d["name"] = $row2["name"];
}
$d["consignee"] = $row["consignee"];
$d["phone"] = $row["phone"];
$d["address"] = $row["address"];
$d["express_id"] = null;
//把数组添加到多维数组中
$dataResult[] = $d;
}
}
$dataResult可以是任何你想要渲染到单元格的多维数组
- 把数据填充到对应的单元格
$row = 2; //从第二行开始
//便利数据数组填充到对应的单元格
foreach ($dataResult as $item) {
$column = 1; //列从第一格开始
foreach ($item as $value) {
$worksheet->setCellValueByColumnAndRow($column, $row, $value);
$column++;
}
$row++; //每一列填充完,+1
}
- 生成excel文件,并设置对应的响应头
//文件名
$fileName = '订单数据';
//文件类型
$fileType = 'Xlsx';
//1.下载到服务器
//$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
//$writer->save($fileName.'.'.$fileType);
//2.输出到浏览器
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); //按照指定格式生成Excel文件
excelBrowserExport($fileName, $fileType);
$writer->save('php://output');
上面的excelBrowserExport();是我封装好的设置响应头的方法,下载时候显示的文件名,类型都是在响应头设置
/**
* 输出到浏览器(需要设置header头)
* @param string $fileName 文件名
* @param string $fileType 文件类型
*/
function excelBrowserExport($fileName, $fileType) {
//文件名称校验
if(!$fileName) {
trigger_error('文件名不能为空', E_USER_ERROR);
}
//Excel文件类型校验
$type = ['Excel2007', 'Xlsx', 'Excel5', 'xls'];
if(!in_array($fileType, $type)) {
trigger_error('未知文件类型', E_USER_ERROR);
}
if($fileType == 'Excel2007' || $fileType == 'Xlsx') {
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$fileName.'.xlsx"');
header('Cache-Control: max-age=0');
} else { //Excel5
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$fileName.'.xls"');
header('Cache-Control: max-age=0');
}
}
后面我会专门写一篇header头设置的博客。
有两种生成方式实现下载对应的excel。一种是在服务器本地生成一个excel文件然后返回path给前端进行下载。一种是直接输出到浏览器。
IOFactory::createWriter();方法是将创建的$spreadsheet对象生成为excel文件
save('php://output'); 官方的文档的注释是:将输出重定向到客户端的 Web 浏览器 。我的理解就是当你动态生成excel文件,想实现通过浏览器直接下载。
当我们完成这些步骤后并通过浏览器访问php文件,浏览器就会制动下载
打开就是这样的
我们可以看到因为单元格列宽不够,文字会显示不全,所有我们要对单元格的属性进行设置
$worksheet->getColumnDimension('A')->setWidth(20);
setWidth()设置成自己想要的参数就可以了
基础Spreadsheet开发使用示例:https://blog.csdn.net/jackbon8/article/details/107915006
官方文档(英文版)需要翻译:https://phpspreadsheet.readthedocs.io/en/stable/topics/recipes/
好了,先写到这了,写这个博客花了我2个小时,也是真的累。如果那里写错了,或有更好的方法,可以在下面评论。