Excel工具-HUTOOL-输出Excel

简介: Hutool封装Excel写出功能,提供ExcelWriter和BigExcelWriter,支持写入List、Map、Bean等数据类型,可自定义样式、标题别名、多Sheet导出,并解决大数据量内存溢出问题,操作简便且高效。

依赖
由来
Excel有读取也便有写出,Hutool针对将数据写出到Excel做了封装。
原理
Hutool将Excel写出封装为ExcelWriter,原理为包装了Workbook对象,每次调用merge(合并单元格)或者write(写出数据)方法后只是将数据写入到Workbook,并不写出文件,只有调用flush或者close方法后才会真正写出文件。
由于机制原因,在写出结束后需要关闭ExcelWriter对象,调用close方法即可关闭,此时才会释放Workbook对象资源,否则带有数据的Workbook一直会常驻内存。
使用例子

  1. 将行列对象写出到Excel
    我们先定义一个嵌套的List,List的元素也是一个List,内层的一个List代表一行数据,每行都有4个单元格,最终list对象代表多行数据。
    然后我们创建ExcelWriter对象后写出数据:
    效果:
  2. 写出Map数据
    构造数据:
    写出数据:
    效果:
  3. 写出Bean数据
    定义Bean:
    构造数据:
    写出数据:
    效果:
  4. 自定义Bean的key别名(排序标题)
    在写出Bean的时候,我们可以调用ExcelWriter对象的addHeaderAlias方法自定义Bean中key的别名,这样就可以写出自定义标题了(例如中文)。
    写出数据:
    效果:
    提示(since 4.1.5) 默认情况下Excel中写出Bean字段不能保证顺序,此时可以使用addHeaderAlias方法设置标题别名,Bean的写出顺序就会按照标题别名的加入顺序排序。 如果不需要设置标题但是想要排序字段,请调用writer.addHeaderAlias("age", "age")设置一个相同的别名就可以不更换标题。 未设置标题别名的字段不参与排序,会默认排在前面。
  5. 写出到流
  6. 写出到客户端下载(写出到Servlet)
    写出xls
    写出xlsx
    注意 ExcelUtil.getWriter()默认创建xls格式的Excel,因此写出到客户端也需要自定义文件名为XXX.xls,否则会出现文件损坏的提示。 若想生成xlsx格式,请使用ExcelUtil.getWriter(true)创建。
    下载提示文件损坏问题解决
    有用户反馈按照代码生成的Excel下载后提示文件损坏,无法打开,经过排查,可能是几个问题:
    (1)writer和out流没有正确关闭,请在代码末尾的finally块增加关闭。
    (2)扩展名不匹配。getWriter默认生成xls,Content-Disposition中也应该是xls,只有getWriter(true)时才可以使用xlsx
    (3)Maven项目中Excel保存于ClassPath中(src/main/resources下)宏替换导致被破坏,解决办法是添加filtering(参考:https://blog.csdn.net/qq_42270377/article/details/92771349)
    (4)Excel打开提示文件损坏,WPS可以打开。这是Excel的安全性控制导致的,解决办法见:https://blog.csdn.net/zm9898/article/details/99677626
    自定义Excel
  7. 设置单元格背景色
  8. 自定义字体
  9. 写出多个sheet
  10. 更详细的定义样式
    在Excel中,由于样式对象个数有限制,因此Hutool根据样式种类分为4个样式对象,使相同类型的单元格可以共享样式对象。样式按照类别存在于StyleSet中,其中包括:
    头部样式 headCellStyle
    普通单元格样式 cellStyle
    数字单元格样式 cellStyleForNumber
    日期单元格样式 cellStyleForDate
    其中cellStyleForNumber cellStyleForDate用于控制数字和日期的显示方式。
    因此我们可以使用以下方式获取CellStyle对象自定义指定种类的样式:
    Plain Text
    复制代码
    1
    2
    3
    StyleSet style = writer.getStyleSet();
    CellStyle cellStyle = style.getHeadCellStyle();
    ..
    Excel大数据生成-BigExcelWriter
    介绍
    对于大量数据输出,采用ExcelWriter容易引起内存溢出,因此有了BigExcelWriter,使用方法与ExcelWriter完全一致。
    使用
    Java
    运行代码
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<?> row1 = CollUtil.newArrayList("aa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765);
    List<?> row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676);
    List<?> row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111);
    List<?> row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35);
    List<?> row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00);
    List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);
    BigExcelWriter writer= ExcelUtil.getBigWriter("e:/xxx.xlsx");
    // 一次性写出内容,使用默认样式
    writer.write(rows);
    // 关闭writer,释放内存
    writer.close();
相关文章
|
5月前
|
Java 大数据 Apache
Excel工具-HUTOOL-输出Excel
Hutool基于Apache POI封装了Excel读写功能,提供ExcelWriter和BigExcelWriter类,支持写出List、Map、Bean等数据类型到Excel,可自定义样式、多sheet操作,并解决大数据量导出时的内存溢出问题,适用于文件导出、客户端下载等场景。
|
Java API 网络架构
关于 Spring Integration 你知道多少,包含集成MQTT案例讲述及源码3
关于 Spring Integration 你知道多少,包含集成MQTT案例讲述及源码
2677 0
关于 Spring Integration 你知道多少,包含集成MQTT案例讲述及源码3
|
自然语言处理 Java 索引
Elastic:如何查询特殊字符
某些业务场景下我们需要使用特殊符号来进行查询,但是es的默认分词器以及ik分词器等大多数分词器都会将特殊符号过滤掉,导致后续无法通过特殊符号查询到数据。 那么我们如何来解决这个问题呢,下面列举出几种处理方案
1611 0
|
2月前
|
存储 算法 关系型数据库
吃透分布式 ID:雪花算法、号段模式的底层逻辑与全场景架构避坑
本文深度解析分布式ID两大主流方案——雪花算法与号段模式,涵盖核心设计准则(唯一性、趋势递增、高性能等)、底层原理、代码实现、6大生产避坑指南及场景化选型建议,助你构建稳定可靠的分布式ID服务。
504 4
|
8月前
|
C#
.NET编程技巧:C#中字节与其他数据类型转换方法
在C#中将不同数据类型互相变更至二进制格式需要注意每种数据类型特定方法以及可能涉及特定系统资源比如内存流等。正确理解每种方法并选择最适合当前场景下最高效率且安全性高且易于维护代码方式至关重要。
350 13
|
Java 数据库
【YashanDB知识库】kettle同步大表提示java内存溢出
在数据导入导出场景中,使用Kettle进行大表数据同步时出现“ERROR:could not create the java virtual machine!”问题,原因为Java内存溢出。解决方法包括:1) 编辑Spoon.bat增大JVM堆内存至2GB;2) 优化Kettle转换流程,如调整批量大小、精简步骤;3) 合理设置并行线程数(PARALLELISM参数)。此问题影响所有版本,需根据实际需求调整相关参数以避免内存不足。
|
SQL 缓存 Java
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
简化数据库访问:通过配置文件或注解的方式来定义数据库操作,减少了传统的JDBC编码工作量。 灵活性:支持自定义SQL语句,可以编写复杂的SQL语句来满足特定的需求。
849 0
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
|
JavaScript 前端开发 测试技术
Map 和 Object 在处理大量数据时性能差异
Map 和 Object 在处理大量数据时性能差异

热门文章

最新文章