# export-excel-util **Repository Path**: lp9906/export-excel-util ## Basic Information - **Project Name**: export-excel-util - **Description**: java 导出Excel工具 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-12-07 - **Last Updated**: 2025-12-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, 导出excel, Spring, POI ## README # Java Spring POI 导出Excel工具类 ## 功能 1. 支持表头样式、单元格样式、行样式 2. 支持按条件向下合并单元格 3. 支持树级表头 4. 支持读取注解信息 ## 生成样例 ![alt text](/images/image.png) ![alt text](/images/image2.png) ## 简单代码 ``` java // 生成表头 List>> columns = new ExcelColumnsBuilder>() .add("名称内容", "name") .done(); // 创建数据 List> exportData = new ArrayList<>(); Map row = new HashMap<>(); row.put("name", "名称内容"); exportData.add(row); // 保存Excel文件 @Cleanup XSSFWorkbook workbook = new XSSFWorkbook(); new ExportExcelBuilder>(workbook) .addSheet("Sheet 1", columns, exportData) .save("D:\\Downloads\\test.xlsx"); // 打开文件 FileUtil.openFile("D:\\Downloads\\test.xlsx"); ``` ## 返回文件流 ``` java @Cleanup XSSFWorkbook workbook = new XSSFWorkbook(); new ExportExcelBuilder>(workbook) .addSheet("Sheet 1", columns, exportData) .download(response, "下载.xlsx"); ``` ## 设置表头样式 ``` java // 设置样式 ExcelStyleBuilder excelStyle = new ExcelStyleBuilder() .add("subHeaderStyle", Demo1::getSubHeaderStyle); // 生成表头 List>> columns = new ExcelColumnsBuilder>() .add("名称内容", "name").setHeaderStyle("subHeaderStyle") .done(); // 创建数据 List> exportData = new ArrayList<>(); Map row = new HashMap<>(); row.put("name", "名称内容"); exportData.add(row); // 保存Excel文件 @Cleanup XSSFWorkbook workbook = new XSSFWorkbook(); new ExportExcelBuilder>(workbook) .addStyle(excelStyle) .addSheet("Sheet 1", columns, exportData) .save("D:\\Downloads\\test.xlsx"); // 打开文件 FileUtil.openFile("D:\\Downloads\\test.xlsx"); ``` ``` java public static XSSFCellStyle getSubHeaderStyle(@NotNull XSSFWorkbook workbook) { XSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); XSSFFont font = workbook.createFont(); font.setColor(new XSSFColor(new java.awt.Color(190,190,190))); font.setBold(true); font.setFontHeight(20); cellStyle.setFont(font); cellStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(244,247,253))); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); return cellStyle; } ``` ## 设置单元格样式 ``` java List>> columns = new ExcelColumnsBuilder>() .add("名称内容", "name").setCellStyle("subHeaderStyle") .add("名称内容", "name").setCellStyle(row -> row.get("name").equals("名称内容") ? "subHeaderStyle" : null) .done(); ``` ## 设置行样式 ``` java new ExportExcelBuilder(workbook) .addStyle(excelStyle) .addSheet("Sheet 1", row -> row.get("name").equals("名称内容") ? "subHeaderStyle" : null, columns, exportData) .save("D:\\Downloads\\test2.xlsx"); ``` ## 合并单元格 ``` java List>> columns = new ExcelColumnsBuilder>() .add("名称内容", "name").setMerge((a, b) -> a.get("name").equals(b.get("name"))) .done(); ``` ## 树级表头 ``` java List>> columns = new ExcelColumnsBuilder>() .add("一级表头").setChildren(new ExcelColumnsBuilder>() .add("二级表头A", "name") .add("二级表头B", "name") ) .done(); ``` ## 读取注解信息 ``` java // 生成表头 List> columns = new LambdaExcelColumns() .add(StoreChannelVO::getStoreName) .add(StoreChannelVO::getTargetCount) .done(); // 创建数据 List exportData = new ArrayList<>(); // 生成Excel @Cleanup XSSFWorkbook workbook = new XSSFWorkbook(); new ExportExcelBuilder(workbook) .addSheet("Sheet 1", columns, exportData) .save("D:\\Downloads\\test2.xlsx"); // 打开文件 FileUtil.openFile("D:\\Downloads\\test2.xlsx"); ``` ``` java @Data @AllArgsConstructor public class StoreChannelVO { @ExcelColumn(value = "门店渠道", field = "storeInfo.storeName", cellStyle = "storeCellStyle") private String storeName; @ExcelColumn(value = "渠道目标", field = "storeInfo.targetCount") private Integer targetCount; private List channel; } ```