背景
某药物安全报告系统,业务中安全报告需要批量导出,报告内容涵盖文字、图片;为了导出后方便查阅,将文本数据批量写入至Excel表格,图片则放置于对应文件夹,将表格与文件夹分层压缩并提供下载。
实现
在Dcat-Admin系统中,默认的导出功能不满足此次业务中的复杂需求,需要扩展导出功能,笔者require的是3.0版本的maatwebsite/excel库
// 导出器
class ExcelExpoter extends AbstractExporter
{
// 导出方法
public function export()
{
$excelFileName = 'export.excel'; // Excel文件名
$head = []; // 自定义表头
// 创建导出记录(业务相关)
$list = array();
$rows = collect($this->buildData(1, 10000))->toArray(); // 取出选中记录(最多一万条)
foreach ($rows as $key => $item) {
$report = Report::find($item['id']); // 取得报告模型
// 组装数据
$list[] = [
$sn, $created_at, $report_title
];
}
$export = new ReportExport($list, $head); // 这里使用了封装好的maatwebsite/excel库 实现类
$export->setSheetName('sheet1'); // 设置sheet名称
Excel::store($export, 'reports/' . $excelFileName); // 保存Excel
ProcessExcel::dispatch($batch); // 分发队列 进行压缩处理
// return '';
}
为了更快响应请求,使用队列创建、分发任务去执行压缩处理
ZipArchive库的压缩实现与我们手动去压缩文件的思路不太一样。一般我们会将需要压缩的文件、文件夹,按照想要的层级存放,右键选中最外层文件夹压缩即可。在我们使用ZipArchive库进行压缩,思路是反向的,需要把压缩包当成一个文件夹,往里面add文件/文件夹
class ProcessExcel implements ShouldQueue
{
function handle() {
$batch = $this->batch; // 取得导出记录模型
$zip_file = $this->report_path . $batch->filename; // 要下载的压缩包的名称
// 初始化
$zip = new \ZipArchive();
// 创建|覆盖
if ($zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
$excelFileName = $batch->getExcelFileName();
$zip->addFile($this->report_path . $excelFileName, $excelFileName); // 首先把表格加入压缩包
$items = $batch->item; // 导出记录的报告项目item
if (!$items->isEmpty()) {
foreach ($items as $key => $value) {
$this->addImgToZip($value, $zip); // 依据业务要求 单个报告的图片按照分类分别进行创建文件夹处理
}
}
$zip->close(); //关闭处理的zip文件
}
return;
}
参考资料
Laravel maatwebsite/excel 3.1 实现导出导入
本文由 ben 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jun 2, 2022 at 03:29 pm