当前位置:   article > 正文

EasyExcel实现execl导入导出_easyexcel导入

easyexcel导入

引言

在实际开发中,处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能,以及一些相关的技巧和注意事项。

环境搭建

在开始之前,我们需要准备好 EasyExcel 的环境。首先,我们需要在项目中引入 EasyExcel 的相关依赖。在本文中,我们使用 Maven 作为依赖管理工具。在 pom.xml 文件中添加以下依赖:

  1. <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>easyexcel</artifactId>
  5. <version>2.1.1</version>
  6. </dependency>

准备 Excel 文件

在开始编写代码之前,我们需要准备一个包含数据的 Excel 文件,作为导入的示例。确保 Excel 文件的结构和数据与实体类的字段对应。

创建实体类

在使用 EasyExcel 进行导入时,我们需要创建一个与 Excel 数据结构相匹配的实体类。实体类的字段应与 Excel 文件的列对应。使用 @ExcelProperty 注解来标识字段与 Excel 列的映射关系,以及一些其他注解来设置字段的属性。举个例子如下:

 

  1. @AllArgsConstructor
  2. @NoArgsConstructor
  3. @Data
  4. public class OperationLog {
  5. // @JsonFormat(shape = JsonFormat.Shape.STRING)
  6. @ExcelProperty(value = "id", converter = StringConverter.class,index = 0)
  7. private String id; //日志id
  8. @ExcelProperty(value = "操作人",index = 1)
  9. private String userCode; //操作人
  10. @ExcelProperty(value = "操作ip",index = 2)
  11. private String ip; //操作ip
  12. @ExcelProperty(value = "操作类型",index = 3)
  13. private String type; //操作类型
  14. @ExcelProperty(value = "操作名称",index = 4)
  15. private String description; //操作名称
  16. @ExcelProperty(value = "操作模块",index = 5)
  17. private String model; //操作模块
  18. @ExcelProperty(value = "操作时间",index = 6)
  19. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  20. @ExcelIgnore
  21. private String operationTime; //操作时间
  22. @ExcelProperty(value = "操作结果",index = 7)
  23. private String result; //操作结果
  24. }

自定义转换器

有时,我们需要对 Excel 中的数据进行特殊处理或转换,以适应实体类的字段类型。EasyExcel 允许我们自定义转换器来实现这个功能。下面是一个示例

  1. import com.alibaba.excel.converters.Converter;
  2. import com.alibaba.excel.enums.CellDataTypeEnum;
  3. import com.alibaba.excel.metadata.CellData;
  4. import com.alibaba.excel.metadata.GlobalConfiguration;
  5. import com.alibaba.excel.metadata.property.ExcelContentProperty;
  6. /**
  7. * @program: family-doctor
  8. * @author: 阿水
  9. * @create: 2023-06-16 20:44
  10. **/
  11. public class StringConverter implements Converter<String> {
  12. @Override
  13. public Class<String> supportJavaTypeKey() {
  14. return String.class;
  15. }
  16. @Override
  17. public CellDataTypeEnum supportExcelTypeKey() {
  18. return CellDataTypeEnum.STRING;
  19. }
  20. @Override
  21. public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
  22. GlobalConfiguration globalConfiguration) throws Exception {
  23. return cellData.getStringValue();
  24. }
  25. @Override
  26. public CellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,
  27. GlobalConfiguration globalConfiguration) throws Exception {
  28. return new CellData<>(value);
  29. }
  30. }

编写导入逻辑

现在我们开始编写导入 Excel 的逻辑。以下是一个示例:

我通过的MongoDB的_id集合查询出来数据写入Excel,readExistingExcelData方法是先读取之前再写入,好像没法直接追加 我目前如此操作 也可以完美实现后续添加~

  1. /**
  2. * 根据ids批量导出
  3. * @param ids
  4. * @return
  5. */
  6. @Override
  7. public HttpResult<?> batchExportLogByIds(List<String> ids) {
  8. Query query = new Query(Criteria.where("_id").in(ids));
  9. List<OperationLog> resultList = mongoTemplate.find(query, OperationLog.class);
  10. // 读取已有的Excel文件内容
  11. List<OperationLog> existingList = readExistingExcelData();
  12. // 合并新数据和已有数据
  13. List<OperationLog> mergedList = new ArrayList<>(existingList);
  14. mergedList.addAll(resultList);
  15. // 设置写入文件夹地址和Excel文件名称
  16. String filename = "F:\\lps\\write.xlsx";
  17. ExcelWriter excelWriter = null;
  18. try {
  19. excelWriter = EasyExcel.write(filename, OperationLog.class)
  20. .registerConverter(new StringConverter())
  21. .build();
  22. WriteSheet writeSheet = EasyExcel.writerSheet("日志").build();
  23. excelWriter.write(mergedList, writeSheet);
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. return new HttpResult<>().fail();
  27. } finally {
  28. if (excelWriter != null) {
  29. excelWriter.finish();
  30. }
  31. }
  32. return new HttpResult<>().ok();
  33. }
  34. // 读取已有的Excel文件内容
  35. private List<OperationLog> readExistingExcelData() {
  36. String filename = "F:\\lps\\write.xlsx";
  37. List<OperationLog> existingList = new ArrayList<>();
  38. try {
  39. ExcelReader excelReader = EasyExcel.read(filename, OperationLog.class, new OperationLogDataListener(existingList)).build();
  40. ReadSheet readSheet = EasyExcel.readSheet("日志").build();
  41. excelReader.read(readSheet);
  42. excelReader.finish();
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. return existingList;
  47. }
  48. // 自定义监听器
  49. private class OperationLogDataListener extends AnalysisEventListener<OperationLog> {
  50. private List<OperationLog> dataList;
  51. public OperationLogDataListener(List<OperationLog> dataList) {
  52. this.dataList = dataList;
  53. }
  54. @Override
  55. public void invoke(OperationLog operationLog, AnalysisContext analysisContext) {
  56. dataList.add(operationLog);
  57. }
  58. @Override
  59. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  60. // 数据处理完毕后的操作(如果需要)
  61. }
  62. }

 

总结和展望

通过使用 EasyExcel,我们可以轻松实现 Excel 导入功能,并对导入的数据进行处理和转换。本文介绍了如何准备环境、创建实体类、自定义转换器以及编写导入逻辑的步骤和示例代码。希望本文对你理解和使用 EasyExcel 有所帮助。

在实际开发中,还可以进一步扩展功能,例如处理大数据量的导入、导入进度条的展示等。通过深入研究 EasyExcel 的文档和示例代码,你可以发现更多有趣和有用的功能。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/321580
推荐阅读
  

闽ICP备14008679号