如何利用EasyExcel导出带有选择校验框的excel?

1.什么是Easy Excel

EasyExcel是一个轻量级的Excel处理工具,支持Excel 2003(xls)和Excel 2007及以上版本(xlsx)的文件格式。它的主要特点包括:

  1. 高性能:通过SAX模式 解析Excel文件,避免将整个文件加载到内存中,适合处理大文件。

  2. 简单易用:提供了简洁的API,易于集成和使用。

  3. 功能丰富:支持自定义格式、样式、公式等多种功能。

2.EasyExcel的原理

EasyExcel的核心原理是利用Apache POI的SAX模式进行解析。传统的DOM模式会将整个Excel文件加载到内存中,这在处理大文件时会导致内存溢出。而SAX模式则是事件驱动的,只在需要时加载数据,极大地降低了内存使用。

在写入方面,EasyExcel通过分批次写入的方式,避免了一次性将所有数据加载到内存中,从而提高了写入效率。

3.环境准备

在使用 EasyExcel 之前,需要确保项目中已经引入了相关的依赖。可以通过 Maven 或 Gradle 添加 EasyExcel 的依赖。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>springboot-demo</artifactId>        <groupId>com.et</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>
    <artifactId>easyexcel</artifactId>
    <properties>        <maven.compiler.source>8</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>
        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-autoconfigure</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>easyexcel</artifactId>            <version>3.3.4</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <scope>test</scope>        </dependency>    </dependencies></project>

4.基本用法

1. 数据准备

在进行  Excel 操作之前,需要准备好数据。以下代码展示了如何初始化一个包含 10 条 DemoData 数据的列表:

List<DemoData> list = ListUtils.newArrayList();for (int i = 0; i < 10; i++) {    DemoData data = new DemoData();    data.setString("字符串" + i);    data.setDate(new Date());    data.setDoubleData(0.56);    list.add(data);}

2. 写入 Excel

EasyExcel 提供了简单的  API 来将数据写入 Excel 文件。以下是一个基本的写操作示例:

String fileName = "demo.xlsx";EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);

3. 高级特性

3.1 超链接、备注、公式和样式

EasyExcel 支持在单元格中添加超链接、备注、公式以及设置样式。以下代码展示了如何实现这些功能:

WriteCellDemoData writeCellDemoData = new WriteCellDemoData();
// 设置超链接WriteCellData<String> hyperlink = new WriteCellData<>("官方网站");HyperlinkData hyperlinkData = new HyperlinkData();hyperlink.setHyperlinkData(hyperlinkData);hyperlinkData.setAddress("https://github.com/alibaba/easyexcel");hyperlinkData.setHyperlinkType(HyperlinkData.HyperlinkType.URL);
// 设置备注WriteCellData<String> comment = new WriteCellData<>("备注的单元格信息");CommentData commentData = new CommentData();comment.setCommentData(commentData);commentData.setAuthor("Jiaju Zhuang");commentData.setRichTextStringData(new RichTextStringData("这是一个备注"));
// 设置公式WriteCellData<String> formula = new WriteCellData<>();FormulaData formulaData = new FormulaData();formula.setFormulaData(formulaData);formulaData.setFormulaValue("REPLACE(123456789,1,1,2)");
// 设置单元格样式WriteCellData<String> writeCellStyle = new WriteCellData<>("单元格样式");WriteCellStyle writeCellStyleData = new WriteCellStyle();writeCellStyleData.setFillPatternType(FillPatternType.SOLID_FOREGROUND);writeCellStyleData.setFillForegroundColor(IndexedColors.GREEN.getIndex());writeCellStyle.setWriteCellStyle(writeCellStyleData);
3.2 自定义拦截器

Easy Excel 允许用户自定义拦截器,以实现更复杂的功能。例如,可以为单元格添加下拉框:

EasyExcel.write(fileName, DemoData.class)    .registerWriteHandler(new CustomSheetWriteHandler(list.size()))    .registerWriteHandler(new CustomCellWriteHandler())    .sheet("模板").doWrite(list);
3.3 插入批注

在 Excel 中插入批注也是 EasyExcel 的一大特性。以下代码展示了如何实现这一功能:

EasyExcel.write(fileName, DemoData.class)    .inMemory(Boolean.TRUE)    .registerWriteHandler(new CommentWriteHandler())    .sheet("模板").doWrite(list);

以上只是一些关键代码,所有代码请参见下面代码仓 库

代码仓库

  • https://github.com/Harries/springboot-demo(easypost)

总结

EasyExcel 是一个功能强大且易于使用的 Excel 处理库,适合各种场景下的 Excel 文件读写操作。通过本文的介绍,相信您已经对 EasyExcel 的基本用法和一些高级特性有了初步的了解。希望这些示例代码能帮助您在实际项目中更好地应用 EasyExcel。

### 使用 EasyExcel 实现带标注错误的 Excel 文件导出 为了实现带有标记错误的 Excel 文件导出,可以利用 EasyExcel 提供的强大功能来进行单元格样式的定制化处理。具体来说,可以通过编程式设置单元格样式来高亮显示错误信息。 #### 添加 Maven 依赖 首先,在 `pom.xml` 中添加 EasyExcel 的依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency> ``` #### 创建实体类 创建一个用于映射 Excel 表头字段的对象模型,并加入必要的注解以便于解析和写入操作。 ```java import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @Data public class DataModel { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; } ``` #### 自定义监听器逻辑验证数据合法性 编写一个继承自 `AnalysisEventListener<T>` 类的数据处理器,重载其中的方法完成业务校验工作。 ```java import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListeners; import com.alibaba.excel.exception.ExcelDataConvertException; import java.util.ArrayList; import java.util.List; public class VerifyListener extends AnalysisEventListeners<DataModel> { private final List<Object> list = new ArrayList<>(); public void invoke(DataModel data, AnalysisContext context){ if (data.getAge() == null || data.getName().isEmpty()){ // 记录异常对象 list.add(data); } } public void doAfterAllAnalysed(AnalysisContext context){} } ``` #### 导出含有错误提示的功能实现 最后一步则是调用 API 完成最终的结果集输出至目标路径下的文件内保存下来。这里需要注意的是对于存在不符合条件的情况要给予特别对待——即改变对应位置处的颜色属性达到视觉上的区分效果。 ```java import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.IndexedColors; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.handler.AbstractCellWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.util.Date; import java.util.List; // 设置红色填充背景色作为错误标识 class RedFillStyleHandler extends AbstractCellWriteHandler{ @Override protected void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellRangeAddress> cellList, Cell cell) { // 获取当前行号减去表头高度得到实际索引值 int rowIndex = cell.getRowIndex()-1; Object valueAtCurrentRow = ((VerifyListener)applicationContext.getBean("verifyListener")).list.stream() .filter(item -> item instanceof DataModel) .map(DataModel.class::cast) .anyMatch(model->model.equals(((DataModel)((Object[])cellList.toArray())[rowIndex]))); if(valueAtCurrentRow){ // 如果该条目存在于已知问题列表,则应用特殊格式 CellStyle style=writeSheetHolder.getSheet().getWorkbook().createCellStyle(); Font font=writeSheetHolder.getSheet().getWorkbook().createFont(); style.setFillForegroundColor(IndexedColors.RED.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); cell.setCellStyle(style); } } } void exportWithErrorMarking(HttpServletResponse response)throws IOException{ try(StringWriter sw=new StringWriter(); PrintWriter pw=new PrintWriter(sw)){ // 准备响应头部信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 下载后的文件名编码防止乱码 String fileName="export_with_error_mark"+new Date()+".xlsx"; response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); // 执行导出动作 EasyExcel.write(response.getOutputStream(), DataModel.class).registerWriteHandler(new RedFillStyleHandler()) .sheet("Sheet1").doWrite(getErrorData()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值