溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hutool?Java工具類庫_ExcelUtil怎么使用

發布時間:2021-11-29 13:36:13 來源:億速云 閱讀:1156 作者:iii 欄目:開發技術
# Hutool Java工具類庫_ExcelUtil怎么使用

## 一、Hutool工具庫簡介

### 1.1 什么是Hutool
Hutool是一個Java工具類庫,由國內開發者[looly](https://gitee.com/loolly)創建并維護。它提供了豐富的工具方法,涵蓋了文件操作、日期處理、加密解密、HTTP客戶端、Excel操作等常見功能模塊。Hutool的設計目標是減少項目中重復代碼的編寫,提高開發效率。

### 1.2 核心特點
- **零依賴**:絕大多數模塊不依賴第三方庫
- **全面**:覆蓋Java開發中的各類常見操作
- **簡單**:API設計直觀,學習成本低
- **高性能**:經過優化,執行效率高

### 1.3 Excel處理模塊概述
Hutool的`poi`模塊封裝了Apache POI,提供了更簡單的Excel操作API,其中`ExcelUtil`是最核心的Excel工具類。

## 二、ExcelUtil基礎使用

### 2.1 添加Maven依賴
```xml
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>
<!-- 或者單獨引入poi模塊 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-poi</artifactId>
    <version>5.8.16</version>
</dependency>

2.2 讀取Excel文件

基本讀取示例

// 讀取整個Excel文件
ExcelReader reader = ExcelUtil.getReader("d:/test.xlsx");
List<List<Object>> readAll = reader.read();

// 讀取指定sheet
ExcelReader sheetReader = ExcelUtil.getReader("d:/test.xlsx", "Sheet1");
List<Map<String,Object>> mapList = sheetReader.readAll();

帶標題行的讀取

ExcelReader reader = ExcelUtil.getReader("d:/test.xlsx");
// 第一行作為標題行
List<Map<String,Object>> list = reader.read(0, 1);

2.3 寫入Excel文件

基本寫入示例

List<String> row1 = CollUtil.newArrayList("aa", "bb", "cc");
List<String> row2 = CollUtil.newArrayList("dd", "ee", "ff");

List<List<String>> rows = CollUtil.newArrayList(row1, row2);

// 通過工具類創建writer
ExcelWriter writer = ExcelUtil.getWriter("d:/writeTest.xlsx");
// 寫入內容
writer.write(rows);
// 關閉writer
writer.close();

寫入Map數據

Map<String, Object> row1 = new LinkedHashMap<>();
row1.put("姓名", "張三");
row1.put("年齡", 23);

List<Map<String, Object>> list = CollUtil.newArrayList(row1);

ExcelWriter writer = ExcelUtil.getWriter("d:/writeMapTest.xlsx");
writer.write(list, true);
writer.close();

三、高級功能詳解

3.1 樣式定制

設置單元格樣式

ExcelWriter writer = ExcelUtil.getWriter("d:/styleTest.xlsx");

// 設置標題樣式
CellStyle headCellStyle = writer.getHeadCellStyle();
headCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
headCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

// 設置內容樣式
CellStyle cellStyle = writer.getCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);

writer.write(dataList);
writer.close();

自定義字體

// 創建字體
Font font = writer.createFont();
font.setBold(true);
font.setColor(Font.COLOR_RED);
font.setItalic(true);

// 應用字體
CellStyle style = writer.getCellStyle();
style.setFont(font);

3.2 大數據量處理

分批寫入

// 大數據量寫入
ExcelWriter bigWriter = ExcelUtil.getBigWriter("d:/bigDataTest.xlsx");

// 每次寫入1000條
for (int i = 0; i < 100000; i += 1000) {
    List<Map<String, Object>> subList = getSubList(i, 1000);
    bigWriter.write(subList);
    // 清空內存中的內容
    bigWriter.flush();
}

bigWriter.close();

SXSSFWorkbook配置

// 使用SXSSFWorkbook,設置rowAccessWindowSize為1000
ExcelWriter writer = ExcelUtil.getWriter("d:/sxssfTest.xlsx", true);
SXSSFWorkbook sxssfWorkbook = (SXSSFWorkbook) writer.getWorkbook();
sxssfWorkbook.setCompressTempFiles(true);

3.3 特殊單元格處理

合并單元格

ExcelWriter writer = ExcelUtil.getWriter("d:/mergeTest.xlsx");

// 合并第1行第1列到第1行第5列的單元格
writer.merge(0, 0, 0, 4, "合并標題", true);

writer.write(dataList);
writer.close();

公式單元格

// 設置公式
writer.writeCellValue(0, 5, "SUM(F2:F4)");

四、實際應用案例

4.1 數據導出功能實現

完整導出示例

public void exportData(HttpServletResponse response) throws IOException {
    // 查詢數據
    List<User> userList = userService.list();
    
    // 設置響應頭
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment;filename=user_list.xlsx");
    
    // 導出
    ExcelWriter writer = ExcelUtil.getWriter(true);
    writer.addHeaderAlias("name", "姓名");
    writer.addHeaderAlias("age", "年齡");
    writer.write(userList, true);
    
    // 輸出到客戶端
    writer.flush(response.getOutputStream());
    writer.close();
}

動態列導出

public void dynamicExport(HttpServletResponse response, List<String> columns) throws IOException {
    List<Map<String, Object>> dataList = getData();
    
    ExcelWriter writer = ExcelUtil.getWriter(true);
    
    // 動態設置列
    for (String column : columns) {
        writer.addHeaderAlias(column, getColumnName(column));
    }
    
    writer.write(dataList, true);
    writer.flush(response.getOutputStream());
    writer.close();
}

4.2 數據導入功能實現

導入并校驗數據

public List<User> importData(MultipartFile file) {
    try (InputStream inputStream = file.getInputStream()) {
        ExcelReader reader = ExcelUtil.getReader(inputStream);
        
        // 設置標題別名
        reader.addHeaderAlias("姓名", "name");
        reader.addHeaderAlias("年齡", "age");
        
        List<User> userList = reader.readAll(User.class);
        
        // 數據校驗
        for (User user : userList) {
            if (user.getAge() < 0) {
                throw new RuntimeException("年齡不能為負數");
            }
        }
        
        return userList;
    } catch (IOException e) {
        throw new RuntimeException("導入失敗", e);
    }
}

大數據量導入

public void bigImport(File file) {
    ExcelReader reader = ExcelUtil.getReader(file);
    
    // 分批讀取
    int batchSize = 1000;
    int totalRows = reader.getRowCount();
    
    for (int i = 0; i < totalRows; i += batchSize) {
        List<User> batchList = reader.read(i, Math.min(i + batchSize, totalRows), User.class);
        processBatch(batchList);
    }
    
    reader.close();
}

五、性能優化建議

5.1 內存優化

  1. 使用SXSSF模式:處理大數據量時使用ExcelUtil.getBigWriter()
  2. 及時關閉資源:使用try-with-resources確保Reader/Writer被關閉
  3. 分批處理:大數據量分批次讀取/寫入

5.2 代碼優化

  1. 復用樣式對象:避免重復創建樣式
  2. 使用緩存:對于頻繁讀取的模板文件可以緩存
  3. 減少反射:為JavaBean設置@Alias注解替代動態解析

5.3 常見問題解決方案

內存溢出處理

// 使用SXSSF并設置臨時文件壓縮
ExcelWriter writer = ExcelUtil.getBigWriter("d:/big.xlsx");
SXSSFWorkbook workbook = (SXSSFWorkbook) writer.getWorkbook();
workbook.setCompressTempFiles(true);

日期格式處理

// 自定義日期格式
CellStyle cellStyle = writer.getCellStyle();
DataFormat dataFormat = writer.getWorkbook().createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat("yyyy-MM-dd HH:mm:ss"));

六、總結與擴展

6.1 ExcelUtil優勢總結

  • 簡化了POI復雜的API
  • 提供了豐富的便捷方法
  • 良好的性能表現
  • 靈活的擴展能力

6.2 與其他工具對比

特性 Hutool ExcelUtil EasyExcel Apache POI原生
易用性 ★★★★★ ★★★★☆ ★★☆☆☆
大文件支持 ★★★★☆ ★★★★★ ★★★☆☆
功能完整性 ★★★★☆ ★★★☆☆ ★★★★★
社區支持 ★★★★☆ ★★★☆☆ ★★★★★

6.3 擴展學習資源

  1. Hutool官方文檔
  2. Apache POI官方文檔
  3. ExcelUtil源碼分析

通過本文的全面介紹,相信您已經掌握了Hutool ExcelUtil的核心用法。在實際項目中,可以根據具體需求選擇合適的API,結合性能優化建議,實現高效的Excel處理功能。 “`

這篇文章總計約5500字,按照Markdown格式編寫,包含了: 1. 詳細的代碼示例 2. 實際應用場景 3. 性能優化建議 4. 對比分析表格 5. 完整的目錄結構

您可以根據需要調整內容細節或補充更多實際案例。如需進一步擴展某些部分,可以增加: - 更復雜的數據轉換示例 - 與Spring框架的集成方案 - 異常處理的最佳實踐 - 自定義單元格渲染的實現

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女