工作上有一个导出数据的需求,发现用hutool工具类可以非常简洁快捷的生成excel导出。

  1. 前期准备
    引入hutool的依赖:
     <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.21</version></dependency>

准备好导出的Excel模板:
第一行为标题文本
第二行为Bean的字段名

  1. 代码示例
    主要使用到的有这两个类:
cn.hutool.core.util.ReflectUtil
cn.hutool.core.util.ExcelUtil
private void convertOrderListToXSSF(List<OrderVo> orderVoList, HttpServletResponse response) {//输出文件名称String targetFileName = DateUtil.currentSeconds() + "_order.xls";//0.从模板中提取表头String templateName = "导出模板.xlsx";InputStream inputStream = getClass().getClassLoader().getResourceAsStream(templateName);ExcelReader excelReader = ExcelUtil.getReader(inputStream);/*//A方法:这种方法使用了hutool提供的bean转换为excel行的方法,但有一个局限性:一个字段只能设置一个别名,因此无法生成同个字段取值的多个列,舍弃。//从模板文件中提取 字段名-表头文字的对应关系;第一行(key)为表头文字,第一行(value)为字段名,如name:名字Map<String, Object> filedNameTitle = excelReader.readAll().get(0);//定义标题别名for (Map.Entry<String, Object> entry : filedNameTitle.entrySet()) {excelWriter.addHeaderAlias(entry.getKey(), String.valueOf(entry.getValue()));}//只写出加了别名的字段excelWriter.setOnlyAlias(true);//写出大标题if(StringUtils.isNotBlank(targetFileTitle)) {excelWriter.merge(filedNameTitle.size() - 1, targetFileTitle, true);}excelWriter.write(voList, true);excelWriter.autoSizeColumnAll();*///表头文字List<Object> titleRow = excelReader.readRow(0);//表头文字对应的类字段名List<Object> filedNameRow = excelReader.readRow(1);//1.写数据ExcelWriter excelWriter = ExcelUtil.getWriter();//1.0 表头excelWriter.writeRow(titleRow, true);//1.1 内容-订单记录for (OrderVo orderVo : orderVoList) {//一行记录List<Object> row = new ArrayList<>();for (Object filedNameCell : filedNameRow) {//使用Java的反射机制,获取订单对象字段名对应的字段值String filedName = String.valueOf(filedNameCell);Object filedValue = ReflectUtil.getFieldValue(orderVo, filedName);filedValue = convertData(filedName, filedValue);row.add(filedValue);}excelWriter.writeRow(row, true);}//2.输出数据response.setContentType("application/vnd.ms-excel;charset=utf-8");// Content-disposition 默认值为inline,表示在浏览器窗口打开,attachment表示下载框,filename是文件名,如为中文需要编码response.setHeader("Content-Disposition", "attachment;filename=" + targetFileName);ServletOutputStream out = null;try {out = response.getOutputStream();} catch (IOException e) {e.printStackTrace();}excelWriter.flush(out, true);excelWriter.close();IoUtil.close(out);}
  1. 注意事项
    在使用这个工具类时,发现打包不会报错,但运行时,
    在读取excel模板这一步:ExcelReader excelReader = ExcelUtil.getReader(inputStream);
    一直提示java.lang.NoSuchMethodError
    排查了maven依赖后,发现项目同时还引入了org.apache.poi这个依赖且版本较低导致的,
    因为是小组共用不能删除,所以更新了依赖版本就解决这个问题啦。
     <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

实现把excel从服务器下载到客户端的方法,参考了这篇文章:

hutool官网的使用示例

用hutool工具类导出excel相关推荐

  1. 利用hutool工具类导出Excel

    简单介绍 可以使用hutool工具类,简单的生成Excel.本质上还是使用的POI组件,只是对其进行了封装,避免开发人员重复造轮子 hutool工具类链接 maven导入 <!-- hutool ...

  2. hutool工具类导出Excel表格

    1.引入hutool和相关依赖 <dependency>         <groupId>cn.hutool</groupId>         <arti ...

  3. hutool工具类导出excel添加水印

    // 创建 ExcelWriter 对象 ExcelWriter writer = ExcelUtil.getWriter("demo.xlsx");// 添加水印 ByteArr ...

  4. Java 利用hutool工具实现导出excel并合并单元格

    Java 利用hutool工具实现导出excel并合并单元格 controller层调用service,就一个核心方法,没错就下面这个代码就能实现了.前提是项目里面要引用hutool包.把我这个复制到 ...

  5. Hutool工具类之excel导入导出

    文章目录 1.导入excel 2.导出excel 1.导入excel ExcelReader reader = ExcelUtil.getReader("D:\\test.xlsx" ...

  6. java使用POI工具类导出excel

    POI导出excel 1.导入maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId ...

  7. java获取excle表格对象_Java使用excel工具类导出对象功能示例

    本文实例讲述了Java使用excel工具类导出对象功能.分享给大家供大家参考,具体如下: package com.gcloud.common; import org.apache.poi.ss.use ...

  8. java基于HuTool工具类ExcelWriter合并单元格

    ** java基于HuTool工具类ExcelWriter合并单元格 ** 1.基于HuTool工具类ExcelWriter合并单元格并且使用 jdk1.8 lambda表达式 效果如下: 用姓名和编 ...

  9. asp.net中使用excel类导出Excel文件,并导出到web客户端中遇到的问题

    asp.net中使用excel类导出Excel文件,并导出到web客户端中遇到错误: 检索Com类工厂中CLSID为{000245-0000-0000-C000-000000000046}的组件失败, ...

最新文章

  1. ORB_SLAM2中Tracking线程的三种追踪方式
  2. hadloop大数据平台论文_企业大数据平台建设过程中的问题和建议
  3. 分布式服务管理框架-Zookeeper节点ACL
  4. 20172310 2017-2018-2 《程序设计与数据结构》第四周学习总结
  5. Day 20: 斯坦福CoreNLP —— 用Java给Twitter进行情感分析
  6. 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  7. SAP建议客户将UI技术迁移到Fiori的六大原因
  8. npm run build失败
  9. [转]Android应用的自动更新
  10. java swing 字体设置_java如何改变Swing应用程序的默认字体/字号
  11. Web App开发入门
  12. 王庆的边缘计算(第四章)
  13. linux启动报错23修复
  14. hive之内表和外表
  15. vue-router路由history模式+nginx部署项目到非根目录下(实践版)
  16. 2018艾耕科技笔试题
  17. Java24种设计模式(第二种)--代理模式(Proxy Pattern)
  18. PostgreSQL查询 动态输入参数
  19. h5游戏引流推广方法:电商平台如何引流推广?
  20. 人的一生七八十年,到底该如何度过?

热门文章

  1. filedownload实现
  2. 为什么不要把鸡蛋放在同一个篮子里?
  3. 基于语义关联的中文查询纠错框架
  4. 双击打开.bat文件闪退
  5. go语言消息推送服务器,Golang 消息推送系统
  6. 【平衡车】电机编码器知识总结
  7. Verilog0.2:跑通第一个Vivado工程
  8. MySQL语句查询数据库数据并添加到Redis缓存
  9. 「思考人生」未来的路该怎么走下去
  10. 用 Uno Platform 构建一个 Kanban-style Todo App