引入 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