Java Hutool 包工具類推薦 ExcelUtil詳解
Java Hutool 包工具類推薦 ExcelUtil
包引入
hutool包版本號(hào)可根據(jù)實(shí)際情況更換
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.4.M1</version> </dependency>
除hutool包之外,還需要引入操作Excel必要包
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-full</artifactId> <version>5.0.0</version> </dependency>
一般簡(jiǎn)單表頭Excel封裝工具類
直接上代碼
package io.supers.common.utils; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import cn.hutool.poi.excel.style.StyleUtil; import io.supers.framework.em.BaseErrorEnum; import io.supers.framework.exception.RRException; import org.apache.commons.collections.CollectionUtils; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Map; /** * Excel 工具類 * * @author guoc * @date 2022年05月31日 下午 17:21 */ public class ExcelUtils { /** * 下載 Excel 模板 (只有表頭的 Excel) * * @param response response * @param headers 表頭 * @param fileName 文件名 */ public static void exportHeaders(HttpServletResponse response, List<String> headers, String fileName) { export(response, null, headers, fileName); } /** * 導(dǎo)出或下載 Excel 公用方法 * * @param response 當(dāng)前請(qǐng)求的 HttpServletResponse * @param rows 需要寫(xiě)入的數(shù)據(jù) List * @param fileName 最終文件名 */ public static void export(HttpServletResponse response, List<Map<String, Object>> rows, List<String> headers, String fileName) { // 獲取 Writer ExcelWriter writer = ExcelUtil.getWriter(true); // 寫(xiě)入表頭 writer = writer.writeHeadRow(headers); // 若是有數(shù)據(jù) 則寫(xiě)入數(shù)據(jù) if (CollectionUtils.isNotEmpty(rows)) { writer.write(rows); } Workbook workbook = writer.getWorkbook(); CellStyle defaultCellStyle = StyleUtil.createDefaultCellStyle(workbook); DataFormat format = writer.getWorkbook().createDataFormat(); // 默認(rèn)為 文本格式 defaultCellStyle.setDataFormat(format.getFormat("@")); // 默認(rèn)為 居中 defaultCellStyle.setAlignment(HorizontalAlignment.CENTER); for (int i = 0; i < headers.size(); i++) { String h = headers.get(i); h = h == null ? " " : h; writer.setColumnStyle(i, defaultCellStyle); // 默認(rèn)寬度為 3 * 表頭字符數(shù) writer.setColumnWidth(i, 3 * h.length()); } try { // 彈出下載對(duì)話框的文件名,不能為中文,中文請(qǐng)自行編碼 fileName = URLUtil.encode(fileName); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); response.setContentType(ExcelUtil.XLSX_CONTENT_TYPE); // 輸出 ServletOutputStream out = response.getOutputStream(); writer.flush(out, true); // 關(guān)閉writer,釋放內(nèi)存 writer.close(); //此處記得關(guān)閉輸出Servlet流 IoUtil.close(out); } catch (IOException e) { e.printStackTrace(); throw new RRException(BaseErrorEnum.COMMON_ERROR, "下載文件失敗!\n" + e.getMessage()); } } /** * 讀取上傳到后臺(tái)的excel * * @param file MultipartFile 上傳的文件 * @return 數(shù)據(jù)列表 * @throws IOException e */ public static List<Map<String, Object>> readExcelRows(MultipartFile file) throws IOException { return ExcelUtil.getReader(file.getInputStream()).readAll(); } }
工具類封裝了三個(gè)方法, 只寫(xiě)入表頭方法, 寫(xiě)入表頭和數(shù)據(jù)方法 和 讀取表格數(shù)據(jù)列表方法。
三個(gè)方法的操作簡(jiǎn)單,看代碼就能明白,不多贅述了。
復(fù)雜表頭或表格內(nèi)合并單元格寫(xiě)入
合并單元格核心方法
// cn.hutool.poi.excel.ExcelWriter#merge(int, int, int, int, java.lang.Object, boolean) /** * 合并某行的單元格,并寫(xiě)入對(duì)象到單元格<br> * 如果寫(xiě)到單元格中的內(nèi)容非null,行號(hào)自動(dòng)+1,否則當(dāng)前行號(hào)不變<br> * 樣式為默認(rèn)標(biāo)題樣式,可使用{@link #getHeadCellStyle()}方法調(diào)用后自定義默認(rèn)樣式 * * @param firstRow 起始行,0開(kāi)始 * @param lastRow 結(jié)束行,0開(kāi)始 * @param firstColumn 起始列,0開(kāi)始 * @param lastColumn 結(jié)束列,0開(kāi)始 * @param content 合并單元格后的內(nèi)容 * @param isSetHeaderStyle 是否為合并后的單元格設(shè)置默認(rèn)標(biāo)題樣式,只提取邊框樣式 * @return this * @since 4.0.10 */ public ExcelWriter merge(int firstRow, int lastRow, int firstColumn, int lastColumn, Object content, boolean isSetHeaderStyle) { Assert.isFalse(this.isClosed, "ExcelWriter has been closed!"); CellStyle style = null; if (null != this.styleSet) { style = styleSet.getStyleByValueType(content, isSetHeaderStyle); } return merge(firstRow, lastRow, firstColumn, lastColumn, content, style); }
看完一般表頭寫(xiě)入的代碼,可以得知,此工具類寫(xiě)入表頭時(shí)只需傳入表頭的字符串列表,即 List<String>,若是遇到動(dòng)態(tài)表頭時(shí),則可以通過(guò)遍歷的操作,先生成出導(dǎo)出數(shù)據(jù)中所有需要的表頭信息,即可為下一步的寫(xiě)入數(shù)據(jù)的數(shù)據(jù)列表List<Map<String,Object>> 做準(zhǔn)備了。
若是遇到某列或某些列中有合并單元格的,一般都有規(guī)律的,可以遍歷數(shù)據(jù)時(shí)根據(jù)合并的數(shù)據(jù)項(xiàng)內(nèi)容通過(guò)合并單元格方法進(jìn)行合并單元格操作。
總結(jié)
通過(guò)以上方法,可以處理絕大多數(shù)情況的導(dǎo)出寫(xiě)入和基本所有的導(dǎo)入讀取(導(dǎo)入時(shí)的模板盡量規(guī)定為簡(jiǎn)單表頭)。
寫(xiě)入寫(xiě)出數(shù)據(jù)基本上都使用的是Map<String,Object>,若是要轉(zhuǎn)成JavaBean,自行寫(xiě)方法對(duì)應(yīng)即可。
到此這篇關(guān)于Java Hutool 包工具類推薦 ExcelUtil的文章就介紹到這了,更多相關(guān)Java Hutool 包工具類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA文件讀寫(xiě)例題實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了JAVA文件讀寫(xiě)例題實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java圖形界面之JFrame,JLabel,JButton詳解
這篇文章主要介紹了Java圖形界面之JFrame、JLabel、JButton詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Java中隊(duì)列Queue和Deque的區(qū)別與代碼實(shí)例
學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的,一定對(duì)隊(duì)列不陌生,java也實(shí)現(xiàn)了隊(duì)列,下面這篇文章主要給大家介紹了關(guān)于Java中隊(duì)列Queue和Deque區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-08-08Java的分支結(jié)構(gòu)與循環(huán)你知道多少
這篇文章主要為大家詳細(xì)介紹了Java的分支結(jié)構(gòu)與循環(huán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解
我在學(xué)習(xí)完順序表后一直對(duì)順序表和鏈表的概念存在一些疑問(wèn),這里給出一些分析和看法,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09【面試】Spring事務(wù)面試考點(diǎn)吐血整理(建議珍藏)
本文是小編給大家收藏整理的Spring事務(wù)面試考點(diǎn),非常不錯(cuò),值得收藏,感興趣的朋友參考下吧2019-04-04詳解SpringMVC 基礎(chǔ)教程 簡(jiǎn)單入門實(shí)例
這篇文章主要介紹了詳解SpringMVC 基礎(chǔ)教程 簡(jiǎn)單入門實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12SpringBoot+JUnit5+MockMvc+Mockito單元測(cè)試的實(shí)現(xiàn)
今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應(yīng)用最廣的測(cè)試框架,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09