From 4fabfe4dbd2eb28d07a4350597d314958cc1c281 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期四, 09 十月 2025 11:16:43 +0800
Subject: [PATCH] 优化

---
 server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java |  258 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 255 insertions(+), 3 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
index fc2bad2..c6090e0 100644
--- a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
+++ b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
@@ -1,10 +1,13 @@
 package com.doumee.core.annotation.excel;
 
+import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
+import com.doumee.dao.business.model.Goodsorder;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.springframework.core.annotation.AnnotationConfigurationException;
 
@@ -21,7 +24,7 @@
 /**
  * Excel瀵煎嚭瀹炵幇
  * @author Eva.Caesar Liu
- * @date 2022/03/15 09:54
+ * @date 2023/02/14 11:14
  */
 @Data
 public class ExcelExporter<T> {
@@ -40,6 +43,75 @@
         ExcelExporter<T> excelExporter = new ExcelExporter<>();
         excelExporter.setModelClass(modelClass);
         return excelExporter;
+    }
+    /**
+     * 瀵煎嚭鍒版寚瀹氳緭鍑烘祦
+     * @param data 鏁版嵁
+     * @param sheetName Sheet鍚嶇О
+     */
+    public void exportWithFirstAndEnd (List<T> data, String sheetName,String first,String end, OutputStream os) {
+        SXSSFWorkbook sxssfWorkbook;
+        try {
+            sxssfWorkbook = new SXSSFWorkbook();
+            Sheet sheet = sxssfWorkbook.createSheet(sheetName);
+            // 鍒涘缓鍒楀ご
+            sheet.createFreezePane(0, 2);
+            sheet.addMergedRegion(new CellRangeAddress(0   ,0,0,this.getColumns().size()-1));
+            Row title = sheet.createRow(0);
+            title.setHeight((short) 1000);
+            Cell c = title.createCell(0);
+            c.setCellValue(first);
+            configFirstCell(sxssfWorkbook,c);
+
+            Row header = sheet.createRow(1);
+            List<ColumnInfo> columns = this.getColumns();
+            for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
+                ColumnInfo column = columns.get(columnIndex);
+                Cell cell = header.createCell(columnIndex);
+                cell.setCellValue(column.columnConfig.name());
+                // 鍒楀璁剧疆
+                if (column.columnConfig.width() == -1) {
+                    sheet.setColumnWidth(columnIndex, column.columnConfig.name().length() * 2 * 256);
+                } else {
+                    sheet.setColumnWidth(columnIndex, column.columnConfig.width() * 2 * 256);
+                }
+                // 璁剧疆鍒楀ご鍗曞厓鏍�
+                configHeaderCell(sxssfWorkbook, cell, column.columnConfig);
+            }
+            // 鍒涘缓鏁版嵁璁板綍
+            for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) {
+                Row row = sheet.createRow(rowIndex + 2);
+                for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
+                    ColumnInfo column = columns.get(columnIndex);
+                    Cell cell = row.createCell(columnIndex);
+                    cell.setCellValue(getCellData(column, data.get(rowIndex)));
+
+                    // 璁剧疆鏁版嵁鍗曞厓鏍�
+                    configDataCell(sxssfWorkbook, cell, column.columnConfig);
+
+                }
+            }
+
+
+            sheet.addMergedRegion(new CellRangeAddress(data.size()+2   ,data.size()+2,0,this.getColumns().size()-1));
+            Row endRow = sheet.createRow(data.size()+2);
+//            endRow.setHeight((short) 600);
+            Cell c1 = endRow.createCell(0);
+            c1.setCellValue(end);
+            configEndCell(sxssfWorkbook,c1);
+            sxssfWorkbook.write(os);
+            os.close();
+        } catch (Exception e) {
+            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
     }
 
     /**
@@ -77,10 +149,95 @@
                     ColumnInfo column = columns.get(columnIndex);
                     Cell cell = row.createCell(columnIndex);
                     cell.setCellValue(getCellData(column, data.get(rowIndex)));
+
                     // 璁剧疆鏁版嵁鍗曞厓鏍�
                     configDataCell(sxssfWorkbook, cell, column.columnConfig);
+
                 }
             }
+            sxssfWorkbook.write(os);
+            os.close();
+        } catch (Exception e) {
+            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+//    public void exportList (List<List<String>> data, String fileName, String sheetName, HttpServletResponse response) {
+//        try {
+//            String encodeFileName = URLEncoder.encode(fileName, Charset.forName("UTF-8").toString()) + ".xlsx";
+//            response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
+//            response.setContentType("application/octet-stream");
+//            response.setHeader("eva-opera-type", "download");
+//            response.setHeader("eva-download-filename", encodeFileName);
+//            this.exportList(data, sheetName, response.getOutputStream());
+//        } catch (IOException e) {
+//            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
+//        }
+//    }
+
+
+    /**
+     * 瀵煎嚭鍒版寚瀹氳緭鍑烘祦
+     * @param os 杈撳嚭娴�
+     */
+    public static void exportList (List<List<String>> dataList ,String sheetName, OutputStream os) {
+        SXSSFWorkbook sxssfWorkbook;
+        try {
+            sxssfWorkbook = new SXSSFWorkbook();
+            Sheet sheet = sxssfWorkbook.createSheet(sheetName);
+            // 鍒涘缓鍒楀ご
+            sheet.createFreezePane(0, 1);
+            Row header = sheet.createRow(0);
+            CellStyle hstyle = configHeaderCellStatic(sxssfWorkbook);
+            for (int i = 0; i < dataList.size(); i++) {
+                Cell cell = header.createCell(i);
+                cell.setCellValue(dataList.get(i).get(Constants.ZERO));
+                // 鍒楀璁剧疆
+                sheet.setColumnWidth(i, dataList.get(i).get(Constants.ZERO).length() * 2 * 256);
+                // 璁剧疆鍒楀ご鍗曞厓鏍�
+                cell.setCellStyle(hstyle);
+            }
+
+            //鎬昏鏁�
+            Integer rowSize = dataList.get(Constants.ZERO).size();
+            //鎬诲垪鏁�
+            Integer columnSize = dataList.size();
+            for (int i = 1; i < rowSize; i++) {
+                Row row = sheet.createRow(i);
+                for (int j = 0; j < columnSize; j++) {
+                    Cell cell = row.createCell(j);
+                    cell.setCellValue(dataList.get(j).get(i));
+                }
+            }
+//
+//            List<String> headerList =dataList.get(0);
+//            for (int i = 0; i < headerList.size(); i++) {
+//                Cell cell = header.createCell(i);
+//                cell.setCellValue(headerList.get(i));
+//                // 鍒楀璁剧疆
+//                sheet.setColumnWidth(i, headerList.get(i).length() * 2 * 256);
+//                // 璁剧疆鍒楀ご鍗曞厓鏍�
+//                cell.setCellStyle(hstyle);
+//            }
+//            // 鍒涘缓鏁版嵁璁板綍
+//            for (int rowIndex = 1; rowIndex < dataList.size(); rowIndex++) {
+//                Row row = sheet.createRow(rowIndex );
+//                List<String> rowList = dataList.get(rowIndex);
+//                for (int i = 0; i < rowList.size(); i++) {
+//                    Cell cell = row.createCell(i);
+//                    cell.setCellValue(rowList.get(i));
+//                    // 鍒楀璁剧疆
+//                    cell.setCellStyle(cstyle);
+//                }
+//            }
             sxssfWorkbook.write(os);
             os.close();
         } catch (Exception e) {
@@ -115,6 +272,25 @@
             throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
         }
     }
+    /**
+     * 瀵煎嚭鑷冲搷搴旀祦
+     * @param data 鏁版嵁
+     * @param fileName Excel鏂囦欢鍚�
+     * @param sheetName Sheet鍚嶇О
+     * @param response HttpServletResponse瀵硅薄
+     */
+    public void exportWithFirstAndEnd (List<T> data, String fileName, String sheetName, String first,String end ,HttpServletResponse response) {
+        try {
+            String encodeFileName = URLEncoder.encode(fileName, Charset.forName("UTF-8").toString()) + ".xlsx";
+            response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
+            response.setContentType("application/octet-stream");
+            response.setHeader("eva-opera-type", "download");
+            response.setHeader("eva-download-filename", encodeFileName);
+            this.exportWithFirstAndEnd(data, sheetName,first,end, response.getOutputStream());
+        } catch (IOException e) {
+            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
+        }
+    }
 
     /**
      * 瀵煎嚭鑷冲搷搴旀祦
@@ -123,10 +299,20 @@
      * @param response HttpServletResponse瀵硅薄
      */
     public void export (List<T> data, String fileName, HttpServletResponse response) {
+
         this.export(data, fileName, DEFAULT_SHEET_NAME, response);
     }
-
     /**
+     * 瀵煎嚭鑷冲搷搴旀祦
+     * @param data 鏁版嵁
+     * @param fileName Excel鏂囦欢鍚�
+     * @param response HttpServletResponse瀵硅薄
+     */
+    public void exportWithFirstAndEnd (List<T> data, String fileName,String first,String end, HttpServletResponse response) {
+        this.exportWithFirstAndEnd(data, fileName, DEFAULT_SHEET_NAME, first,end,response);
+    }
+
+    /**O
      * 鑾峰彇鍒楅泦鍚�
      */
     private List<ColumnInfo> getColumns () {
@@ -169,6 +355,7 @@
         style.setFont(font);
         // 杈规
         configCellBorder(style);
+        style.setWrapText(true);
         cell.setCellStyle(style);
     }
 
@@ -190,11 +377,76 @@
         configCellBorder(style);
         cell.setCellStyle(style);
     }
+    private static CellStyle configHeaderCellStatic (SXSSFWorkbook workbook)  {
+        CellStyle style = workbook.createCellStyle();
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 璁剧疆鑳屾櫙
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        // 瀛椾綋
+        Font font = workbook.createFont();
+        font.setFontHeightInPoints((short) 12);
+        style.setFont(font);
+        // 璁剧疆杈规
+        configCellBorder(style);
+        return style;
+    }
+    private static CellStyle configCellStatic (SXSSFWorkbook workbook)  {
+        CellStyle style = workbook.createCellStyle();
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 璁剧疆鑳屾櫙
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        // 瀛椾綋
+        Font font = workbook.createFont();
+        font.setFontHeightInPoints((short) 12);
+        style.setFont(font);
+        // 璁剧疆杈规
+        configCellBorder(style);
+        return style;
+    }
+    /**
+     * 閰嶇疆鍒楀ご鍗曞厓鏍�
+     */
+    private void configFirstCell (SXSSFWorkbook workbook, Cell cell ) {
+        CellStyle style = workbook.createCellStyle();
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 璁剧疆鑳屾櫙
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        // 瀛椾綋
+        Font font = workbook.createFont();
+        font.setFontHeightInPoints((short)18);
+        style.setFont(font);
+        // 璁剧疆杈规
+        configCellBorder(style);
+        cell.setCellStyle(style);
+    }
+    /**
+     * 閰嶇疆鍒楀ご鍗曞厓鏍�
+     */
+    private void configEndCell (SXSSFWorkbook workbook, Cell cell ) {
+        CellStyle style = workbook.createCellStyle();
+        style.setAlignment(HorizontalAlignment.RIGHT);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 璁剧疆鑳屾櫙
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        // 瀛椾綋
+        Font font = workbook.createFont();
+        font.setFontHeightInPoints((short)14);
+        style.setFont(font);
+        // 璁剧疆杈规
+        configCellBorder(style);
+        cell.setCellStyle(style);
+    }
 
     /**
      * 閰嶇疆鍗曞厓鏍艰竟妗�
      */
-    private void configCellBorder (CellStyle style) {
+    private  static void configCellBorder (CellStyle style) {
         style.setBorderTop(BorderStyle.THIN);
         style.setBorderRight(BorderStyle.THIN);
         style.setBorderBottom(BorderStyle.THIN);

--
Gitblit v1.9.3