SpringBoot中EasyExcel实现execl导入导出
作者:不掉头发的阿水
引言
在实际开发中,处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能,以及一些相关的技巧和注意事项。
环境搭建
在开始之前,我们需要准备好 EasyExcel 的环境。首先,我们需要在项目中引入 EasyExcel 的相关依赖。在本文中,我们使用 Maven 作为依赖管理工具。在 pom.xml
文件中添加以下依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> </dependency>
准备 Excel 文件
在开始编写代码之前,我们需要准备一个包含数据的 Excel 文件,作为导入的示例。确保 Excel 文件的结构和数据与实体类的字段对应。
创建实体类
在使用 EasyExcel 进行导入时,我们需要创建一个与 Excel 数据结构相匹配的实体类。实体类的字段应与 Excel 文件的列对应。使用 @ExcelProperty
注解来标识字段与 Excel 列的映射关系,以及一些其他注解来设置字段的属性。举个例子如下:
@AllArgsConstructor @NoArgsConstructor @Data public class OperationLog { // @JsonFormat(shape = JsonFormat.Shape.STRING) @ExcelProperty(value = "id", converter = StringConverter.class,index = 0) private String id; //日志id @ExcelProperty(value = "操作人",index = 1) private String userCode; //操作人 @ExcelProperty(value = "操作ip",index = 2) private String ip; //操作ip @ExcelProperty(value = "操作类型",index = 3) private String type; //操作类型 @ExcelProperty(value = "操作名称",index = 4) private String description; //操作名称 @ExcelProperty(value = "操作模块",index = 5) private String model; //操作模块 @ExcelProperty(value = "操作时间",index = 6) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @ExcelIgnore private String operationTime; //操作时间 @ExcelProperty(value = "操作结果",index = 7) private String result; //操作结果 }
自定义转换器
有时,我们需要对 Excel 中的数据进行特殊处理或转换,以适应实体类的字段类型。EasyExcel 允许我们自定义转换器来实现这个功能。下面是一个示例
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.property.ExcelContentProperty; /** * @program: family-doctor * @author: 阿水 * @create: 2023-06-16 20:44 **/ public class StringConverter implements Converter<String> { @Override public Class<String> supportJavaTypeKey() { return String.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } @Override public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { return cellData.getStringValue(); } @Override public CellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { return new CellData<>(value); } }
编写导入逻辑
现在我们开始编写导入 Excel 的逻辑。以下是一个示例:
我通过的MongoDB的_id集合查询出来数据写入Excel,readExistingExcelData方法是先读取之前再写入,好像没法直接追加 我目前如此操作 也可以完美实现后续添加~
/** * 根据ids批量导出 * @param ids * @return */ @Override public HttpResult<?> batchExportLogByIds(List<String> ids) { Query query = new Query(Criteria.where("_id").in(ids)); List<OperationLog> resultList = mongoTemplate.find(query, OperationLog.class); // 读取已有的Excel文件内容 List<OperationLog> existingList = readExistingExcelData(); // 合并新数据和已有数据 List<OperationLog> mergedList = new ArrayList<>(existingList); mergedList.addAll(resultList); // 设置写入文件夹地址和Excel文件名称 String filename = "F:\\lps\\write.xlsx"; ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(filename, OperationLog.class) .registerConverter(new StringConverter()) .build(); WriteSheet writeSheet = EasyExcel.writerSheet("日志").build(); excelWriter.write(mergedList, writeSheet); } catch (Exception e) { e.printStackTrace(); return new HttpResult<>().fail(); } finally { if (excelWriter != null) { excelWriter.finish(); } } return new HttpResult<>().ok(); } // 读取已有的Excel文件内容 private List<OperationLog> readExistingExcelData() { String filename = "F:\\lps\\write.xlsx"; List<OperationLog> existingList = new ArrayList<>(); try { ExcelReader excelReader = EasyExcel.read(filename, OperationLog.class, new OperationLogDataListener(existingList)).build(); ReadSheet readSheet = EasyExcel.readSheet("日志").build(); excelReader.read(readSheet); excelReader.finish(); } catch (Exception e) { e.printStackTrace(); } return existingList; } // 自定义监听器 private class OperationLogDataListener extends AnalysisEventListener<OperationLog> { private List<OperationLog> dataList; public OperationLogDataListener(List<OperationLog> dataList) { this.dataList = dataList; } @Override public void invoke(OperationLog operationLog, AnalysisContext analysisContext) { dataList.add(operationLog); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 数据处理完毕后的操作(如果需要) } }
总结和展望
通过使用 EasyExcel,我们可以轻松实现 Excel 导入功能,并对导入的数据进行处理和转换。本文介绍了如何准备环境、创建实体类、自定义转换器以及编写导入逻辑的步骤和示例代码。
在实际开发中,还可以进一步扩展功能,例如处理大数据量的导入、导入进度条的展示等。通过深入研究 EasyExcel 的文档和示例代码,你可以发现更多有趣和有用的功能。
到此这篇关于SpringBoot中EasyExcel实现execl导入导出的文章就介绍到这了,更多相关SpringBoot execl导入导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!