使用 EasyExcel 读取Excel(两种方式)
引入 jar 包
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beta5</version> </dependency>
EasyExcel支持对实体类中的属性进行注解,方便后续进行读写操作。
id 为 表头,index 代表的是 第0行
@ExcelProperty(value="id",index=0)
新建一个 ExcelModel 实体(需要继承 BaseRowModel)
package com.zh.oukele.model; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.metadata.BaseRowModel; /** * 表格实体 */ public class ExcelMode extends BaseRowModel { /** * 第一列的数据 */ @ExcelProperty(index = 0) private String column1; /** * 第二列的数据 */ @ExcelProperty(index = 1) private String column2; public void setColumn1(String column1) { this.column1 = column1; } public String getColumn1() { return column1; } public String getColumn2() { return column2; } public void setColumn2(String column2) { this.column2 = column2; } @Override public String toString() { return "ExcelMode{" + "column1='" + column1 + '\'' + ", column2='" + column2 + '\'' + '}'; } }
同步读取 ( 数据量大的时候,不推荐使用,内存消耗比较大 )
// 简单读取 (同步读取) public static void simpleRead() { // 读取 excel 表格的路径 String readPath = "C:\\Users\\oukele\\Desktop\\模拟数据.xlsx"; try { // sheetNo --> 读取哪一个 表单 // headLineMun --> 从哪一行开始读取( 不包括定义的这一行,比如 headLineMun为2 ,那么取出来的数据是从 第三行的数据开始读取 ) // clazz --> 将读取的数据,转化成对应的实体,需要 extends BaseRowModel Sheet sheet = new Sheet(1, 1, ExcelMode.class); // 这里 取出来的是 ExcelModel实体 的集合 List<Object> readList = EasyExcelFactory.read(new FileInputStream(readPath), sheet); // 存 ExcelMode 实体的 集合 List<ExcelMode> list = new ArrayList<ExcelMode>(); for (Object obj : readList) { list.add((ExcelMode) obj); } // 取出数据 StringBuilder str = new StringBuilder(); str.append("{"); String link = ""; for (ExcelMode mode : list) { str.append(link).append("\""+mode.getColumn1()+"\":").append("\""+mode.getColumn2()+"\""); link= ","; } str.append("};"); System.out.println(str); } catch (FileNotFoundException e) { e.printStackTrace(); } }
异步读取
新建一个 ExcelModelListener 监听类出来,并且 继承 AnalysisEventListener 类
package com.zh.oukele.listener; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.zh.oukele.model.ExcelMode; import java.util.ArrayList; import java.util.List; /*** * 监听器 */ public class ExcelModelListener extends AnalysisEventListener<ExcelMode> { /** * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 5; List<ExcelMode> list = new ArrayList<ExcelMode>(); private static int count = 1; @Override public void invoke(ExcelMode data, AnalysisContext context) { System.out.println("解析到一条数据:{ "+ data.toString() +" }"); list.add(data); count ++; if (list.size() >= BATCH_COUNT) { saveData( count ); list.clear(); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { saveData( count ); System.out.println("所有数据解析完成!"); System.out.println(" count :" + count); } /** * 加上存储数据库 */ private void saveData(int count) { System.out.println("{ "+ count +" }条数据,开始存储数据库!" + list.size()); System.out.println("存储数据库成功!"); } }
进行读取
// 异步读取 public static void simpleRead1(){ // 读取 excel 表格的路径 String readPath = "C:\\Users\\oukele\\Desktop\\模拟数据.xlsx"; try { Sheet sheet = new Sheet(1,1,ExcelMode.class); EasyExcelFactory.readBySax(new FileInputStream(readPath),sheet,new ExcelModelListener()); } catch (FileNotFoundException e) { e.printStackTrace(); } }
读取出来的日期 是 double 类型,转换一下
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date date = HSSFDateUtil.getJavaDate(Double.parseDouble(mode.getColumn2())); String time = sdf.format(date); System.out.println(time);
详细案例学习地址: https://github.com/alibaba/easyexcel/blob/master/quickstart.md