From 0c479f17e5f9ff3ad638f3af783cf22b0a77fbd0 Mon Sep 17 00:00:00 2001
From: 刘小明 <liuxm_a@163.com>
Date: 星期一, 26 八月 2024 16:04:43 +0800
Subject: [PATCH] 排班导出优化

---
 pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ScheduleCtrl.java           |   24 ++++++--
 pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/CustomCellWriteHandler.java |   82 +++++++++++++++++++++++++++
 pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ExcelVo.java                |   51 +++--------------
 pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java                       |    2 
 pms-parent/pms-global/src/main/resources/mapper/PrScheduleMapper.xml                            |    1 
 5 files changed, 111 insertions(+), 49 deletions(-)

diff --git a/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java b/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java
index 4fae5bf..b14a3ae 100644
--- a/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java
+++ b/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java
@@ -82,7 +82,7 @@
             response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
             EasyExcel.write(response.getOutputStream(), list.get(0).getClass()).sheet(sheetName).doWrite(list);
         }catch (Exception e){
-            log.error("瀵煎嚭浜у搧淇℃伅寮傚父", e);
+            log.error("瀵煎嚭{}寮傚父",sheetName,e);
         }
     }
 }
\ No newline at end of file
diff --git a/pms-parent/pms-global/src/main/resources/mapper/PrScheduleMapper.xml b/pms-parent/pms-global/src/main/resources/mapper/PrScheduleMapper.xml
index a225d6d..745d8ee 100644
--- a/pms-parent/pms-global/src/main/resources/mapper/PrScheduleMapper.xml
+++ b/pms-parent/pms-global/src/main/resources/mapper/PrScheduleMapper.xml
@@ -136,5 +136,6 @@
     <if test="scheduleDate != null">
       and schedule_date = #{scheduleDate}
     </if>
+    order by schedule_date desc
   </select>
 </mapper>
\ No newline at end of file
diff --git a/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/CustomCellWriteHandler.java b/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/CustomCellWriteHandler.java
new file mode 100644
index 0000000..dbed23c
--- /dev/null
+++ b/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/CustomCellWriteHandler.java
@@ -0,0 +1,82 @@
+package com.dy.pmsProduct.schedule;
+
+import com.alibaba.excel.util.BooleanUtils;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 鑷畾涔夋嫤鎴櫒銆�
+ * 鏍规嵁鎺掔彮,璁剧疆妯法鍑犺
+ */
+@Slf4j
+@Component
+public class CustomCellWriteHandler implements CellWriteHandler {
+
+    // 璁剧疆鍚堝苟鐩稿悓鍚嶇О鐨勫崟鍏冨垪
+    private int[] mergeColumnIndex = {1,2,3};
+    // 浠庡摢琛屽紑濮嬪悎骞�
+    private int mergeRowIndex = 3;
+
+    @Override
+    public void afterCellDispose(CellWriteHandlerContext context) {
+        Cell cell = context.getCell();
+        //褰撳墠琛�
+        int curRowIndex = cell.getRowIndex();
+        //褰撳墠鍒�
+        int curColIndex = cell.getColumnIndex();
+
+        WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
+
+        if (curRowIndex >= mergeRowIndex) {
+            for (int i = 0; i < mergeColumnIndex.length; i++) {
+                if (curColIndex == mergeColumnIndex[i]) {
+                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * 褰撳墠鍗曞厓鏍煎悜涓婂悎骞�
+     *
+     * @param writeSheetHolder
+     * @param cell             褰撳墠鍗曞厓鏍�
+     * @param curRowIndex      褰撳墠琛�
+     * @param curColIndex      褰撳墠鍒�
+     */
+    private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
+        Object curId = cell.getSheet().getRow(curRowIndex).getCell(0).getStringCellValue();
+        Object preId = cell.getSheet().getRow(curRowIndex-1).getCell(0).getStringCellValue();
+
+        // 姣旇緝褰撳墠琛岀殑id鍊间笌涓婁竴琛屾槸鍚︾浉鍚岋紝鐩稿悓鍚堝苟褰撳墠鍗曞厓鏍间笌涓婁竴琛�
+        if (curId.equals(preId)) {
+            Sheet sheet = writeSheetHolder.getSheet();
+            List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
+            boolean isMerged = false;
+            for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
+                CellRangeAddress cellRangeAddr = mergeRegions.get(i);
+                // 鑻ヤ笂涓�涓崟鍏冩牸宸茬粡琚悎骞讹紝鍒欏厛绉诲嚭鍘熸湁鐨勫悎骞跺崟鍏冿紝鍐嶉噸鏂版坊鍔犲悎骞跺崟鍏�
+                if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
+                    sheet.removeMergedRegion(i);
+                    cellRangeAddr.setLastRow(curRowIndex);
+                    sheet.addMergedRegion(cellRangeAddr);
+                    isMerged = true;
+                }
+            }
+            // 鑻ヤ笂涓�涓崟鍏冩牸鏈鍚堝苟锛屽垯鏂板鍚堝苟鍗曞厓
+            if (!isMerged) {
+                CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
+                sheet.addMergedRegion(cellRangeAddress);
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ExcelVo.java b/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ExcelVo.java
index b4f23b8..aac96cc 100644
--- a/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ExcelVo.java
+++ b/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ExcelVo.java
@@ -3,21 +3,13 @@
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.*;
 import com.alibaba.excel.converters.Converter;
-import com.alibaba.excel.converters.WriteConverterContext;
 import com.alibaba.excel.enums.BooleanEnum;
-import com.alibaba.excel.enums.CellDataTypeEnum;
 import com.alibaba.excel.enums.poi.BorderStyleEnum;
 import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
 import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;
-import com.alibaba.excel.metadata.GlobalConfiguration;
-import com.alibaba.excel.metadata.data.ImageData;
-import com.alibaba.excel.metadata.data.WriteCellData;
-import com.alibaba.excel.metadata.property.ExcelContentProperty;
 import lombok.Data;
 
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 //鍙傝�冿細  https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write
 @Data
@@ -27,27 +19,28 @@
         horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER,
         borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN,
         leftBorderColor = 8, rightBorderColor = 8, topBorderColor = 8, bottomBorderColor = 8) //IndexedColors.BLACK
-@ContentRowHeight(100) //璁剧疆鍐呭楂樺害
-@ContentFontStyle(fontName="瀹嬩綋", fontHeightInPoints = 14)
+@ContentRowHeight(30) //璁剧疆鍐呭楂樺害
+@ContentFontStyle(fontName="瀹嬩綋", fontHeightInPoints = 11)
 @ContentStyle(wrapped = BooleanEnum.TRUE, shrinkToFit = BooleanEnum.TRUE,
         horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER,
         borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN,
         leftBorderColor = 8, rightBorderColor = 8, topBorderColor = 8, bottomBorderColor = 8) //IndexedColors.BLACK
 @ColumnWidth(16) //璁剧疆鍒楀
 public class ExcelVo implements Converter<byte[]> {
-    @ColumnWidth(40)
-//    @ContentLoopMerge(eachRow=2)
+    @ColumnWidth(0)//璁剧疆鍒楀涓�0,涓嶆樉绀�
+    @ExcelProperty("ID")
+    public String id ;
+
+    @ColumnWidth(15)
     @ExcelProperty("鐢ㄦ埛鍚�")
     public String userName ;
 
-    @ColumnWidth(40)
+    @ColumnWidth(20)
     @ExcelProperty("鎺掔彮鏃ユ湡")
-//    @ContentLoopMerge(eachRow=2)
     public String scheduleDate ;
 
-    @ColumnWidth(40)
+    @ColumnWidth(28)
     @ExcelProperty("鍒涘缓鏃堕棿")
-//    @ContentLoopMerge(eachRow=2)
     public Date dt ;
 
     @ColumnWidth(40)
@@ -65,30 +58,4 @@
     @ColumnWidth(40)
     @ExcelProperty({"鎺掔彮鍐呭","宸ヤ綔鍐呭"})
     public String workDetails ;
-
-    public WriteCellData<?> convertToExcelData(byte[] value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
-        WriteCellData cellData = new WriteCellData()  ;
-        if(value != null && value.length >0){
-            List<ImageData> list = new ArrayList<>();
-            ImageData imd = new ImageData();
-            imd.setImage(value);
-            imd.setImageType(ImageData.ImageType.PICTURE_TYPE_PICT);
-            imd.setLeft(10);
-            imd.setTop(10);
-            imd.setRight(10);
-            imd.setBottom(10);
-            list.add(imd) ;
-            cellData.setImageDataList(list);
-            cellData.setType(CellDataTypeEnum.EMPTY);
-        }else{
-            cellData.setStringValue("");
-            cellData.setType(CellDataTypeEnum.STRING);
-        }
-        return cellData;
-    }
-
-    public WriteCellData<?> convertToExcelData(WriteConverterContext<byte[]> context) throws Exception {
-        return this.convertToExcelData(context.getValue(), context.getContentProperty(), context.getWriteContext().currentWriteHolder().globalConfiguration());
-    }
-
 }
diff --git a/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ScheduleCtrl.java b/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ScheduleCtrl.java
index d583cb9..962f7d2 100644
--- a/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ScheduleCtrl.java
+++ b/pms-parent/pms-web-product/src/main/java/com/dy/pmsProduct/schedule/ScheduleCtrl.java
@@ -1,5 +1,6 @@
 package com.dy.pmsProduct.schedule;
 
+import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.converters.Converter;
 import com.dy.common.aop.SsoPowerAop;
 import com.dy.common.webUtil.BaseResponse;
@@ -14,6 +15,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -25,8 +27,7 @@
 @RestController
 @RequestMapping(path="schedule")
 public class ScheduleCtrl {
-    private static final String fileName = "鎺掔彮淇℃伅" ;
-    private static final String sheetName = "鎺掔彮淇℃伅" ;
+
     private ScheduleSv sv;
     @Autowired
     public void setScheduleSv(ScheduleSv scheduleSv) {
@@ -99,7 +100,8 @@
         return BaseResponseUtils.buildSuccess(list);
     }
 
-
+    private String fileName = "鎺掔彮淇℃伅" ;
+    private String sheetName = "鎺掔彮淇℃伅" ;
     @PostMapping(path="export")
     @SsoPowerAop(power = "-1")
     @Log("瀵煎嚭鎺掔彮")
@@ -107,10 +109,10 @@
         List<Converter> list = new ArrayList<>() ;
 
         List<PrSchedule> schList = sv.selectAll(queryVo);
-        // 浣跨敤骞惰娴佹彁楂樻�ц兘
-        schList.parallelStream().forEach(sch -> {
+        schList.forEach(sch -> {
             sch.relList.forEach(rel -> {
                 ExcelVo vo = new ExcelVo();
+                vo.id = sch.id.toString();
                 vo.userName = sch.userName;
                 vo.scheduleDate = sch.scheduleDate;
                 vo.dt = sch.dt;
@@ -121,6 +123,16 @@
                 list.add(vo);
             });
         });
-        QrCodeUtil.downloadExcel(response, fileName,sheetName,list);
+
+        try{
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+            EasyExcel.write(response.getOutputStream(), list.get(0).getClass()).sheet(sheetName)
+                    .registerWriteHandler(new CustomCellWriteHandler()).doWrite(list);
+        }catch (Exception e){
+            log.error("瀵煎嚭鎺掔彮淇℃伅寮傚父", e);
+        }
     }
 }

--
Gitblit v1.8.0