diff --git a/app/admin/common.php b/app/admin/common.php index 00ab387d..67dd7791 100644 --- a/app/admin/common.php +++ b/app/admin/common.php @@ -25,4 +25,50 @@ if (!function_exists('array_to_tree')) { } return $ret; } +} + +if (!function_exists('xlsx_writer')) { + /** + * 构建Excel数据 + * @param array $data 数据 例:[['name'=>'张三','age'=>18, 'sex'=>'男']] + * @param array $schema 表头信息 例:['name' => '姓名', 'age' => '年龄', 'sex' => '性别'] + * @param string $filename 下载文件名称 默认为YmdHis时间 + * @return \PhpOffice\PhpSpreadsheet\Writer\IWriter + */ + function xlsx_writer(array|\think\model\Collection $data, array $schema, string $filename = ''): \PhpOffice\PhpSpreadsheet\Writer\IWriter + { + // 获取Spreadsheet对象 + $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // 写入表头 + $title = array_values($schema); + $title_col = 'A'; + foreach ($title as $value) { + // 单元格内容写入 + $sheet->setCellValue($title_col . '1', $value); + $title_col++; + } + + // 写入数据 + $row = 2; + $keys = array_keys($schema); + foreach ($data as $item) { + $data_col = 'A'; + foreach ($keys as $key) { + $sheet->setCellValue($data_col . $row, $item[$key] ?? ''); + $data_col++; + } + $row++; + } + + 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'); + } } \ No newline at end of file diff --git a/app/admin/controller/v1/Article.php b/app/admin/controller/v1/Article.php index c922f1c1..19d0c89b 100644 --- a/app/admin/controller/v1/Article.php +++ b/app/admin/controller/v1/Article.php @@ -5,8 +5,6 @@ namespace app\admin\controller\v1; use app\admin\model\v1\ArticleModel; use app\admin\validate\v1\ArticleValidate; -use PhpOffice\PhpSpreadsheet\IOFactory; -use PhpOffice\PhpSpreadsheet\Spreadsheet; /** * 文章管理控制器 @@ -221,40 +219,8 @@ class Article // 获取导出数据 $data = $this->getExportArticleData(); - // 获取Spreadsheet对象 - $spreadsheet = new Spreadsheet(); - $sheet = $spreadsheet->getActiveSheet(); - - // 写入表头 - $title = array_values($schema); - $title_col = 'A'; - foreach ($title as $value) { - // 单元格内容写入 - $sheet->setCellValue($title_col . '1', $value); - $title_col++; - } - - // 写入数据 - $row = 2; - $keys = array_keys($schema); - foreach ($data as $item) { - $data_col = 'A'; - foreach ($keys as $key) { - $sheet->setCellValue($data_col . $row, $item[$key]); - $data_col++; - } - $row++; - } - - flush(); - ob_flush(); - $filename = date('YmdHms'); - 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'); - $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); - $writer->save('php://output'); + // 导出 + xlsx_writer($data, $schema)->save('php://output'); } // 获取文章导出数据 diff --git a/app/admin/controller/v1/ArticleLeaveMessage.php b/app/admin/controller/v1/ArticleLeaveMessage.php index a2144706..7d712d66 100644 --- a/app/admin/controller/v1/ArticleLeaveMessage.php +++ b/app/admin/controller/v1/ArticleLeaveMessage.php @@ -4,8 +4,6 @@ declare (strict_types = 1); namespace app\admin\controller\v1; use app\admin\model\v1\ArticleLeaveMessageModel; -use PhpOffice\PhpSpreadsheet\IOFactory; -use PhpOffice\PhpSpreadsheet\Spreadsheet; /** * 文章留言(评论)管理控制器 @@ -106,40 +104,8 @@ class ArticleLeaveMessage // 获取导出数据 $data = $this->getExportMessageData(); - // 获取Spreadsheet对象 - $spreadsheet = new Spreadsheet(); - $sheet = $spreadsheet->getActiveSheet(); - - // 写入表头 - $title = array_values($schema); - $title_col = 'A'; - foreach ($title as $value) { - // 单元格内容写入 - $sheet->setCellValue($title_col . '1', $value); - $title_col++; - } - - // 写入数据 - $row = 2; - $keys = array_keys($schema); - foreach ($data as $item) { - $data_col = 'A'; - foreach ($keys as $key) { - $sheet->setCellValue($data_col . $row, $item[$key]); - $data_col++; - } - $row++; - } - - flush(); - ob_flush(); - $filename = date('YmdHms'); - 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'); - $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); - $writer->save('php://output'); + // 导出 + xlsx_writer($data, $schema)->save('php://output'); } private function getExportMessageData() { @@ -149,7 +115,7 @@ class ArticleLeaveMessage 'CASE WHEN is_audited = 1 THEN "已审核" ELSE "未审核" END' => 'is_audited' ]) ->withJoin(['article' => function($query) use($param) { - $query->where('article.language_id', '=', $param['lang_id']); + $query->where('article.language_id', '=', request()->lang_id); if (!empty($param['title'])) { $query->where('article.title', 'like', '%' . $param['title'] . '%'); } diff --git a/app/admin/controller/v1/Product.php b/app/admin/controller/v1/Product.php index 153c9eb0..2d831792 100644 --- a/app/admin/controller/v1/Product.php +++ b/app/admin/controller/v1/Product.php @@ -9,8 +9,6 @@ use app\admin\model\v1\ProductRelatedModel; use app\admin\model\v1\ProductSkuAttrModel; use app\admin\model\v1\ProductSkuModel; use app\admin\validate\v1\ProductValidate; -use PhpOffice\PhpSpreadsheet\IOFactory; -use PhpOffice\PhpSpreadsheet\Spreadsheet; /** * 产品管理控制器 @@ -336,40 +334,8 @@ class Product // 获取导出数据 $data = $this->getExportProductData(); - // 获取Spreadsheet对象 - $spreadsheet = new Spreadsheet(); - $sheet = $spreadsheet->getActiveSheet(); - - // 写入表头 - $title = array_values($schema); - $title_col = 'A'; - foreach ($title as $value) { - // 单元格内容写入 - $sheet->setCellValue($title_col . '1', $value); - $title_col++; - } - - // 写入数据 - $row = 2; - $keys = array_keys($schema); - foreach ($data as $item) { - $data_col = 'A'; - foreach ($keys as $key) { - $sheet->setCellValue($data_col . $row, $item[$key]??''); - $data_col++; - } - $row++; - } - - flush(); - ob_flush(); - $filename = date('YmdHms'); - 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'); - $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); - $writer->save('php://output'); + // 导出 + xlsx_writer($data, $schema)->save('php://output'); } // 获取产品导出数据 private function getExportProductData() diff --git a/app/admin/controller/v1/ProductPurchaseLink.php b/app/admin/controller/v1/ProductPurchaseLink.php index 04485584..8f1fa73c 100644 --- a/app/admin/controller/v1/ProductPurchaseLink.php +++ b/app/admin/controller/v1/ProductPurchaseLink.php @@ -9,7 +9,6 @@ use app\admin\model\v1\ProductPurchaseLinkModel; use app\admin\model\v1\ProductPurchaseLinkPlatformModel; use app\admin\validate\v1\ProductPurchaseLinkValidate; use PhpOffice\PhpSpreadsheet\IOFactory; -use PhpOffice\PhpSpreadsheet\Spreadsheet; use think\facade\Db; class ProductPurchaseLink @@ -241,40 +240,8 @@ class ProductPurchaseLink // 获取导出数据 $data = $this->getExportLinkData(); - // 获取Spreadsheet对象 - $spreadsheet = new Spreadsheet(); - $sheet = $spreadsheet->getActiveSheet(); - - // 写入表头 - $title = array_values($schema); - $title_col = 'A'; - foreach ($title as $value) { - // 单元格内容写入 - $sheet->setCellValue($title_col . '1', $value); - $title_col++; - } - - // 写入数据 - $row = 2; - $keys = array_keys($schema); - foreach ($data as $item) { - $data_col = 'A'; - foreach ($keys as $key) { - $sheet->setCellValue($data_col . $row, $item[$key] ?? ''); - $data_col++; - } - $row++; - } - - flush(); - ob_flush(); - $filename = date('YmdHms'); - 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'); - $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); - $writer->save('php://output'); + /// 导出 + xlsx_writer($data, $schema)->save('php://output'); } private function getExportLinkData() { diff --git a/app/admin/controller/v1/Video.php b/app/admin/controller/v1/Video.php index a194426e..06d785f9 100644 --- a/app/admin/controller/v1/Video.php +++ b/app/admin/controller/v1/Video.php @@ -6,8 +6,6 @@ namespace app\admin\controller\v1; use app\admin\model\v1\VideoModel; use app\admin\validate\v1\VideoValidate; -use PhpOffice\PhpSpreadsheet\IOFactory; -use PhpOffice\PhpSpreadsheet\Spreadsheet; use think\facade\Config; /** @@ -195,40 +193,8 @@ class Video // 获取导出数据 $data = $this->getExportVideoData(); - // 获取Spreadsheet对象 - $spreadsheet = new Spreadsheet(); - $sheet = $spreadsheet->getActiveSheet(); - - // 写入表头 - $title = array_values($schema); - $title_col = 'A'; - foreach ($title as $value) { - // 单元格内容写入 - $sheet->setCellValue($title_col . '1', $value); - $title_col++; - } - - // 写入数据 - $row = 2; - $keys = array_keys($schema); - foreach ($data as $item) { - $data_col = 'A'; - foreach ($keys as $key) { - $sheet->setCellValue($data_col . $row, $item[$key] ?? ''); - $data_col++; - } - $row++; - } - - flush(); - ob_flush(); - $filename = date('YmdHms'); - 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'); - $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); - $writer->save('php://output'); + // 导出 + xlsx_writer($data, $schema)->save('php://output'); } private function getExportVideoData() {