EasyExcel 填充+写入

使用 EasyExcel 导出 Excel 时,有时会遇到如下情况:

  • 既要根据模板填充某些 sheet
  • 又要根据业务写入某些 sheet

EasyExcel 官方没有提供这样的示例,经过自己的研究和实验,得到了如下步骤:

  1. 定义导出文件名
String fileName = "测试.xlsx";
  1. 获取模板文件
InputStream templateFile = ResourceUtil.getResourceObj("templates/template.xlsx").getStream();

此时读取的模板文件默认为压缩文件,是不能在后续进行填充的,所以需要在 pom.xml 中进行配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <!-- 配置不需要压缩的文件 -->
                <nonFilteredFileExtensions>
                    <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                    <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                </nonFilteredFileExtensions>
            </configuration>
        </plugin>
    </plugins>
</build>
  1. 定义填充页数据
@Data
public class FillData {
    private String name;
    private double number;
}
FillData fillData = new FillData();
fillData.setName("张三");
fillData.setNumber(5.2);
  1. 定义业务页数据
@Data
public class BusinessData {
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}
BusinessData businessData = new BusinessData();
businessData.setString("测试");
businessData.setDate(new Date());
businessData.setDoubleData(1.0);
List<BusinessData> businessDataList = Collections.singletonList(businessData);
  1. 定义写入器
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFile).build();
  1. 定义填充页 sheet
WriteSheet writeSheet0 = EasyExcel.writerSheet().registerWriteHandler(new CustomTemplateSheetStrategy("动态命名sheet")).build();

这里使用了 CustomTemplateSheetStrategy

之所以要使用该拦截器,是因为填充时默认是只能取模板定义的 sheet 名称作为填充页的 sheet 名称,但业务中往往是需要动态命名 sheet 的,所以使用拦截器进行拦截处理后命名。

CustomTemplateSheetStrategy代码如下:

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;

/**
 * 自定义模板导出sheet拦截器
 * 
 * @author 天航星
 * @date 2024-07-03 13:48
 */
public class CustomTemplateSheetStrategy implements SheetWriteHandler {

    private Integer sheetNo;

    private String sheetName;

    public CustomTemplateSheetStrategy(String sheetName) {
        this.sheetName = sheetName;
    }

    public CustomTemplateSheetStrategy(Integer sheetNo, String sheetName) {
        this.sheetNo = sheetNo;
        this.sheetName = sheetName;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        
    }

    /**
     * 功能:动态修改模板中sheet的名称
     * sheet创建完成后调用
     * @param writeWorkbookHolder
     * @param writeSheetHolder
     */
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        
        if (sheetName == null) {
            return;
        }
        if (sheetNo == null) {
            sheetNo = 0;
        }
        writeWorkbookHolder.getCachedWorkbook().setSheetName(sheetNo, sheetName);
    }
}

  1. 定义业务页 sheet
WriteSheet writeSheet1 = EasyExcel.writerSheet("Sheet1").head(BusinessData.class).build();
  1. 填充数据
excelWriter.fill(fillData, writeSheet0);

注意:这里一定要传入对象,不能传入列表,否则填充的内容会变为空白。

  1. 写入数据
excelWriter.write(businessDataList, writeSheet1);
  1. 关闭写入器
excelWriter.finish();

注意:这里必须要关闭写入器,不然写入的文件为空。

根据以上步骤即可以填充+写入的方式导出 Excel,以下是完整代码:

import cn.hutool.core.io.resource.ResourceUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.sevnce.pop.customer.handler.CustomTemplateSheetStrategy;
import lombok.Data;
import org.junit.jupiter.api.Test;
import java.io.InputStream;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * 测试用例
 *
 * @author 天航星
 * @date 2024-07-03 10:55
 */
public class TestDemo {

    @Data
    public class FillData {

        /**
         * 名称
         */
        private String name;

        /**
         * 数字
         */
        private double number;
    }

    @Data
    public class BusinessData {
        
        @ExcelProperty("字符串标题")
        private String string;
        
        @ExcelProperty("日期标题")
        private Date date;
        
        @ExcelProperty("数字标题")
        private Double doubleData;
        
        /**
         * 忽略这个字段
         */
        @ExcelIgnore
        private String ignore;
    }

    @Test
    public void test() {

        // 定义导出文件名
        String fileName = "测试.xlsx";
        // 获取模板文件
        InputStream templateFile = ResourceUtil.getResourceObj("templates/template.xlsx").getStream();
        // 定义填充页数据
        FillData fillData = new FillData();
        fillData.setName("张三");
        fillData.setNumber(5.2);
        // 定义业务页数据
        BusinessData businessData = new BusinessData();
        businessData.setString("测试");
        businessData.setDate(new Date());
        businessData.setDoubleData(1.0);
        List<BusinessData> businessDataList = Collections.singletonList(businessData);
        // 定义写入器
        ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFile).build();
        // 定义填充页 sheet
        WriteSheet writeSheet0 = EasyExcel.writerSheet().registerWriteHandler(new CustomTemplateSheetStrategy("动态命名sheet")).build();
        // 定义业务页 sheet
        WriteSheet writeSheet1 = EasyExcel.writerSheet("Sheet1").head(BusinessData.class).build();
        // 填充数据
        excelWriter.fill(fillData, writeSheet0);
        // 写入数据
        excelWriter.write(businessDataList, writeSheet1);
        // 关闭写入器
        excelWriter.finish();
    }
}


环境:

  • JDK:1.8.0_202
  • SpringBoot:2.7.17
  • EasyExcel:3.3.2
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于EasyExcel填充操作,您可以使用`FillPatternType`枚举来指定单元格的填充样式。以下是一个示例代码,演示如何在EasyExcel中进行填充: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.IndexedColors; public class EasyExcelFillExample { public static void main(String[] args) { String fileName = "test.xlsx"; // 创建数据集合 List<YourDataClass> data = new ArrayList<>(); // 添加数据到集合... // 单元格样式 CellStyle cellStyle = new CellStyle(); cellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); // 创建策略并设置样式 WriteCellStyle style = new WriteCellStyle(); style.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); style.setFillPatternType(FillPatternType.SOLID_FOREGROUND); HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(style); // 写入Excel文件 EasyExcel.write(fileName, YourDataClass.class) .registerWriteHandler(styleStrategy) .sheet("Sheet1") .doWrite(data); } } ``` 上述代码中,我们使用`FillPatternType.SOLID_FOREGROUND`指定了单元格的填充样式,并使用`IndexedColors.YELLOW.getIndex()`设置了填充颜色为黄色。 您可以根据自己的需求修改代码中的数据集合和样式,以实现您想要的填充效果。希望对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天航星

感谢你的鼓励和认可

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值