From 1825ac8ffb546c1d168a0e28f79078be3796cde5 Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Mon, 10 Mar 2025 14:59:47 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9xlsx=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/common.php | 21 ++++++++++++------- app/admin/controller/v1/Article.php | 2 +- .../controller/v1/ArticleLeaveMessage.php | 2 +- app/admin/controller/v1/Menu.php | 2 +- app/admin/controller/v1/Product.php | 2 +- .../controller/v1/ProductPurchaseLink.php | 2 +- app/admin/controller/v1/Video.php | 2 +- 7 files changed, 20 insertions(+), 13 deletions(-) diff --git a/app/admin/common.php b/app/admin/common.php index ed6d4c0f..b8a612cb 100644 --- a/app/admin/common.php +++ b/app/admin/common.php @@ -77,9 +77,10 @@ if (!function_exists('xlsx_writer')) { * @param array $data 数据 例:[['name'=>'张三','age'=>18, 'sex'=>'男']] * @param array $schema 表头信息 例:['name' => '姓名', 'age' => '年龄', 'sex' => '性别'] * @param string $filename 下载文件名称 默认为YmdHis时间 - * @return \PhpOffice\PhpSpreadsheet\Writer\IWriter + * @param string $output 输出方式 php://output 或 文件路径 + * @return \think\Response */ - function xlsx_writer(array|\think\model\Collection $data, array $schema, string $filename = ''): \PhpOffice\PhpSpreadsheet\Writer\IWriter + function xlsx_writer(array|\think\model\Collection $data, array $schema, string $filename = '', string $output = 'php://output'): \think\Response { // 获取Spreadsheet对象 $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); @@ -109,10 +110,16 @@ if (!function_exists('xlsx_writer')) { flush(); ob_flush(); if ($filename == '') $filename = date('YmdHis'); - header('Access-Control-Expose-Headers: Content-Disposition'); - header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; Charset=UTF-8'); - header('Content-Disposition: attachment;filename=' . $filename . '.xlsx'); - header('Cache-Control: max-age=0'); - return \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); + // 文件写入缓冲区 + \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx')->save($output); + // 从缓冲区获取导出文件,并通过Response返回(解决thinkphp框架的Response无法获取设置的header问题) + $file_data = ob_get_clean(); + $response = \think\Response::create($file_data)->header([ + 'Access-Control-Expose-Headers' => 'Content-Disposition', + 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; Charset=UTF-8', + 'Content-Disposition' => 'attachment;filename=' . $filename . '.xlsx', + 'Cache-Control' => 'max-age=0' + ]); + return $response; } } \ No newline at end of file diff --git a/app/admin/controller/v1/Article.php b/app/admin/controller/v1/Article.php index 19d0c89b..0ffd0205 100644 --- a/app/admin/controller/v1/Article.php +++ b/app/admin/controller/v1/Article.php @@ -220,7 +220,7 @@ class Article $data = $this->getExportArticleData(); // 导出 - xlsx_writer($data, $schema)->save('php://output'); + return xlsx_writer($data, $schema); } // 获取文章导出数据 diff --git a/app/admin/controller/v1/ArticleLeaveMessage.php b/app/admin/controller/v1/ArticleLeaveMessage.php index 7d712d66..f808acc3 100644 --- a/app/admin/controller/v1/ArticleLeaveMessage.php +++ b/app/admin/controller/v1/ArticleLeaveMessage.php @@ -105,7 +105,7 @@ class ArticleLeaveMessage $data = $this->getExportMessageData(); // 导出 - xlsx_writer($data, $schema)->save('php://output'); + return xlsx_writer($data, $schema); } private function getExportMessageData() { diff --git a/app/admin/controller/v1/Menu.php b/app/admin/controller/v1/Menu.php index 3d09006e..68504634 100644 --- a/app/admin/controller/v1/Menu.php +++ b/app/admin/controller/v1/Menu.php @@ -433,7 +433,7 @@ class Menu $data = $this->getExportMenuData(); // 导出 - xlsx_writer($data, $schema)->save('php://output'); + return xlsx_writer($data, $schema, '', 'php://output', 'file'); } private function getExportMenuData() { diff --git a/app/admin/controller/v1/Product.php b/app/admin/controller/v1/Product.php index 63b6629e..a2e25e3c 100644 --- a/app/admin/controller/v1/Product.php +++ b/app/admin/controller/v1/Product.php @@ -335,7 +335,7 @@ class Product $data = $this->getExportProductData(); // 导出 - xlsx_writer($data, $schema)->save('php://output'); + return xlsx_writer($data, $schema); } // 获取产品导出数据 private function getExportProductData() diff --git a/app/admin/controller/v1/ProductPurchaseLink.php b/app/admin/controller/v1/ProductPurchaseLink.php index 80783bb7..60f903ef 100644 --- a/app/admin/controller/v1/ProductPurchaseLink.php +++ b/app/admin/controller/v1/ProductPurchaseLink.php @@ -230,7 +230,7 @@ class ProductPurchaseLink $data = $this->getExportLinkData(); /// 导出 - xlsx_writer($data, $schema)->save('php://output'); + return xlsx_writer($data, $schema); } private function getExportLinkData() { diff --git a/app/admin/controller/v1/Video.php b/app/admin/controller/v1/Video.php index 986afd1c..c9012d27 100644 --- a/app/admin/controller/v1/Video.php +++ b/app/admin/controller/v1/Video.php @@ -196,7 +196,7 @@ class Video $data = $this->getExportVideoData(); // 导出 - xlsx_writer($data, $schema)->save('php://output'); + return xlsx_writer($data, $schema); } private function getExportVideoData() {