Java Hutool 包工具類推薦 ExcelUtil

来源:https://www.cnblogs.com/mlxs/archive/2022/09/30/16745344.html
-Advertisement-
Play Games

Java Hutool 包工具類推薦 ExcelUtil 包引入 hutool包版本號可根據實際情況更換 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.4.M1</ ...


Java Hutool 包工具類推薦 ExcelUtil

包引入

hutool包版本號可根據實際情況更換

 

<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>

 

一般簡單表頭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);
    }

    /**
     * 導出或下載 Excel 公用方法
     *
     * @param response 當前請求的 HttpServletResponse
     * @param rows     需要寫入的數據 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);
        // 寫入表頭
        writer = writer.writeHeadRow(headers);
        // 若是有數據 則寫入數據
        if (CollectionUtils.isNotEmpty(rows)) {
            writer.write(rows);
        }
        Workbook workbook = writer.getWorkbook();
        CellStyle defaultCellStyle = StyleUtil.createDefaultCellStyle(workbook);
        DataFormat format = writer.getWorkbook().createDataFormat();
        // 預設為 文本格式
        defaultCellStyle.setDataFormat(format.getFormat("@"));
        // 預設為 居中
        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);
            // 預設寬度為 3 * 表頭字元數
            writer.setColumnWidth(i, 3 * h.length());
        }
        try {
            // 彈出下載對話框的文件名,不能為中文,中文請自行編碼
            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);
            // 關閉writer,釋放記憶體
            writer.close();
            //此處記得關閉輸出Servlet流
            IoUtil.close(out);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RRException(BaseErrorEnum.COMMON_ERROR, "下載文件失敗!\n" + e.getMessage());
        }
    }

    /**
     * 讀取上傳到後臺的excel
     *
     * @param file MultipartFile 上傳的文件
     * @return 數據列表
     * @throws IOException e
     */
    public static List<Map<String, Object>> readExcelRows(MultipartFile file) throws IOException {
        return ExcelUtil.getReader(file.getInputStream()).readAll();
    }
}

 

工具類封裝了三個方法, 只寫入表頭方法, 寫入表頭和數據方法 和 讀取表格數據列表方法。

三個方法的操作簡單,看代碼就能明白,不多贅述了。

複雜表頭或表格內合併單元格寫入

合併單元格核心方法

 

// cn.hutool.poi.excel.ExcelWriter#merge(int, int, int, int, java.lang.Object, boolean)
	/**
	 * 合併某行的單元格,並寫入對象到單元格<br>
	 * 如果寫到單元格中的內容非null,行號自動+1,否則當前行號不變<br>
	 * 樣式為預設標題樣式,可使用{@link #getHeadCellStyle()}方法調用後自定義預設樣式
	 *
	 * @param firstRow         起始行,0開始
	 * @param lastRow          結束行,0開始
	 * @param firstColumn      起始列,0開始
	 * @param lastColumn       結束列,0開始
	 * @param content          合併單元格後的內容
	 * @param isSetHeaderStyle 是否為合併後的單元格設置預設標題樣式,只提取邊框樣式
	 * @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);
	}

 

看完一般表頭寫入的代碼,可以得知,此工具類寫入表頭時只需傳入表頭的字元串列表,即 List<String>,若是遇到動態表頭時,則可以通過遍歷的操作,先生成出導出數據中所有需要的表頭信息,即可為下一步的寫入數據的數據列表List<Map<String,Object>> 做準備了。

若是遇到某列或某些列中有合併單元格的,一般都有規律的,可以遍曆數據時根據合併的數據項內容通過合併單元格方法進行合併單元格操作。

總結

通過以上方法,可以處理絕大多數情況的導出寫入和基本所有的導入讀取(導入時的模板儘量規定為簡單表頭)。

寫入寫出數據基本上都使用的是Map<String,Object>,若是要轉成JavaBean,自行寫方法對應即可。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • csv的簡單介紹 CSV (Comma Separated Values),即逗號分隔值(也稱字元分隔值,因為分隔符可以不是逗號),是一種常用的文本格式,用以存儲表格數據,包括數字或者字元。很多程式在處理數據時都會碰到csv這種格式的文件。python自帶了csv模塊,專門用於處理csv文件的讀取 ...
  • 1、任務介紹 需求分析 爬取豆瓣電影Top250的基本信息,包括電影的名稱,豆瓣評分,評價數,電影概況,電影鏈接等。 https://movie.douban.com/top250 2、基本流程 2.1、準備工作 通過瀏覽器查看分析目標網頁,學習編程基礎規範 與Java的一些區別,Python沒有主 ...
  • 2022-09-30 F對象: 在shell中是用於兩個有關聯的屬性之間的查詢。 使用實例: 查詢書籍表中閱讀量大於評論量的記錄 前提,進入pycharm,進入虛擬環境,進入shell環境。 首先,要使用F對象,那麼就需要導入F對象 from django.db.models import F 後進 ...
  • 介紹了分散式鎖的特性,模擬想要實現redis分散式鎖的演變流程,分析redisson源碼是如何實現分散式鎖的,面對高併發下,我們該如何提升分散式鎖性能 ...
  • 1.冒泡排序(Bubble Sort) | 第0輪 | 3 | 1 | 4 | 1 | 5 | 9 | 2 | 6 | 5 | 3 | 5 | 8 | 9 | | | | | | | | | | | | | | | | | 第1輪 | 1 | 3 | 1 | 4 | 5 | 2 | 6 | 5 | ...
  • 前言 tkinter:GUI桌面應用開發模塊,寫軟體界面你還可以打包成exe軟體, 哪怕你沒有python環境, 一樣可以用雖然不一定要有界面, 但是有界面, 用戶體驗很棒… 環境使用 Python 3.8 Pycharm 模塊使用 import tkinter import webbrowser ...
  • 1、無論是淺拷貝還是深拷貝,拷貝對象後是否會開闢新記憶體,取決於被拷貝對象的數據類型是否可變,一般來講,可變的數據類型會開闢新記憶體,不可變數據類型反之不會開闢新記憶體,進行記憶體地址的引用(-5-256以外的大整數池會開闢記憶體,但我本地進行測試比較記憶體還是一樣的,有問題) 2、要在單層、嵌套型對象中逐一比 ...
  • 前言 環境使用 Python 3.8 Pycharm 模塊使用 import requests —> 數據請求模塊 pip install requests import parsel —> 數據解析模塊 pip install parsel from selenium import webdriv ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...