一、从EasyExcel读取Excel数据
EasyExcel是一个基于Java语言的开源的Excel读写工具。它提供了简单的API来操作Excel文件,而且相比于Apache POI等其他同类工具,EasyExcel的速度更快,功能更齐全。下面我们将从从EasyExcel读取Excel数据这个方面,来详细讲解。
首先,我们需要引入EasyExcel的依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency>
接下来,我们就可以使用EasyExcel来读取Excel数据了。下面是一个简单的示例:
// 创建一个Excel读取器 ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build(); // 读取数据 excelReader.read(); // 关闭读取器 excelReader.finish();
在上面的示例中,我们使用了EasyExcel提供的ExcelReader来读取Excel文件,并且传入了Excel文件路径、数据对象的类型和数据监听器。在这里,DemoDataListener是数据监听器,它实现了EasyExcel提供的AnalysisEventListener接口,用于解析Excel数据。
二、跳过Excel表头读取数据
在实际的应用中,我们通常需要从Excel文件中获取数据,并且需要跳过表头。EasyExcel提供了skipHeadRows()方法来实现这个功能。下面是一个示例:
ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).sheet().headRowNumber(1).doRead();
在这个示例中,我们使用了sheet()方法来获取Excel表格,然后使用headRowNumber()方法指定表头所在行的索引是1,最后使用doRead()方法来读取数据,并且跳过了表头。
三、从Excel模板读取数据并写入
除了从Excel文件中读取数据,EasyExcel还可以从Excel模板中读取数据,并且将数据写入到Excel文件中。下面是一个示例:
// 定义模板对象 ExcelTemplate excelTemplate = ExcelTemplateFactory.fromClasspath("template.xlsx").defaultSheet(); // 导出数据到Excel文件 excelTemplate.writer() .put("title", "XXX公司员工信息表") .put("companyName", "XXX公司") .put("date", new Date()) .fill().finish();
在这个示例中,我们使用了ExcelTemplate来读取指定路径下的Excel模板文件,然后使用put()方法将数据写入到Excel模板中,并且使用fill()方法将数据写入到Excel文件中。
四、读取Excel内容
在读取Excel数据时,我们通常会遇到两种类型的数据:字符串和数字。EasyExcel提供了Formatter实现类,可以将读取到的字符串和数字格式化为Java对象。下面是一个示例:
@Data public class DemoData { @ExcelProperty(value = "字符串标题", index = 0) private String string; @ExcelProperty(value = "数字标题", index = 1) private Double doubleData; } public class DemoDataListener extends AnalysisEventListener<DemoData> { @Override public void invoke(DemoData demoData, AnalysisContext analysisContext) { System.out.println(demoData); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) {} } ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build(); excelReader.read(); excelReader.finish();
在这个示例中,我们定义了DemoData数据类,并且使用@ExcelProperty注解指定Excel数据的列名和列索引。然后在DemoDataListener监听器中重写invoke()方法,用来读取Excel数据并转换为Java对象。最后,在ExcelReader中读取数据并使用DemoDataListener监听器进行解析。
五、读取Excel数据为空处理
在读取Excel文件时,我们可能会遇到Excel表格中数据为空的情况,这时我们需要对空数据进行处理。EasyExcel提供了数据转换接口来实现这个功能。下面是一个示例:
public class DemoDataListner extends AnalysisEventListener { @Override public void invoke(Object obj, AnalysisContext context) { if (obj instanceof List) { List list = (List)obj; if (CollectionUtils.isEmpty(list)) { // Do something } } } }
在这个示例中,我们在DemoDataListener数据监听器中重写了invoke()方法,在读取数据之前先校验数据是否为空。如果数据为空,我们就可以在这里进行相应的处理。
六、读取复杂Excel
在实际的应用中,Excel文件中可能会存在很多复杂的情况,比如单元格合并、多行标题、嵌套表格等。EasyExcel提供了一系列的接口来支持这些复杂的情况。下面是一个示例:
@Data public class DemoData { @ExcelProperty(value = {"表头1", "子表头1", "子子表头1"}, index = 0) private String string; @ExcelProperty(value = {"表头1", "子表头1", "子子表头2"}, index = 1) private Double doubleData; @ExcelProperty(value = {"表头1", "子表头2"}, index = 2) private String string1; @ExcelProperty(value = {"表头2", "子表头"}, index = 3) private String string2; } public class DemoDataListener extends AnalysisEventListener<DemoData> { @Override public void invoke(DemoData demoData, AnalysisContext context) { System.out.println(demoData); } @Override public void doAfterAllAnalysed(AnalysisContext context) {} } ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build(); excelReader.read(); excelReader.finish();
在这个示例中,我们使用了@ExcelProperty注解指定Excel数据的列名和列索引,并且使用value属性来支持多行标题。
七、EasyExcel模板导出
在实际的应用中,我们通常需要将数据导出到Excel模板中。EasyExcel提供了一个简单的API来实现这个功能。下面是一个示例:
// 定义Excel导出器 ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateInputStream).build(); // 写入数据 excelWriter.fill(data, new FillConfig().setForceNewRow(Boolean.TRUE)); // 关闭Excel导出器 excelWriter.finish();
在这个示例中,我们使用了ExcelWriter来将数据写入到Excel模板中,并且使用fill()方法来填充数据。注意,在填充数据时,我们需要使用FillConfig实例来指定新的行必须写入数据。
八、EasyExcel导入数据库
在读取Excel数据后,我们需要将数据存储到数据库中。EasyExcel提供了简单的API来实现这个功能。下面是一个示例:
@Data public class DemoData { @ExcelProperty(value = "用户名", index = 0) private String username; @ExcelProperty(value = "密码", index = 1) private String password; } public class DemoDataListener extends AnalysisEventListener<DemoData> { @Override public void invoke(DemoData demoData, AnalysisContext context) { System.out.println(demoData); // 保存数据到数据库 User user = new User(); user.setUsername(demoData.getUsername()); user.setPassword(demoData.getPassword()); userRepository.save(user); } @Override public void doAfterAllAnalysed(AnalysisContext context) {} } ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build(); excelReader.read(); excelReader.finish();
在这个示例中,我们使用了DemoData数据类存储Excel数据,并且通过DemoDataListener数据监听器将数据保存到数据库中。