下载功能-Excel篇

224 阅读1分钟

Excel下载

(持续更新)

Excel按模板下载

这个比较简单,可以直接参考EasyExcel的模板填充功能。

文档地址:easyexcel.opensource.alibaba.com/docs/curren…

Excel单模板生成多个sheet

本次遇到的问题是,要用一个模板生成数量未知的sheet,用easyexcel尝试了几次无果,转换思路为,将这个模板复制n份,使得每个sheet都有一个这样的模板,随后可以用easyexcel去对这些模板进行填充。

使用poi复制sheet内容代码如下,可以按需修改:

public static void copySheetNtimes(String filePath, int n) throws IOException {
    try (FileInputStream fis = new FileInputStream(filePath);
         Workbook workbook = new XSSFWorkbook(fis)) {

        // 获取第一个 Sheet
        Sheet originalSheet = workbook.getSheetAt(0);
        String originalSheetName = originalSheet.getSheetName();

        for (int i = 0; i < n; i++) {
            // 复制 Sheet 并重命名
            Sheet newSheet = workbook.createSheet(originalSheetName + "_copy" + (i + 1));
            copySheetContent(originalSheet, newSheet);
        }

        // 保存文件
        try (FileOutputStream fos = new FileOutputStream(filePath)) {
            workbook.write(fos);
        }
    }
}

private static void copySheetContent(Sheet sourceSheet, Sheet targetSheet) {
    // 复制合并单元格
    for (int i = 0; i < sourceSheet.getNumMergedRegions(); i++) {
        targetSheet.addMergedRegion(sourceSheet.getMergedRegion(i));
    }

    for (int i = 0; i <= sourceSheet.getLastRowNum(); i++) {
        Row sourceRow = sourceSheet.getRow(i);
        Row targetRow = targetSheet.createRow(i);

        if (sourceRow != null) {
            for (int j = 0; j < sourceRow.getLastCellNum(); j++) {
                Cell sourceCell = sourceRow.getCell(j);
                Cell targetCell = targetRow.createCell(j);

                if (sourceCell != null) {
                    // 复制单元格样式
                    targetCell.setCellStyle(sourceCell.getCellStyle());

                    // 复制单元格值
                    switch (sourceCell.getCellType()) {
                        case STRING:
                            targetCell.setCellValue(sourceCell.getStringCellValue());
                            break;
                        case NUMERIC:
                            targetCell.setCellValue(sourceCell.getNumericCellValue());
                            break;
                        case BOOLEAN:
                            targetCell.setCellValue(sourceCell.getBooleanCellValue());
                            break;
                        case FORMULA:
                            targetCell.setCellFormula(sourceCell.getCellFormula());
                            break;
                        default:
                            targetCell.setCellValue(sourceCell.getStringCellValue());
                            break;
                    }
                }
            }
        }
    }
}

easyexcel填充方法:

使用for循环填充,核心代码示例(填充模板等见文档内容)


ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()

FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();

for (int i = 1; i <= 3; i++) {
    // 为每个 Sheet 创建新的 ExcelWriter 并加载模板
    WriteSheet writeSheet = EasyExcel.writerSheet("Sheet" + i).build();
        // 填充数据
    excelWriter.fill(new FillWrapper("data1", data1()), fillConfig, writeSheet);
    excelWriter.fill( data2(), writeSheet);

}