首先 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());
}
}