「Java工具類」EasyExcelUtil工具類 excel匯入匯出工具類 阿里Easy

介紹語

本號主要是Java常用關鍵技術點,通用工具類的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等整合框架的技術分享;datax、kafka、flink等大資料處理框架的技術分享。文章會不斷更新,歡迎碼友關注點贊收藏轉發!

望各位碼友點選關注,衝1000粉。後面會錄製一些影片教程,圖文和影片結合,比如:圖書介紹網站系統、搶購系統、大資料中臺系統等。技術才是程式猿的最愛,碼友們衝啊

如果碼友覺得程式碼太長,可以從頭到尾快速掃射一遍,瞭解大概即可。覺得有用後再轉發收藏,以備不時之需。

正文:

excel匯入匯出工具類,今天整理出來了,看了下專案中用的居然還是1。x版本,整理時升級到easyexcel 3。0。2最新版本,沒想到之前封裝的一堆程式碼都不需要,現在這個版本太好用了。大家可以直接使用easyexcel的方法,封裝多一層是為了專案更方便使用而已。

例子1

讀測試

@Test public void readTest(){ // 讀取測試 String readFile = “D:\\Workspace\\IdeaProjects\\jtool-common\\student資訊表2。xlsx”; List data = EasyExcelUtil。read(readFile, Student。class); printList(data); } private static void printList(List<?> datas) { int i = 0; for (Object ob : datas) { System。out。println(i++ + “=>” + ob); } } // 控制檯列印 17:55:58。240 [main] INFO - 解析完成!讀取10行 0=>Student(name=張1, age=12, address=深圳0棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 1=>Student(name=張1, age=13, address=深圳1棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 2=>Student(name=張1, age=14, address=深圳2棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 3=>Student(name=張1, age=15, address=深圳3棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 4=>Student(name=張1, age=16, address=深圳4棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 5=>Student(name=張1, age=17, address=深圳5棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 6=>Student(name=張1, age=18, address=深圳6棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 7=>Student(name=張1, age=19, address=深圳7棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 8=>Student(name=張1, age=20, address=深圳8棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 9=>Student(name=張1, age=21, address=深圳9棟大樓, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021)

例子2

寫測試

@Test public void writeTest(){ // 寫入測試 List stus = new ArrayList<>(); for (int i = 0; i < 10; i++) { stus。add(new Student(“張1”, 12 + i, “深圳” + i + “棟大樓”, new Date())); } String file = “student資訊表2。xlsx”; EasyExcelUtil。write(file, stus); } // 控制檯無輸出,可以在工程跟目錄找到匯出的檔案student資訊表2。xlsx

例子3

直接返回給瀏覽器下載

@RequestMapping(value = “/download”, method = RequestMethod。GET) public String download(HttpServletRequest request, HttpServletResponse response) throws IOException { // 寫入測試 List stus = new ArrayList<>(); for (int i = 0; i < 10; i++) { stus。add(new Student(“張1”, 12 + i, “深圳” + i + “棟大樓”, new Date())); } EasyExcelUtil。download(response, stus, “學生資訊表”); return “”; }

例子2和例子3匯出的檔案內容:

「Java工具類」EasyExcelUtil工具類 excel匯入匯出工具類 阿里Easy

excel匯出內容

工具類原始碼:

import com。alibaba。excel。EasyExcel; import org。slf4j。Logger; import org。slf4j。LoggerFactory; import javax。servlet。http。HttpServletResponse; import java。io。*; import java。net。URLEncoder; import java。util。List; /** * excel工具類 * easyexcel使用的3。0。2版本,跟以前版本有很大區別,且不相容1。x版本 * * @author liangxn */ public class EasyExcelUtil { private static final Logger LOGGER = LoggerFactory。getLogger(EasyExcelUtil。class); public static List read(String filePath, final Class<?> clazz) { File f = new File(filePath); try (FileInputStream fis = new FileInputStream(f)) { return read(fis, clazz); } catch (FileNotFoundException e) { LOGGER。error(“檔案{}不存在”, filePath, e); } catch (IOException e) { LOGGER。error(“檔案讀取出錯”, e); } return null; } public static List read(InputStream inputStream, final Class<?> clazz) { if (inputStream == null) { throw new MyAppRunException(“解析出錯了,檔案流是null”); } // 有個很重要的點 DataListener 不能被spring管理,要每次讀取excel都要new,然後裡面用到spring可以構造方法傳進去 DataListener listener = new DataListener<>(); // 這裡 需要指定讀用哪個class去讀,然後讀取第一個sheet 檔案流會自動關閉 EasyExcel。read(inputStream, clazz, listener)。sheet()。doRead(); return listener。getRows(); } public static void write(String outFile, List<?> list) { Class<?> clazz = list。get(0)。getClass(); // 新版本會自動關閉流,不需要自己操作 EasyExcel。write(outFile, clazz)。sheet()。doWrite(list); } public static void write(String outFile, List<?> list, String sheetName) { Class<?> clazz = list。get(0)。getClass(); // 新版本會自動關閉流,不需要自己操作 EasyExcel。write(outFile, clazz)。sheet(sheetName)。doWrite(list); } public static void write(OutputStream outputStream, List<?> list, String sheetName) { Class<?> clazz = list。get(0)。getClass(); // 新版本會自動關閉流,不需要自己操作 // sheetName為sheet的名字,預設寫第一個sheet EasyExcel。write(outputStream, clazz)。sheet(sheetName)。doWrite(list); } /** * 檔案下載(失敗了會返回一個有部分資料的Excel),用於直接把excel返回到瀏覽器下載 */ public static void download(HttpServletResponse response, List<?> list, String sheetName) throws IOException { Class<?> clazz = list。get(0)。getClass(); // 這裡注意 有同學反應使用swagger 會導致各種問題,請直接用瀏覽器或者用postman response。setContentType(“application/vnd。openxmlformats-officedocument。spreadsheetml。sheet”); response。setCharacterEncoding(“utf-8”); // 這裡URLEncoder。encode可以防止中文亂碼 當然和easyexcel沒有關係 String fileName = URLEncoder。encode(sheetName, “UTF-8”)。replaceAll(“\\+”, “%20”); response。setHeader(“Content-disposition”, “attachment;filename*=utf-8‘’” + fileName + “。xlsx”); EasyExcel。write(response。getOutputStream(), clazz)。sheet(sheetName)。doWrite(list); } }

相關的其它類

import com。alibaba。excel。annotation。ExcelProperty; import com。alibaba。excel。annotation。format。DateTimeFormat; import lombok。AllArgsConstructor; import lombok。Data; import lombok。NoArgsConstructor; import java。util。Date; @Data @AllArgsConstructor @NoArgsConstructor public class Student { @ExcelProperty(value = “姓名”, index = 0) private String name; @ExcelProperty(value = “年齡”, index = 1) private int age; @ExcelProperty(value = “地址”, index = 2) private String address; // easyexcel日期型別不支援LocalDate,只能是Date @ExcelProperty(value = “生日”, index = 3) @DateTimeFormat(“yyyy-MM-dd”) private Date birthday; }

/** * 通用異常類 */ public class MyAppRunException extends RuntimeException { public MyAppRunException(String message) { super(message); } public MyAppRunException(String message, Throwable cause) { super(message, cause); } public MyAppRunException(Throwable cause) { super(cause); } protected MyAppRunException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }

鄙人編碼十年多,在專案中也積累了一些工具類,很多工具類在每個專案都有在用,很實用。大部分是鄙人封裝的,有些工具類是同事封裝的,有些工具類已經不記得是ctrl+c的還是自己封裝的了,現在有空就會總結專案中大部分的工具類,分享給各位碼友。如果文章中涉及的程式碼有侵權行為請通知鄙人處理。

計劃是先把工具類整理出來,正所謂工欲善其事,必先利其器。專案中不管是普通單體專案還是多模組maven專案或是分散式微服務,一部分功能模組都是可以重用的,工具類模組就是其中之一。