Java easyexcel填充Excel(包含公式)

依赖

<!-- easyexcel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>
<!-- poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

Excel模板

第一个sheet页

第二个sheet页

监听器

@Slf4j
public class EasyExcelCellWriteHandler implements CellWriteHandler {

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                 Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
                                Head head, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                 List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

        //sheet页码
        Integer sheetNo = writeSheetHolder.getSheetNo();
        //第一页
        if (sheetNo == 0) {
            if (cell.getColumnIndex() == 7) {
                int actualCellRowNum = cell.getRowIndex() + 1;
                cell.setCellFormula("IF(G" + actualCellRowNum + "=\"\",\"\",IF(TEXT(F" + actualCellRowNum + "-E" + actualCellRowNum + ",\"[s]\")=\"0\", \"上传时间<1s\",G" + actualCellRowNum + "/TEXT(F" + actualCellRowNum + "-E" + actualCellRowNum + ",\"[s]\")))");
            }
        }
        //第二页
        if (sheetNo == 1) {
            //行
            int rowNum = cell.getRowIndex() + 1;
            //列
            int columnNum = cell.getColumnIndex();
            if (columnNum == 2) {
                cell.setCellFormula("IF(COUNTIFS(上传记录!B:B,\"*\"&\"Changchun\",上传记录!I:I,统计数据!A" + rowNum + ",上传记录!K:K,统计数据!B" + rowNum + ")=0,\"\",COUNTIFS(上传记录!B:B,\"*\"&\"Changchun\",上传记录!I:I,统计数据!A" + rowNum + ",上传记录!K:K,统计数据!B" + rowNum + "))");
            } else if (columnNum == 3) {
                cell.setCellFormula("SUMIFS(上传记录!G:G,上传记录!B:B,\"*\"&\"Changchun\",上传记录!I:I,统计数据!A" + rowNum + ",上传记录!K:K,统计数据!B" + rowNum + ")/1000000");
            } else if (columnNum == 4) {
                cell.setCellFormula("IF(COUNTIFS(上传记录!B:B,\"*\"&\"PG\",上传记录!I:I,统计数据!A" + rowNum + ",上传记录!K:K,统计数据!B" + rowNum + ")=0,\"\",COUNTIFS(上传记录!B:B,\"*\"&\"PG\",上传记录!I:I,统计数据!A" + rowNum + ",上传记录!K:K,统计数据!B" + rowNum + "))");
            } else if (columnNum == 5) {
                cell.setCellFormula("SUMIFS(上传记录!G:G,上传记录!B:B,\"*\"&\"PG\",上传记录!I:I,统计数据!A" + rowNum + ",上传记录!K:K,统计数据!B" + rowNum + ")/1000000");
            } else if (columnNum == 6) {
                cell.setCellFormula("IF(AND(C" + rowNum + "=\"\",E" + rowNum + "=\"\"),\"\",IF(C" + rowNum + "=\"\",0,C" + rowNum + ") + IF(E" + rowNum + " =\"\",0,E" + rowNum + "))");
            } else if (columnNum == 7) {
                cell.setCellFormula("D" + rowNum + "+F" + rowNum);
            } else if (columnNum == 11) {
                cell.setCellFormula("IF(COUNTIFS(上传记录!B:B,\"*\"&\"Changchun\",上传记录!I:I,统计数据!J" + rowNum + ",上传记录!J:J,统计数据!K" + rowNum + ")=0,\"\",COUNTIFS(上传记录!B:B,\"*\"&\"Changchun\",上传记录!I:I,统计数据!J" + rowNum + ",上传记录!J:J,统计数据!K" + rowNum + "))");
            } else if (columnNum == 12) {
                cell.setCellFormula("SUMIFS(上传记录!G:G,上传记录!B:B,\"*\"&\"Changchun\",上传记录!I:I,统计数据!J" + rowNum + ",上传记录!J:J,统计数据!K" + rowNum + ")/1000000");
            } else if (columnNum == 13) {
                cell.setCellFormula("IF(COUNTIFS(上传记录!B:B,\"*\"&\"PG\",上传记录!I:I,统计数据!J" + rowNum + ",上传记录!J:J,统计数据!K" + rowNum + ")=0,\"\",COUNTIFS(上传记录!B:B,\"*\"&\"PG\",上传记录!I:I,统计数据!J" + rowNum + ",上传记录!J:J,统计数据!K" + rowNum + "))");
            } else if (columnNum == 14) {
                cell.setCellFormula("SUMIFS(上传记录!G:G,上传记录!B:B,\"*\"&\"PG\",上传记录!I:I,统计数据!J" + rowNum + ",上传记录!J:J,统计数据!K" + rowNum + ")/1000000");
            } else if (columnNum == 15) {
                cell.setCellFormula("IF(AND(L" + rowNum + "=\"\",N" + rowNum + "=\"\"),\"\",IF(L" + rowNum + "=\"\",0,L" + rowNum + ")+IF(N" + rowNum + "=\"\",0,N" + rowNum + "))");
            } else if (columnNum == 16) {
                cell.setCellFormula("M" + rowNum + "+O" + rowNum);
            }

        }
    }
}

实现

public void fillInData() {

        // 输入模板路径
        String templatePath = "E:/upload_record.xlsx";
        // 结果输出路径
        String outputPath = "E:/数据上传统计HochladenStatistiks.xlsx";

        //第一个sheet页所用数据
        List<UploadRecordVo> recordList = getUploadRecordExcelData();

        //第二个sheet页左侧所用数据
        List<WeekDataStatisticsVo> yearWeekList = selectYearAndWeek();
        //第二个sheet页右侧所用数据
        List<MonthDataStatisticsVo> yearMonthList = selectYearAndMonth();

        //数据写出
        ExcelWriter writer = EasyExcel.write(new File(outputPath)).withTemplate(new File(templatePath)).build();
        //操作第一个sheet(记得注册自定义的CellWriteHandler)
        WriteSheet sheet1 = EasyExcel.writerSheet(0).registerWriteHandler(new EasyExcelCellWriteHandler()).build();

        //操作第二个sheet
        WriteSheet sheet2 = EasyExcel.writerSheet(1).registerWriteHandler(new EasyExcelCellWriteHandler()).build();


        // 填充第一个sheet页列表数据
        writer.fill(recordList, FillConfig.builder().forceNewRow(Boolean.TRUE).build(), sheet1);

        // 填充第二个sheet页左侧列表数据
        writer.fill(yearWeekList, FillConfig.builder().forceNewRow(Boolean.TRUE).build(), sheet2);

        // 填充第二个sheet页右侧列表数据
        writer.fill(yearMonthList, FillConfig.builder().forceNewRow(Boolean.TRUE).build(), sheet2);

        //设置强制计算公式:不然公式会以字符串的形式显示在excel中
        Workbook workbook = writer.writeContext().writeWorkbookHolder().getWorkbook();
        workbook.setForceFormulaRecalculation(true);

        writer.close();
    }

结果

第一个sheet页

第二个sheet页

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: EasyExcel是一个Java库,用于读取和写入Excel文件。它提供了简单高效的API,使开发人员可以快速地填充Excel。 使用EasyExcel,您可以使用以下代码来写入数据到Excel: ``` String fileName = "test.xlsx"; // 定义表格头 List<List<String>> head = new ArrayList<List<String>>(); List<String> headCoulumn1 = new ArrayList<String>(); headCoulumn1.add("编号"); List<String> headCoulumn2 = new ArrayList<String>(); headCoulumn2.add("姓名"); List<String> headCoulumn3 = new ArrayList<String>(); headCoulumn3.add("年龄"); head.add(headCoulumn1); head.add(headCoulumn2); head.add(headCoulumn3); // 定义数据 List<List<Object>> data = new ArrayList<List<Object>>(); for (int i = 0; i < 100; i++) { List<Object> dataRow = new ArrayList<Object>(); dataRow.add(i); dataRow.add("张三" + i); dataRow.add(20 + i); data.add(dataRow); } // 写入到Excel EasyExcel.write(fileName, data).head(head).sheet().doWrite(); ``` 您也可以使用EasyExcel读取Excel中的数据: ``` String fileName = "test.xlsx"; // 读取数据 EasyExcel.read(fileName, new Sheet(1, 3)).doReadSync(); ``` 希望以上信息能帮助您。 ### 回答2: EasyExcel是一款基于Java的开源库,可以用来快速、高效地填充Excel文件。使用EasyExcel填充Excel文件非常简便,以下是使用EasyExcel填充Excel文件的步骤: 1. 引入EasyExcel依赖:首先,在项目的pom.xml文件中添加EasyExcel的依赖项。可以在Maven仓库中找到EasyExcel的最新版本,添加对应的依赖。 2. 创建Excel模板:根据自己的需求,创建一个Excel模板文件。可以随意设置表头、单元格样式等。 3. 创建数据源:准备需要填充Excel文件中的数据源,可以是Java对象、Map、List等。对数据源进行处理,使其符合Excel模板的要求。 4. 使用EasyExcel填充数据:使用EasyExcel提供的相关API,将数据源中的数据填充Excel模板中。具体填充的方式可以根据需求选择,可以通过Java对象的方式填充,也可以通过注解的方式进行填充。 5. 保存Excel文件:填充完成后,使用EasyExcel提供的API,将填充好的数据保存为Excel文件。可以指定保存的路径和文件名。 使用EasyExcel填充Excel文件的好处是,它可以帮助我们快速实现Excel文件的导出功能,减少了手动操作的时间和成本。同时,EasyExcel还支持导出大量数据的功能,填充速度快,占用内存少,可以有效提高程序的性能。 总之,EasyExcel是一款简单易用的Excel填充工具,通过几个简单的步骤就能实现Excel文件的填充和导出功能。无论是对于开发人员还是普通用户,都是一个很好用的工具。 ### 回答3: EasyExcel是一款Java开发的简化Excel操作的工具,可以通过代码快速填充Excel表格。 使用EasyExcel填充Excel非常简单,首先需要引入EasyExcel的依赖包。在项目中添加如下pom.xml配置即可: ```xml <!-- EasyExcel依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.0.0-beta2</version> </dependency> ``` 然后,通过编写Java代码来实现填充Excel。下面是一个示例代码: ```java public class ExcelFillExample { public static void main(String[] args) { // 创建Excel写入器 ExcelWriter writer = EasyExcel.write("output.xlsx").build(); // 定义表头 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("姓名", "年龄", "性别")); // 定义数据 List<List<Object>> data = new ArrayList<>(); data.add(Arrays.asList("张三", 20, "男")); data.add(Arrays.asList("李四", 25, "女")); data.add(Arrays.asList("王五", 30, "男")); // 写入数据 Sheet sheet = new Sheet(1, 0); sheet.setHead(head); sheet.setAutoWidth(true); writer.write1(data, sheet); // 关闭Excel写入器 writer.finish(); } } ``` 上述代码中,我们首先创建了一个Excel写入器,并指定输出的文件名为"output.xlsx"。然后,定义了表头和数据。接着,创建了一个Sheet对象,并设置了表头和自动列宽。最后,通过调用`write1()`方法将数据写入Excel。 以上就是使用EasyExcel填充Excel的简单示例。需要注意的是,EasyExcel还支持更多的功能,如读取、合并单元格、样式设置等,开发者可以根据自己的需求进行调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值