使用阿里 EasyExcel 讀寫 Excel 文件

首先 pom.xml 引入依賴,EasyExcel 版本更新快,不同版本 API 均有不同,有些已經廢棄。

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>2.0.0</version>
</dependency>

EasyExcel 高度封裝了 Excel 的操作,下面是讀取一個 Excel,其包含表頭,內容行:

public void importSynonyms(MultipartFile file, String type) throws Exception {
	ExcelListener<SynonymModel> listener = new ExcelListener<>();
	try {
		EasyExcelFactory.read(file.getInputStream(), SynonymModel.class, listener).sheet(0).doRead();
	} catch (Exception e) {
		logger.info(e.getMessage());
	}
	List<SynonymModel> rows = listener.getRows();
	...
    // 完成 Excel到映射類對象的反射,可以進行業務邏輯處理了
}

爲了順利解析EasyExcel 並反射成 java 對象,需要定義目標映射類,並且實現 AnalysisEventListener 接口,該接口對 Excel 每一行進行解析,並提供事件鉤子和輔助方法。下面是映射類,注意 index 必須 0-based,其值和 Excel 文件列的序號一致。

監聽接口負責解析 Excel,逐行解析並反射成映射類對象。

下面是用 EasyExcel 導出數據:

public void exportConceptMapping(int id, HttpServletResponse resp){
	List<ConceptMappingList> data = new ArrayList<>();
	// 處理 data 數據
	WriteSheet sheet = new WriteSheet();
	WriteTable table = new WriteTable();
	List<List<String>> head = new ArrayList<>();
	List<String> col = new ArrayList<>();
	col.add("列名 1");
	head.add(col);
	List<String> col2 = new ArrayList<>();
	col2.add("列名 2");
	head.add(col2);
	table.setHead(head);
	try {
		try (BufferedOutputStream ops = new BufferedOutputStream(resp.getOutputStream())) {
			resp.setContentType("application/x-xls");
			resp.addHeader("Content-Disposition", "attachment;filename=test.xlsx");
			resp.setCharacterEncoding("UTF-8");
			
			ExcelWriter writer = EasyExcelFactory.write(ops).build();
			writer.write(data, sheet, table);
			writer.finish();
		}
	} catch (IOException e) {
		e.printStackTrace();
		throw new RuntimeException("導出文件出錯:" + e.getMessage());
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章