From df67fe187fae9ce9f486ea2f14c95a14d843e4a1 Mon Sep 17 00:00:00 2001
From: cjl <276999030@qq.com>
Date: Wed, 15 Nov 2023 14:23:56 +0800
Subject: [PATCH] fix:增加导出功能

---
 screen-api/src/main/java/com/moral/api/service/FileTableService.java                 |    3 
 screen-api/src/main/java/com/moral/api/service/AllocationService.java                |    4 
 screen-api/src/main/java/com/moral/api/utils/CustomImageModifyHandler.java           |  127 ++++++++++
 screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java       |   13 +
 screen-api/src/main/java/com/moral/api/utils/MyUrlConverterUtil.java                 |   70 +++++
 screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationListExcelVo.java |  172 ++++++++++++++
 screen-api/pom.xml                                                                   |   12 +
 screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExcelExt.java   |   51 ++++
 screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java        |   19 +
 screen-api/src/main/resources/application-qa.yml                                     |    2 
 screen-api/src/main/java/com/moral/api/controller/AllocationController.java          |   98 +++++--
 screen-api/src/main/java/com/moral/api/pojo/vo/file/FileAddressVo.java               |   32 ++
 screen-api/src/main/java/com/moral/api/utils/MyStringImageConverterUtil.java         |   69 +++++
 13 files changed, 643 insertions(+), 29 deletions(-)

diff --git a/screen-api/pom.xml b/screen-api/pom.xml
index 16b68d7..9a39a17 100644
--- a/screen-api/pom.xml
+++ b/screen-api/pom.xml
@@ -53,6 +53,18 @@
             <artifactId>fastjson</artifactId>
             <version>1.2.66</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.7</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>4.0.1</version>
+        </dependency>
+
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-spring-boot-starter</artifactId>
diff --git a/screen-api/src/main/java/com/moral/api/controller/AllocationController.java b/screen-api/src/main/java/com/moral/api/controller/AllocationController.java
index 86f968a..afdc6de 100644
--- a/screen-api/src/main/java/com/moral/api/controller/AllocationController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/AllocationController.java
@@ -1,49 +1,45 @@
 package com.moral.api.controller;
 
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import org.apache.commons.collections4.CollectionUtils;
+import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.moral.api.entity.AllocationLog;
-import com.moral.api.pojo.enums.SysDictTypeEnum;
+import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.pojo.ext.allocation.AllocationExcelExt;
 import com.moral.api.pojo.ext.allocation.AllocationExt;
 import com.moral.api.pojo.ext.allocation.AllocationPageExt;
 import com.moral.api.pojo.query.allocation.*;
 import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
-
+import com.moral.api.pojo.vo.allocation.AllocationListExcelVo;
 import com.moral.api.pojo.vo.allocation.AllocationPageVo;
 import com.moral.api.pojo.vo.allocation.AllocationVo;
-
-import com.moral.constant.PageResult;
-import io.swagger.annotations.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.ObjectUtils;
-
-import org.springframework.web.bind.annotation.*;
-
-import java.util.ArrayList;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import com.moral.api.entity.ResponsibilityUnit;
-
+import com.moral.api.pojo.vo.file.FileAddressVo;
 import com.moral.api.service.AllocationService;
-import com.moral.api.utils.EasyExcelUtils;
-import com.moral.api.utils.NoModelWriteData;
+import com.moral.api.utils.*;
 import com.moral.constant.Constants;
+import com.moral.constant.PageResult;
 import com.moral.constant.ResultMessage;
 import com.moral.util.DateUtils;
 import com.moral.util.WebUtils;
+import io.swagger.annotations.*;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
 
-
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 
 @Api(tags = {"������������"})
@@ -51,6 +47,8 @@
 @RequestMapping("allocation")
 public class AllocationController {
 
+    @Value("${file.path}")
+    private String basePath;
     @Autowired
     private AllocationService allocationService;
 
@@ -220,4 +218,48 @@
     }
 
 
+
+    @GetMapping("listExcel")
+    @ApiOperation("������������")
+    public void listExcel(@RequestParam @ApiParam(value = "id",name = "������id") List<Integer> id,HttpServletResponse response){
+
+        List<AllocationExcelExt> extList = allocationService.listExcel(id);
+        try {
+            genImageExcel(extList,response);
+        }catch (Exception e){
+
+        }
+
+    }
+
+    private final String PARHTINAGE = "https://qx.7drlb.com/api/file/preview/";
+
+    private void genImageExcel(List<AllocationExcelExt> list, HttpServletResponse response) throws IOException {
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        List<AllocationListExcelVo> demoDataList = new ArrayList<>();
+        for(int i = 0;i<list.size();i++){
+            AllocationListExcelVo item = AllocationListExcelVo.convert(list.get(i));
+            List<String> urls = new ArrayList<>();
+            for(FileAddressVo z : list.get(i).getFileBaseList()){
+                urls.add(handleFileRealPath(z.getFileAddress()));
+            }
+            item.setWriteCellDataFile(urls);
+            demoDataList.add(item);
+        }
+        try {
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''"
+                    + URLEncoder.encode("���������������", "utf-8") + ".xlsx");
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+        EasyExcel.write(response.getOutputStream(), AllocationListExcelVo.class)
+                .registerWriteHandler(new CustomImageModifyHandler()).sheet("���������").doWrite(demoDataList);
+        }catch (Exception e){
+
+        }
+    }
+    private String handleFileRealPath(String path) {
+        return basePath.replaceAll(StringUtils.BACKSLASH.concat(StringUtils.BACKSLASH), StringUtils.SLASH).concat(StringUtils.SLASH).concat(path);
+    }
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExcelExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExcelExt.java
new file mode 100644
index 0000000..a73cc6d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExcelExt.java
@@ -0,0 +1,51 @@
+package com.moral.api.pojo.ext.allocation;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
+import com.moral.api.pojo.vo.file.FileAddressVo;
+import com.moral.api.pojo.vo.file.FileVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationExcelExt extends Allocation {
+
+    @ApiModelProperty(value = "������������")
+    private List<FileAddressVo> fileBaseList;
+
+ /*   @ApiModelProperty(value = "������������")
+    private List<FileVo> fileChangeList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileApproveList;
+
+    @ApiModelProperty(value = "������������")
+    private List<ApproveTableListVo> approveList;*/
+
+    //������������������
+    @TableField(exist = false)
+    private String unitName;
+
+    //������������������
+    @TableField(exist = false)
+    private String escalationUnitName;
+    @TableField(exist = false)
+    //������������������
+    private String polluteTypeName;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationListExcelVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationListExcelVo.java
new file mode 100644
index 0000000..f5fefde
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationListExcelVo.java
@@ -0,0 +1,172 @@
+package com.moral.api.pojo.vo.allocation;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.pojo.ext.allocation.AllocationExcelExt;
+import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
+import com.moral.api.pojo.vo.file.FileAddressVo;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import com.moral.api.utils.MyStringImageConverterUtil;
+import com.moral.api.utils.MyUrlConverterUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.net.URL;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationListExcelVo - ������VO������", description="AllocationListExcelVo - ������VO������")
+public class AllocationListExcelVo implements Serializable {
+
+
+
+
+    @ApiModelProperty(value = "������������")
+    @ExcelProperty(value = "������������")
+    private String allocationNum;
+
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    @ExcelProperty(value = "������������")
+    private Date escalationTime;
+
+    @ApiModelProperty(value = "������������")
+    @ExcelProperty(value = "������������")
+    private String pollutePosition;
+
+  /*  @ApiModelProperty(value = "������������")
+    private List<FileAddressVo> fileBaseList;*/
+
+    @ApiModelProperty(value = "������������")
+    @ExcelProperty(value = "���������������",converter = MyStringImageConverterUtil.class)
+    private List<String> writeCellDataFile;
+
+    @ApiModelProperty(value = "���������")
+    @ExcelProperty(value = "���������")
+    private String escalationName;
+
+   /* @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������")
+    private String problemDescribe;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isChange;
+
+    @ApiModelProperty(value = "������������")
+    private String changeDescribe;
+
+    @ApiModelProperty(value = "���������������")
+    private String changeName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date changeTime;
+
+    @ApiModelProperty(value = "������������")
+    private Integer checkScore;
+
+    @ApiModelProperty(value = "������������")
+    private String checkDescribe;
+
+    @ApiModelProperty(value = "���������")
+    private String checkName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date checkTime;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isInvalid;
+
+    @ApiModelProperty(value = "������������")
+    private String invalidReason;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date updateTime;
+
+
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileChangeList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileApproveList;
+
+    @ApiModelProperty(value = "������������")
+    private List<ApproveTableListVo> approveList;
+
+    @TableField(exist = false)
+    private String time;
+
+    @TableField(exist = false)
+    private String unitName;
+    @TableField(exist = false)
+    private String escalationUnitName;
+    @TableField(exist = false)
+    private String polluteTypeName;*/
+
+
+    public static AllocationListExcelVo convert(AllocationExcelExt allocationExt) {
+        AllocationListExcelVo allocationVo = BeanConverts.convert(allocationExt, AllocationListExcelVo.class);
+        return allocationVo;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/file/FileAddressVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/file/FileAddressVo.java
new file mode 100644
index 0000000..26d087c
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/file/FileAddressVo.java
@@ -0,0 +1,32 @@
+package com.moral.api.pojo.vo.file;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @ClassName FileVo
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-21 14:51
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(description="FileAddressVo - ������VO������")
+public class FileAddressVo {
+    @ApiModelProperty(value = "ID")
+    private Integer fileId;
+
+    @ApiModelProperty(value = "������������")
+    private String fileName;
+
+    @ApiModelProperty(value = "������������")
+    private String fileAddress;
+
+    @ApiModelProperty(value = "������1������")
+    private Integer fileType;
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/AllocationService.java b/screen-api/src/main/java/com/moral/api/service/AllocationService.java
index 0da84e8..18b9bcb 100644
--- a/screen-api/src/main/java/com/moral/api/service/AllocationService.java
+++ b/screen-api/src/main/java/com/moral/api/service/AllocationService.java
@@ -9,6 +9,7 @@
 import com.moral.api.entity.Allocation;
 import com.moral.api.entity.AllocationLog;
 import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.pojo.ext.allocation.AllocationExcelExt;
 import com.moral.api.pojo.ext.allocation.AllocationExt;
 import com.moral.api.pojo.ext.allocation.AllocationListExt;
 import com.moral.api.pojo.ext.allocation.AllocationPageExt;
@@ -160,4 +161,7 @@
      * @return
      */
     List<Integer> getUnitAuthority(String code);
+
+
+    List<AllocationExcelExt> listExcel(List<Integer> id);
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/FileTableService.java b/screen-api/src/main/java/com/moral/api/service/FileTableService.java
index b63cec4..b102755 100644
--- a/screen-api/src/main/java/com/moral/api/service/FileTableService.java
+++ b/screen-api/src/main/java/com/moral/api/service/FileTableService.java
@@ -2,6 +2,7 @@
 
 import com.moral.api.entity.FileTable;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.pojo.vo.file.FileAddressVo;
 import com.moral.api.pojo.vo.file.FileVo;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -30,4 +31,6 @@
     void upDateResult(List<FileVo> list,int relationId,int fileModule);
 
     List<FileVo> list(int relationId,int fileModule);
+
+    List<FileAddressVo> list(int relationId,int fileModule,int fileType);
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
index 6a2648b..c7c3ebf 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
@@ -19,6 +19,7 @@
 import com.moral.api.pojo.bean.BaseInvalidEntity;
 import com.moral.api.pojo.dto.allocation.AllocationUnitViewDto;
 import com.moral.api.pojo.enums.*;
+import com.moral.api.pojo.ext.allocation.AllocationExcelExt;
 import com.moral.api.pojo.ext.allocation.AllocationExt;
 import com.moral.api.pojo.ext.allocation.AllocationListExt;
 import com.moral.api.pojo.ext.allocation.AllocationPageExt;
@@ -31,6 +32,7 @@
 import com.moral.api.pojo.vo.app.AppAuthority;
 import com.moral.api.pojo.vo.user.QxUser;
 import com.moral.api.service.*;
+import com.moral.api.utils.BeanConverts;
 import com.moral.constant.Constants;
 import com.moral.constant.RedisConstants;
 import com.moral.util.DateUtils;
@@ -994,4 +996,15 @@
           return   responsibilityUnit;
     }
 
+    @Override
+    public List<AllocationExcelExt> listExcel(List<Integer> id) {
+        List<AllocationExcelExt> list = new ArrayList<>();
+        for(Integer i : id){
+            AllocationExt allocationExt = oneAllocation(i);
+            AllocationExcelExt allocationExcelExt = BeanConverts.convert(allocationExt,AllocationExcelExt.class);
+            allocationExcelExt.setFileBaseList(fileTableService.list(i,FileTableEnum.ALLOCATION_FOUNDATION.value,FileType.PICTURE.getValue()));
+            list.add(allocationExcelExt);
+        }
+        return list;
+    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java
index 4d17a57..d1e99f7 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java
@@ -6,6 +6,7 @@
 import com.moral.api.mapper.FileTableMapper;
 import com.moral.api.pojo.enums.FileType;
 import com.moral.api.pojo.enums.YesOrNo;
+import com.moral.api.pojo.vo.file.FileAddressVo;
 import com.moral.api.pojo.vo.file.FileVo;
 import com.moral.api.pojo.vo.user.QxUser;
 import com.moral.api.service.FileTableService;
@@ -236,4 +237,22 @@
         });
         return list;
     }
+
+    @Override
+    public List<FileAddressVo> list(int relationId, int fileModule, int fileType) {
+        List<FileAddressVo> list = new ArrayList<>();
+        List<FileTable> existsList = this.lambdaQuery().eq(FileTable::getRelationId, relationId)
+                .eq(FileTable::getFileModule, fileModule)
+                .eq(Objects.nonNull(fileType),FileTable::getFileType,fileType)
+                .eq(FileTable::getIsDel, YesOrNo.NO.value).orderByAsc(FileTable::getCreateTime).list();
+        existsList.forEach(it->{
+            FileAddressVo fileVo = new FileAddressVo();
+            fileVo.setFileId(it.getFileId());
+            fileVo.setFileName(it.getFileName());
+            fileVo.setFileType(it.getFileType());
+            fileVo.setFileAddress(it.getFileAddress());
+            list.add(fileVo);
+        });
+        return list;
+    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/utils/CustomImageModifyHandler.java b/screen-api/src/main/java/com/moral/api/utils/CustomImageModifyHandler.java
new file mode 100644
index 0000000..e130b06
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/utils/CustomImageModifyHandler.java
@@ -0,0 +1,127 @@
+package com.moral.api.utils;
+
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.util.Units;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName CustomImageModifyHandler
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-11-15 10:56
+ * @Version 1.0
+ */
+public class CustomImageModifyHandler implements CellWriteHandler {
+    private List<String> repeats = new ArrayList<>();
+    // ������������������������������������������������������������������������������������������������������������������������������������
+    private Integer maxDataSize = 0;
+    @Override
+    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
+
+    }
+
+    @Override
+    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+
+    }
+
+    @Override
+    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+        //  ��� ��������������������� ���������������������������������
+        if (isHead) {
+            return;
+        }
+        //���������������������������������type������������,���������������������
+        if(cellData.getImageValue()!=null||cellData.getData() instanceof ArrayList){
+            cellData.setType(CellDataTypeEnum.EMPTY);
+        }
+    }
+
+    @Override
+    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+        //  ��� ������������������������ ���������������������
+        if (isHead || CollectionUtils.isEmpty(cellDataList)) {
+            return;
+        }
+        Boolean listFlag = false;
+        ArrayList data = null;
+        Sheet sheet = cell.getSheet();
+        // ���������ListUrlConverterUtil������������
+        if (cellDataList.get(0).getData() instanceof ArrayList){
+            data = (ArrayList) cellDataList.get(0).getData();
+            if (CollectionUtils.isEmpty(data)) {
+                return;
+            }
+            if (data.get(0) instanceof CellData){
+                CellData cellData = (CellData) data.get(0);
+                if (cellData.getImageValue() == null){
+                    return;
+                }else {
+                    listFlag = true;
+                }
+            }
+        }
+        if (!listFlag && cellDataList.get(0).getImageValue() == null){
+            return;
+        }
+        String key = cell.getRowIndex() + "_" + cell.getColumnIndex();
+        if (repeats.contains(key)){
+            return;
+        }
+        repeats.add(key);
+        if (data.size() > maxDataSize) {
+            maxDataSize = data.size();
+        }
+        //60px������������������900,60px���������������248*8,������������������
+        sheet.getRow(cell.getRowIndex()).setHeight((short)900);
+        sheet.setColumnWidth(cell.getColumnIndex(), (int) (listFlag?21.8*256*maxDataSize:22.8*256));
+
+        if (listFlag){
+            for (int i = 0; i < data.size(); i++) {
+                CellData cellData= (CellData) data.get(i);
+                if(cellData.getImageValue()==null){
+                    continue;
+                }
+                this.insertImage(sheet,cell,cellData.getImageValue(),i);
+            }
+        }else {
+            // cellDataList ���list������������ ������������������ ������������������������������������ ������������������������ ������������������
+            this.insertImage(sheet,cell,cellDataList.get(0).getImageValue(),0);
+        }
+
+    }
+
+    private void insertImage(Sheet sheet,Cell cell,byte[] pictureData,int i){
+        int picWidth = Units.pixelToEMU(175);
+        int index = sheet.getWorkbook().addPicture(pictureData, HSSFWorkbook.PICTURE_TYPE_PNG);
+        Drawing drawing = sheet.getDrawingPatriarch();
+        if (drawing == null) {
+            drawing = sheet.createDrawingPatriarch();
+        }
+        CreationHelper helper = sheet.getWorkbook().getCreationHelper();
+        ClientAnchor anchor = helper.createClientAnchor();
+        // ������������������
+        anchor.setDx1(picWidth*i);
+        anchor.setDx2(picWidth+picWidth*i);
+        anchor.setDy1(0);
+        anchor.setDy2(0);
+        //������������������
+        anchor.setCol1(cell.getColumnIndex());
+        anchor.setCol2(cell.getColumnIndex());
+        anchor.setRow1(cell.getRowIndex());
+        anchor.setRow2(cell.getRowIndex() + 1);
+        // ���������������������������������������
+        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+        drawing.createPicture(anchor, index);
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/utils/MyStringImageConverterUtil.java b/screen-api/src/main/java/com/moral/api/utils/MyStringImageConverterUtil.java
new file mode 100644
index 0000000..77ff3d2
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/utils/MyStringImageConverterUtil.java
@@ -0,0 +1,69 @@
+package com.moral.api.utils;
+
+import cn.hutool.core.convert.Convert;
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.alibaba.excel.util.IoUtils;
+
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName MyStringImageConverterUtil
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-11-15 14:08
+ * @Version 1.0
+ */
+public class MyStringImageConverterUtil implements Converter<List<String>> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return List.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.IMAGE;
+    }
+
+    @Override
+    public List<String> convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        String stringValue = cellData.getStringValue();
+        //���json���������������excel���������������������������java List<String>������
+        List<String> list = Convert.toList(String.class,stringValue);
+        return list;
+
+    }
+
+    @Override
+    public CellData convertToExcelData(List<String> stringUrl, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        // ������������������������������URL������������
+        List<CellData> data = new ArrayList<>();
+        // for ������������������
+        for (String url : stringUrl) {
+            FileInputStream inputStream = null;
+            try {
+                inputStream = new FileInputStream(url);
+                byte[] bytes = IoUtils.toByteArray(inputStream);
+                data.add(new CellData(bytes));
+            } catch (Exception e) {
+                //���������������������������
+                //data.add(new CellData(IoUtils.toByteArray(new FileInputStream("D:\\easyexcel\\err.png"))));
+                continue;
+            } finally {
+                if (inputStream != null){
+                    inputStream.close();
+                }
+            }
+        }
+
+        // ���������������������������������List,������������������CellData cellData = new CellData(data);���������list���������������������CellData���������data������������
+        CellData cellData = new CellData(data);
+        cellData.setType(CellDataTypeEnum.IMAGE);
+        return cellData;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/utils/MyUrlConverterUtil.java b/screen-api/src/main/java/com/moral/api/utils/MyUrlConverterUtil.java
new file mode 100644
index 0000000..ab96d18
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/utils/MyUrlConverterUtil.java
@@ -0,0 +1,70 @@
+package com.moral.api.utils;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.alibaba.excel.util.IoUtils;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName MyUrlConverterUtil
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-11-15 11:02
+ * @Version 1.0
+ */
+public class MyUrlConverterUtil implements Converter<List<URL>> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return List.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        /**
+         *���������������������������IMAGE
+         */
+        return CellDataTypeEnum.IMAGE;
+    }
+
+    @Override
+    public List convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(List<URL> value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        // ������������������������������URL������������
+        List<CellData> data = new ArrayList<>();
+        // for ������������������
+        for (URL url : value) {
+            InputStream inputStream = null;
+            try {
+                inputStream = url.openStream();
+                byte[] bytes = IoUtils.toByteArray(inputStream);
+                data.add(new CellData(bytes));
+            } catch (Exception e) {
+                //���������������������������
+                data.add(new CellData(IoUtils.toByteArray(new FileInputStream("D:\\easyexcel\\err.png"))));
+                continue;
+            } finally {
+                if (inputStream != null){
+                    inputStream.close();
+                }
+            }
+        }
+
+        // ���������������������������������List,������������������CellData cellData = new CellData(data);���������list���������������������CellData���������data������������
+        CellData cellData = new CellData(data);
+        cellData.setType(CellDataTypeEnum.IMAGE);
+        return cellData;
+    }
+
+}
diff --git a/screen-api/src/main/resources/application-qa.yml b/screen-api/src/main/resources/application-qa.yml
index ccec2b7..66a5a9f 100644
--- a/screen-api/src/main/resources/application-qa.yml
+++ b/screen-api/src/main/resources/application-qa.yml
@@ -141,4 +141,4 @@
     foh3wi2ooghiCh5
 
 file:
-  path: /data/upload/
\ No newline at end of file
+  path: E:/upload
\ No newline at end of file

--
Gitblit v1.8.0