Hutool Java工具类库_ExcelUtil怎么使用

发布时间:2021-11-29 13:36:13 作者:iii
来源:亿速云 阅读:1116
# 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优势总结

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框架的集成方案 - 异常处理的最佳实践 - 自定义单元格渲染的实现

推荐阅读:
  1. java工具包Hutool常用工具有哪些
  2. Java工具包Hutool的使用分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

hutool java

上一篇:如何使用Jmeter进行http接口测试

下一篇:C/C++ Qt TreeWidget单层树形组件怎么应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》