天天看點

hutool讀取和導出excel_HuTool工具類使用之Excel文檔的導入導出

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檔案如下如所示:

hutool讀取和導出excel_HuTool工具類使用之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;

}