Hutool excel導出並合併單元格

2020-12-22 zmyHow

一、Hutool介紹

Hutool是一個小而全的Java工具類庫,通過靜態方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函數式語言般的優雅,讓Java語言也可以「甜甜的」。

Hutool是項目中「util」包友好的替代,它節省了開發人員對項目中公用類和公用工具方法的封裝時間,使開發專注於業務,同時可以最大限度地避免封裝不完善帶來的bug。

今天要講的是excel的導出並合併單元格,其他工具類,可查看參考文檔,之後也會陸續的更新一些常用工具類的用法。

二、背景

之前常用的是Apache的POI庫,代碼複雜、非常耗內存,嚴重時會導致內存溢出,並發上來,一定會OOM或頻繁full gc,後來發現平時使用的Hutool工具類,也有excel的導入導出API,使用起來簡單方便。Hutool-poi是針對Apache POI的封裝,因此需要用戶自行引入POI庫,Hutool默認不引入

三、excel普通導出

引入依賴:

推薦引入poi-ooxml,這個包會自動關聯引入poi包,且可以很好的支持Office2007+的文檔格式

普通導出

/*** @Author zmy * @Description 普通導出excel * @Date 11:01 2020/12/16 * @param response 響應 * @param fileName excel文件名 * @param sheetName sheet名稱 * @param headers 表頭別名map,有序maplinkHashMap,才能保證表頭是有序的 * @param data 數據集合 * @return void */ public void exportExcelByHutools(HttpServletResponse response, String fileName, String sheetName, Map<String, String> headers, List<T> data) { //通過工具類創建writer try { //對於大量數據輸出,採用bigwriter,其他方法不變 // ExcelWriter writer = ExcelUtil.getBigWriter(); ExcelWriter writer = ExcelUtil.getWriter(); //設置sheet的名稱 writer.renameSheet(sheetName); //設置head的名稱, 此時的順序就是導出的順序, key就是屬性名稱, value就是別名 headers.entrySet().forEach(entry -> { //這個添加順序和導出順序相同 writer.addHeaderAlias(entry.getKey(), entry.getValue()); }); writer.write(data, true); response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); writer.flush(response.getOutputStream()); writer.close(); } catch (Exception e) { //如果導出異常,則生成一個空的文件 log.info("######導出 excel異常 :{}", e.getMessage()); } }

其他導出方法可參考GitHub

四、excel導出並合併單元格

今天重點是合併單元格,最近遇到導出excel需要自定義欄位合併單元格,網上查了一些,資料比較少,有些是針對特定項目的邏輯處理,沒有一個通用的方法,於是自己就著手寫了一個

支持自定義表頭別名,合併單元格,創建writer的方法可根據業務需要進行修改。

/*** @Author zmy * @Description hutool導出excel * @Date 10:28 2020/12/16 * @param dataList 數據集合 * @param fileName excel文件名 * @param headAliasMap 表頭別名 * @param mergeNameColumnIndexMap 合併單元格的欄位名和列角標,角標從0開始 * @param isMerge 是否需要合併單元格 * @return void */ public static void hutoolExportExcel(List<?> dataList, String fileName, LinkedHashMap<String, String> headAliasMap, LinkedHashMap<String, Integer> mergeNameColumnIndexMap, Boolean isMerge) throws Exception { // 通過工具類創建writer ExcelWriter writer = ExcelUtil.getWriter(fileName); //自定義標題別名 if (MapUtil.isNotEmpty(headAliasMap)) { writer.setHeaderAlias(headAliasMap); } if (isMerge) { //獲取需要合併的單元格所對應的行集合 Map<Integer, List<RowRangeDto>> stringListMap = addMerStrategy(dataList, mergeNameColumnIndexMap); //調用merge合併單元格 layout(writer, stringListMap); } // 一次性寫出內容,使用默認樣式,強制輸出標題 writer.write(dataList, true); // flush或者close方法後才會真正寫出文件;關閉writer,才會釋放Workbook對象資源 writer.close(); }

addMerStrategy:獲取合併單元格對應的行集合map

/*** @Author zmy * @Description 獲取合併單元格對應的行集合 * @Date 11:16 2020/12/16 * @param dataList 數據集合 * @param mergeNameColumnIndexMap 有序map,合併單元格欄位和列角標map * @return 合併單元格對應的行集合映射 */ public static Map<Integer, List<RowRangeDto>> addMerStrategy(List<?> dataList, LinkedHashMap<String, Integer> mergeNameColumnIndexMap) throws Exception { Map<Integer, List<RowRangeDto>> strategyMap = new HashMap<>(); Object preObj = null; int i = 0; for (Object currObj : dataList) { if (preObj != null) { Boolean mergeFlag = false; int j = 0; for (Map.Entry<String, Integer> entry : mergeNameColumnIndexMap.entrySet()) { //在第一個列合併的情況下,後面的列才需要合併 if (mergeFlag || j == 0) { String name = entry.getKey(); if (getGetMethod(currObj, name).equals(getGetMethod(preObj, name))) { fillStrategyMap(strategyMap, mergeNameColumnIndexMap.get(name), i); mergeFlag = true; } } else { break; } j++; } } i++; preObj = currObj; } return strategyMap; }

getGetMethod:根據方法獲取get方法

fillStrategyMap:獲取合併單元格對應的行集合

layout:調用merge,合併單元格

RowRangeDto:起始截止行對象

相關焦點

  • excel單元格操作:如何快速批量合併單元格
    都說「分久必合,合久必分」,當你在為合併單元格煩惱的時候,其他人可能在想怎麼按要求合併單元格。這不,小美就遇上合併單元格的問題了,看看我們的苗老師會怎麼解決呢?小美:「苗老師,怎麼批量合併單元格啊?」苗老師:「批量合併單元格?是啥意思?需要怎麼批量?」
  • Excel相同內容單元格快速合併、合併單元格篩選、合併單元格剪切
    一.區別手動合併的單元格和用格式刷合併的單元格1.手動合併的單元格只有左上角的單元格內容為合併單元格中顯示的內容,其餘的單元格內容為空白。2.格式刷合併的單元格所有單元格的內容都是合併單元格中的內容,因為格式刷只會改變單元格的格式不會更改單元格的內容。
  • Excel一個單元格乘以另一個合併單元格,合併單元格的乘積怎麼算
    合併單元格的乘積與合併單元格的求和同出一轍,它們在日常工作中時常遇到,如何一次性解決合併單元格的乘積問題,能極大地提高工作效率。如何計算合併單元格的乘積,正常的思路是作取消合併單元格的操作,隨後定位空值,批量填充,如果要還原表格格式,還需要作分類匯總的操作進行合併,這樣下來直接通過操作達到計算的目的,會相對更繁瑣。因此考慮下一個方法,函數公式!
  • Excel–如何批量合併相同單元格?
    又有人提問合併單元格的問題。人類和計算機經常是矛盾對立的,對於 Excel 來說,原始數據不應該合併單元格,但是對於看表的人來說,卻往往覺得合併後能看得更清楚。 實在非要合併的話,如何能更快地批量合併呢?
  • Excel如何批量合併單元格
    Excel表格是我們每天都會接觸到的,經常會遇到各種問題,前幾天同事遇到這樣的一個問題,就是要將左側表格數據轉換為右側表格數據,應該怎麼批量合併單元格,快速完成操作呢?1、添加輔助列首先選中A例,右鍵插入一列輔助列,並填充上一樣的序號1。
  • 學個技巧,搞定合併單元格篩選天坑
    很多人喜歡使用合併單元格,同時也會發現合併後有很多坑,比如合併後篩選只有一個值,和你預期完全不同今天我們就來學個技巧,搞定這個異常(原理來講屬於正常現象)同時可以學習一個合併單元格空值填充的技巧,一起來看看!
  • EXCEL之VBA應用實例-合併單元格並保留所有單元格內容
    默認情況下,EXCEL中合併單元格只保留左上角第一個單元格內容,很多時候我們需要保留所有內容,把合併前的每個單元格內容分行顯示在合併後的單元格內,下面是我想到的一個方法,如果大家有更好的方法歡迎分享。Sub 合併單元格並保留所有單元格內容()Application.DisplayAlerts = False '自動對彈出的確認框進行確認,不顯示彈出對話框。
  • 程式設計師:Java操作導出excel的三種方法,POI、easyExcel、Hutool
    前言最近在開發一個管理後臺,有一些excel的導出和導入操作,以前都是使用POI操作excel,這一次嘗試了別的人組件:easyExcel和Hutool,今天就來分享一下,這三種方式中POI操作導出excel。POI導出excel文件。
  • Excel中怎麼將多個單元格內容合併到一個單元格內
    1、本文以Excel2019軟體進行演示說明,讓大家能夠清楚明白地了解Excel中怎麼將多個單元格內容合併到一個單元格內,讓大家都會進行此項操作;用該軟體打開需要操作的Excel文檔,文檔顯示如下2、滑鼠左鍵雙擊存放合併內容的單元格,使其出入編輯狀態
  • Excel怎麼在合併單元格中自動填充序號
    我們經常會利用Excel的自動填充功能快速輸入多個序號,Excel在不包含合併單元格的表格範圍中自動填充序號比較簡單,但是如果填充範圍中有合併單元格,自動填充時Excel就會彈出「要執行此操作,所有合併單元格需相同大小」的提示。
  • 如何在Excel批量合併單元格-分類匯總法
    需求:批量合併單元格,確保合併之後可以再恢復之前的狀態 1. 光標點擊放到數據的任一表格,然後選擇上面菜單欄的「數據」,點擊「分類匯總」;分類欄位選擇「班級」即可,因為我們這裡是要合併該項單元格。
  • java——POI導入Excel文件
    最近手頭上項目的涉及到關於目標值錄入的問題,甲方爸爸要求提供excel導入的方式錄入目標值,之前項目裡也用到excel導入的方式錄入數據,不過當時是自己研究了導出PPT的時候,順手給同事寫了一個簡單的excel導入的工具類,這次的需求稍微複雜一些,涉及到合併單元格的excel讀取,
  • Excel表格如何多個單元格內容合併呢?
    Excel表格如何多個單元格內容合併呢?大家在辦公的過程中是否有遇到過這種情況呢?多個單元格內容合併到同一個單元格,不知道該怎麼辦,一個一個複製粘貼的話很麻煩,沒效率,那麼有什麼快速合併多個單元格內容的方法呢?答案是:有的。
  • Excel技巧:如何快速把單元格文本合併在一起?
    今天小編教大家幾種快速合併文本的方法方法一:快捷鍵Ctrl+E填充法首先需要輸入一個合併後的效果,然後選中下面的單元格,按Ctrl+E鍵,就可以得到想要的合併文本效果。方法二:使用&符號連接&符號可以把兩個或多個單元格內容連接在一起,用法超簡單:=A1&B1就可以。
  • Excel按部門合併單元格,你還在一個個合併嗎?
    雖然說合併單元格在Excel中一大禁忌,但工作中還是經常要用到的,合併單元格後能讓表格版面更清晰,閱讀者更易理解。今天小編就教大家如何按部門快速合併單元格(如下圖),公司人事和財務部門可要看一看嘍。具體操作步驟:第一步:選中整個表格,點擊【數據】選項卡中的【分類匯總】按鈕,在彈出的窗口中,選定匯總項:勾選【部門】,去掉其他勾選,點擊【確定】按鈕返回工作區;第二步:選中需要合併的單元格區域A3:A19,按F5鍵或Ctrl+G鍵
  • Excel篩選結果不全,都是合併單元格惹的禍
    有粉絲髮來表格說,按部門篩選後結果不完整,經確認,表格中部門列進行了合併單元格操作(如下圖)按部門篩選後,結果只得到了一條記錄,並不是把一個部門的所有記錄篩選出來了這是由於部門列合併了單元格,無法正常篩選
  • Excel中如何批量取消合併單元格,並自動填充數據
    Excel中如何批量取消合併單元格,並自動填充數據在Excel中合併單元格功能大家肯定都用過,對相同內容的單元格進行合併,使表格看起來整齊美觀。有時候處理數據時又需要取消合併單元格,今天我們就來學習一下批量取消合併單元格,並實現自動填充數據,最終效果圖如下:一、單個取消已合併的單元格並填充數據現在需要將三年級一班學生的班級列都進行展示,即達到圖中右邊的效果。
  • 如何在Excel批量合併單元格 - 行列差異法
    選擇前兩列的內容,按F5定位,點擊「定位條件」,選擇「行內容差異單元格」,點擊「確定」。3. 光標放在第二列,右擊滑鼠,「插入」一空行,這樣,第一列的數據就會按照同類別分隔。4. 選擇第一列,按F5定位,點擊「定位條件」,選擇「常量」,點擊「確定」。
  • Excel裡合併多個單元格內容的技巧,再多數據合併也能輕鬆搞定!
    既然有拆分單元格數據,那麼在Excel裡就有如何合併多個單元格數據!日常工作中也會需要合併多個單元格內容的操作!拆分數據或者合併數據是Excel表格裡經常會被使用到的,今天小龍就分享Excel裡的幾種合併多個單元格內容的方法給大家!
  • Excel中合併單元格的序號填充、複製、求和及篩選技巧解讀
    用過Excel的親對合併單元格並不陌生,但是在數據處理時確非常的麻煩,所以能避免合併的儘可能不予合併,但如果無法避免,我們對一些常用的操作技巧還是需要掌握的,今天,小編給大家分享一下關於Excel合併單元格的序號填充、求和、複製粘貼和篩選等技巧。