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