HuTool工具類使用之Excel文檔的導入導出
前言
在日常的工作開發中,Excel的導入和導出是必不可少的,如果自己寫相應的導入導出方法,會顯得十分繁瑣,本文采用Hutool工具類實作的Excel導入導出功能,可以大幅度減少今後開發中Excel的導入導出的相關操作。
提示:以下是本篇文章正文内容,下面案例可供參考
一、Hutool是什麼?
Hutool是一個小而全的Java工具類庫,通過靜态方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函數式語言般的優雅,讓Java語言也可以“甜甜的”。
Hutool中的工具方法來自于每個使用者的精雕細琢,它涵蓋了Java開發底層代碼中的方方面面,它既是大型項目開發中解決小問題的利器,也是小型項目中的效率擔當;
Hutool是項目中“util”包友好的替代,它節省了開發人員對項目中公用類和公用工具方法的封裝時間,使開發專注于業務,同時可以最大限度的避免封裝不完善帶來的bug。
二、導出Excel檔案
1.引入相關依賴
Java針對MS Office的操作的庫屈指可數,比較有名的就是Apache的POI庫。這個庫異常強大,但是使用起來也并不容易。Hutool針對POI封裝一些常用工具,使Java操作Excel等檔案變得異常簡單。Hutool-poi是針對Apache POI的封裝,是以需要使用者自行引入POI庫,Hutool預設不引入。
需要注意的是,hutool-4.x的poi-ooxml 版本需高于 3.17,hutool-5.x的poi-ooxml 版本需高于 4.1.2;本文使用的依賴資訊如下圖所示:
cn.hutool
hutool-all
5.4.3
org.apache.poi
poi-ooxml
4.1.2
2.Excel導出功能的實作
Hutool将Excel寫出封裝為ExcelWriter,原理為包裝了Workbook對象,每次調用merge(合并單元格)或者write(寫出資料)方法後隻是将資料寫入到Workbook,并不寫出檔案,隻有調用flush或者close方法後才會真正寫出檔案。由于機制原因,在寫出結束後需要關閉ExcelWriter對象,調用close方法即可關閉,此時才會釋放Workbook對象資源,否則帶有資料的Workbook一直會常駐記憶體。代碼如下所示:
@RequestMapping(EXCEL_DOWNLOAD)
public void excelExport(HttpServletResponse httpServletResponse) throws IOException {
UserDTO userDTO = new UserDTO();
List userDTOS = userService.selectUserDOBatch(userDTO);
//通過hutool工具建立的excel的writer,預設為xls格式
ExcelWriter writer = ExcelUtil.getWriter();
//設定要導出到的sheet
writer.setSheet("表2");
writer.setSheet("表3");
//自定義excel标題和列名
writer.addHeaderAlias("id","使用者ID");
writer.addHeaderAlias("userName","使用者名");
writer.addHeaderAlias("loginPassword","密碼");
writer.addHeaderAlias("email","郵箱");
writer.addHeaderAlias("createDate","資料建立日期");
//合并單元格後的标題行,使用預設标題樣式
writer.merge(4,"使用者基本資訊表");
writer.renameSheet(0,"使用者登入資訊");
//一次性寫出内容,使用預設樣式,強制輸出标題
writer.write(userDTOS,true);
httpServletResponse.setContentType("application/vnd.ms-excel;charset=utf-8");
//name是下載下傳對話框的名稱,不支援中文,想用中文名稱需要進行utf8編碼
String excelName = "使用者基本資訊表";
//excelName = new String(excelName.getBytes(),"utf-8");
excelName = URLEncoder.encode(excelName, "utf-8");
httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + excelName +".xls");
//将excel檔案資訊寫入輸出流,傳回給調用者
ServletOutputStream excelOut = null;
try {
excelOut = httpServletResponse.getOutputStream();
writer.flush(excelOut,true);
} catch (IOException e) {
e.printStackTrace();
}finally {
writer.close();
}
IoUtil.close(excelOut);
}
以上導出的Excel格式為.xls,如果想要導出格式為.xlsx的excel檔案,隻需修改上圖所示的相應位置代碼即可,修改代碼為:
//設定傳回excel的格式為xlsx
httpServletResponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
httpServletResponse.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("使用者資訊表","utf-8") + ".xlsx");
生成的excel檔案如下如所示:
二、導出Excel檔案
1.Excel讀取-ExcelReader
Excel檔案的導入分為三種情況:
1.讀取Excel中所有行和列,都用清單表示
ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");
List> readAll = reader.read();
2.讀取為Map清單,預設第一行為标題行,Map中的key為标題,value為标題對應的單元格值。
ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");
List> readAll = reader.readAll();
3.讀取為Bean清單,Bean中的字段名為标題,字段值為标題對應的單元格值。
ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");
List all = reader.readAll(Person.class);
本文Excel導入讀取示例采用的是第三種方法實作,相關代碼如下所示:
@RequestMapping(READ_EXCEL)
public void readExcel(){
ExcelReader reader = ExcelUtil.getReader("H:\\user.xlsx");
List userDTOS = reader.readAll(UserDTO.class);
//日志輸出讀取到的資訊
log.info(userDTOS.toString());
}
其中UserDTO類的代碼如下所示:
@Data
public class UserDTO {
@NotNull(message = "使用者id不能為空")
private Integer id;
@NotNull(message = "使用者名不能為空")
@Size(min = 4, max = 16, message = "使用者名長度錯誤")
private String userName;
@NotNull(message = "密碼不能為空")
@Size(min = 4, max = 16, message = "密碼長度錯誤")
private String loginPassword;
@NotNull(message = "郵箱不能為空")
@Email(message = "郵箱格式錯誤")
private String email;
@NotNull(message = "日期不能為空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
}