Excel工具-HUTOOL-输出Excel

简介: Hutool封装Excel写出功能,提供ExcelWriter与BigExcelWriter,支持数据、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. 自定义字体
    Plain Text
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    ExcelWriter writer = ...;
    //设置内容字体
    Font font = writer.createFont();
    font.setBold(true);
    font.setColor(Font.COLOR_RED);
    font.setItalic(true);
    //第二个参数表示是否忽略头部样式
    writer.getStyleSet().setFont(font, true);Copy to clipboardErrorCopied
  9. 写出多个sheet
    Plain Text
    复制代码
    1
    2
    3
    4
    5
    6
    7
    //初始化时定义表名
    ExcelWriter writer = new ExcelWriter("d:/aaa.xls", "表1");
    //切换sheet,此时从第0行开始写
    writer.setSheet("表2");
    ...
    writer.setSheet("表3");
    ...Copy to clipboardErrorCopied
  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();
目录
相关文章
|
13天前
|
数据采集 人工智能 安全
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
657 4
|
8天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
350 164
|
7天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
359 155

热门文章

最新文章