Lavavel 批量压缩导出的实现

in 普通BLOG
0 评论 阅读量:565

背景

某药物安全报告系统,业务中安全报告需要批量导出,报告内容涵盖文字、图片;为了导出后方便查阅,将文本数据批量写入至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 实现导出导入

Laravel 中创建 Zip 压缩文件并提供下载

php ZipArchive类使用实例详解

Comments are closed.