Ver Fonte

导出修改

moonsflyer há 6 meses atrás
pai
commit
0ad0d9232c
1 ficheiros alterados com 158 adições e 5 exclusões
  1. 158 5
      app/adminapi/lists/gift_card/GiftCardInfoLists.php

+ 158 - 5
app/adminapi/lists/gift_card/GiftCardInfoLists.php

@@ -27,6 +27,8 @@ use app\common\{
     model\GiftCardInfo};
 use app\common\service\FileService;
 use app\common\service\GiftCardQrCodeService;
+use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
+
 
 
 /**
@@ -34,10 +36,11 @@ use app\common\service\GiftCardQrCodeService;
  * Class GoodsLists
  * @package app\adminapi\lists\goods
  */
-class GiftCardInfoLists extends BaseAdminDataLists implements ListsExtendInterface,ListsExcelInterface
+class GiftCardInfoLists extends BaseAdminDataLists
 {
     // ... existing code ...
-
+    use ListsSearchTrait;
+    use ListsExcelTrait;
     /**
      * 批量生成二维码
      * @return array
@@ -108,8 +111,8 @@ class GiftCardInfoLists extends BaseAdminDataLists implements ListsExtendInterfa
      */
     public function lists(): array
     {
-
-        $lists = GiftCardInfo::where($this->setSearch())
+        $field = 'id,gc_id,card_no,card_pass,card_money,is_used,user_id,used_time,create_time,qr_code_path';
+        $lists = GiftCardInfo::field($field)->where($this->setSearch())
             ->with(['user'])
             ->append(['is_used_desc','used_user_name','batch_no','qr_code_url'])
             ->limit($this->limitOffset, $this->limitLength)
@@ -118,7 +121,7 @@ class GiftCardInfoLists extends BaseAdminDataLists implements ListsExtendInterfa
             ->toArray();
 //
         foreach ($lists as &$list) {
-            $list['qr_code_path']  = 'https://nongfa.sdshengyuekeji.cn/'.$list['qr_code_path'];
+            $list['qr_code_url']  = 'https://nongfa.sdshengyuekeji.cn/'.$list['qr_code_path'];
         }
 
         return $lists;
@@ -165,9 +168,159 @@ class GiftCardInfoLists extends BaseAdminDataLists implements ListsExtendInterfa
             'used_user_name'    =>  '使用人',
             'used_time'  => '使用时间',
             'create_time'=> '创建时间',
+            'qr_code_url' => '小程序码', // 添加小程序码字段
         ];
     }
 
+    /**
+     * @notes 创建包含图片的excel
+     * @param $excelFields
+     * @param $lists
+     * @return string
+     * @throws \PhpOffice\PhpSpreadsheet\Exception
+     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
+     */
+    public function createExcel($excelFields, $lists)
+    {
+        $title = array_values($excelFields);
+        $letter_column = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
+
+        $data = [];
+        foreach ($lists as $row) {
+            $temp = [];
+            foreach ($excelFields as $key => $excelField) {
+                $fieldData = $row[$key];
+                if(is_numeric($fieldData) && strlen($fieldData) >= 11){
+                    $fieldData.="\t";
+                }
+                $temp[$key] = $fieldData;
+            }
+            $data[] = $temp;
+        }
+
+        $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
+        $sheet = $spreadsheet->getActiveSheet();
+
+        //设置单元格内容
+        foreach ($title as $key => $value) {
+            // 单元格内容写入
+            $sheet->setCellValueByColumnAndRow($key + 1, 1, $value);
+        }
+        //设置行高
+        $spreadsheet->getActiveSheet()->getRowDimension(1)->setRowHeight(25);
+
+        $row = 2; //从第二行开始
+        $qrCodeColumnIndex = array_search('qr_code_url', array_keys($excelFields)); // 获取二维码列的索引
+
+        foreach ($data as $rowIndex => $item) {
+            $column = 1;
+            foreach ($item as $key => $value) {
+                $columnIndex = $column - 1;
+
+                // 如果是二维码列且有URL,插入图片
+                if ($key === 'qr_code_url' && !empty($value)) {
+                    try {
+                        // 设置单元格为空,为图片腾出空间
+                        $sheet->setCellValueByColumnAndRow($column, $row, '');
+
+                        // 下载图片到临时文件
+                        $imageContent = @file_get_contents($value);
+                        if ($imageContent !== false) {
+                            $tempFile = sys_get_temp_dir() . '/qr_' . $rowIndex . '_' . time() . '.png';
+                            file_put_contents($tempFile, $imageContent);
+
+                            // 创建图片对象
+                            $drawing = new Drawing();
+                            $drawing->setName('QR Code');
+                            $drawing->setDescription('小程序码');
+                            $drawing->setPath($tempFile);
+                            $drawing->setHeight(60); // 设置图片高度
+                            $drawing->setWidth(60);  // 设置图片宽度
+
+                            // 设置图片位置
+                            $cellCoordinate = $letter_column[$columnIndex] . $row;
+                            $drawing->setCoordinates($cellCoordinate);
+                            $drawing->setOffsetX(5); // X轴偏移
+                            $drawing->setOffsetY(5); // Y轴偏移
+
+                            // 将图片添加到工作表
+                            $drawing->setWorksheet($sheet);
+
+                            // 设置行高以适应图片
+                            $spreadsheet->getActiveSheet()->getRowDimension($row)->setRowHeight(70);
+
+                            // 清理临时文件
+                            @unlink($tempFile);
+                        } else {
+                            // 如果图片下载失败,显示URL
+                            $sheet->setCellValueByColumnAndRow($column, $row, $value);
+                        }
+                    } catch (\Exception $e) {
+                        // 如果图片插入失败,显示URL
+                        $sheet->setCellValueByColumnAndRow($column, $row, $value);
+                    }
+                } else {
+                    // 普通文本数据
+                    $value = strpos($value, '=') === 0 ? " " . $value : $value;
+                    $sheet->setCellValueByColumnAndRow($column, $row, $value);
+                }
+
+                // 设置列宽
+                $columnWidth = ($key === 'qr_code_url') ? 15 : max([strlen($value) * 1.2, 15]);
+                $spreadsheet->getActiveSheet()->getColumnDimension($letter_column[$columnIndex])->setWidth($columnWidth);
+
+                $column++;
+            }
+
+            // 设置默认行高
+            if (!isset($qrCodeColumnIndex) || empty($data[$rowIndex]['qr_code_url'])) {
+                $spreadsheet->getActiveSheet()->getRowDimension($row)->setRowHeight(25);
+            }
+
+            $row++;
+        }
+
+        $getHighestRowAndColumn = $sheet->getHighestRowAndColumn();
+        $HighestRow = $getHighestRowAndColumn['row'];
+        $columnLetter = $getHighestRowAndColumn['column'];
+        $titleScope = 'A1:' . $columnLetter . '1';//第一(标题)范围
+
+        // 设置标题样式
+        $sheet->getStyle($titleScope)
+            ->getFill()
+            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
+            ->getStartColor()
+            ->setARGB('26956d');
+        $sheet->getStyle($titleScope)->getFont()->getColor()
+            ->setARGB('FFFFFF');
+
+        $allScope = 'A1:' . $columnLetter . $HighestRow;
+        // 设置居中对齐
+        $styleArray = [
+            'alignment' => [
+                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
+                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
+            ],
+        ];
+        $sheet->getStyle($allScope)->applyFromArray($styleArray);
+
+        // 设置边框
+        $sheet->getStyle($allScope)->getBorders()->getAllBorders()
+            ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
+
+        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
+
+        //创建excel文件
+        $exportCache = new \app\common\cache\ExportCache();
+        $src = $exportCache->getSrc();
+        if (!file_exists($src)) {
+            mkdir($src, 0775, true);
+        }
+        $writer->save($src . $this->fileName);
+
+        //设置本地excel缓存并返回下载地址
+        return (string)(url('index/download/export', ['file' => $exportCache->setFile($this->fileName)], true, true));
+    }
 
 
 }