一、Hutool介绍

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度地避免封装不完善带来的bug。

今天要讲的是excel的导出并合并单元格,其他工具类,可查看参考文档,之后也会陆续的更新一些常用工具类的用法。

二、背景

之前常用的是Apache的POI库,代码复杂、非常耗内存,严重时会导致内存溢出,并发上来,一定会OOM或频繁full gc,后来发现平时使用的Hutool工具类,也有excel的导入导出API,使用起来简单方便。Hutool-poi是针对Apache POI的封装,因此需要用户自行引入POI库,Hutool默认不引入

三、excel普通导出

引入依赖:

推荐引入poi-ooxml,这个包会自动关联引入poi包,且可以很好的支持Office2007+的文档格式

普通导出

/*** @Author zmy* @Description 普通导出excel* @Date 11:01 2020/12/16* @param response 响应* @param fileName excel文件名* @param sheetName sheet名称* @param headers 表头别名map,有序maplinkHashMap,才能保证表头是有序的* @param data 数据集合* @return void*/public void exportExcelByHutools(HttpServletResponse response,String fileName,String sheetName,Map headers,List data) {//通过工具类创建writertry {//对于大量数据输出,采用bigwriter,其他方法不变// ExcelWriter writer = ExcelUtil.getBigWriter();ExcelWriter writer = ExcelUtil.getWriter();//设置sheet的名称writer.renameSheet(sheetName);//设置head的名称, 此时的顺序就是导出的顺序, key就是属性名称, value就是别名headers.entrySet().forEach(entry -> {//这个添加顺序和导出顺序相同writer.addHeaderAlias(entry.getKey(), entry.getValue());});writer.write(data, true);response.reset();response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");writer.flush(response.getOutputStream());writer.close();} catch (Exception e) {//如果导出异常,则生成一个空的文件log.info("######导出 excel异常 :{}", e.getMessage());}}

其他导出方法可参考GitHub

四、excel导出并合并单元格

今天重点是合并单元格,最近遇到导出excel需要自定义字段合并单元格,网上查了一些,资料比较少,有些是针对特定项目的逻辑处理,没有一个通用的方法,于是自己就着手写了一个

支持自定义表头别名,合并单元格,创建writer的方法可根据业务需要进行修改。

/*** @Author zmy* @Description hutool导出excel* @Date 10:28 2020/12/16* @param dataList 数据集合* @param fileName excel文件名* @param headAliasMap 表头别名* @param mergeNameColumnIndexMap 合并单元格的字段名和列角标,角标从0开始* @param isMerge 是否需要合并单元格* @return void*/public static void hutoolExportExcel(List> dataList,String fileName,LinkedHashMap headAliasMap,LinkedHashMap mergeNameColumnIndexMap,Boolean isMerge) throws Exception {// 通过工具类创建writerExcelWriter writer = ExcelUtil.getWriter(fileName);//自定义标题别名if (MapUtil.isNotEmpty(headAliasMap)) {writer.setHeaderAlias(headAliasMap);}if (isMerge) {//获取需要合并的单元格所对应的行集合Map> stringListMap = addMerStrategy(dataList, mergeNameColumnIndexMap);//调用merge合并单元格layout(writer, stringListMap);}// 一次性写出内容,使用默认样式,强制输出标题writer.write(dataList, true);// flush或者close方法后才会真正写出文件;关闭writer,才会释放Workbook对象资源writer.close();}

addMerStrategy:获取合并单元格对应的行集合map

/*** @Author zmy* @Description 获取合并单元格对应的行集合* @Date 11:16 2020/12/16* @param dataList 数据集合* @param mergeNameColumnIndexMap 有序map,合并单元格字段和列角标map* @return 合并单元格对应的行集合映射*/public static Map> addMerStrategy(List> dataList, LinkedHashMap mergeNameColumnIndexMap) throws Exception {Map> strategyMap = new HashMap<>();Object preObj = null;int i = 0;for (Object currObj : dataList) {if (preObj != null) {Boolean mergeFlag = false;int j = 0;for (Map.Entry entry : mergeNameColumnIndexMap.entrySet()) {//在第一个列合并的情况下,后面的列才需要合并if (mergeFlag || j == 0) {String name = entry.getKey();if (getGetMethod(currObj, name).equals(getGetMethod(preObj, name))) {fillStrategyMap(strategyMap, mergeNameColumnIndexMap.get(name), i);mergeFlag = true;}} else {break;}j++;}}i++;preObj = currObj;}return strategyMap;}

getGetMethod:根据方法获取get方法

fillStrategyMap:获取合并单元格对应的行集合

layout:调用merge,合并单元格

RowRangeDto:起始截止行对象

hutool导出excel大数据_Hutool excel导出并合并单元格相关推荐

  1. 学习Python处理Excel 难度1级别 多表合并、数据透视表、拆分合并单元格并获得一维表

    #本代码要点:多表合并.数据透视表.拆分合并单元格并获得一维表 #主题:各门店合并,计算各店当月回店做服务2次+的客人数量 #EXCEL工作表:存在合并单元格 #备注: import pandas a ...

  2. 在EXCEL表格中经常会遇到有合并单元格时,汇总计算的公式无法直接下拉自动填充计算,掌握这个小技巧一键汇总

    在EXCEL表格中经常会遇到有合并单元格时,汇总计算的公式无法直接下拉自动填充计算,掌握这个小技巧一键汇总 目录 在EXCEL表格中经常会遇到有合并单元格时,汇总计算的公式无法直接下拉自动填充计算,掌 ...

  3. hutool导出excel大数据_HuTool工具类使用之Excel文档的导入导出

    HuTool工具类使用之Excel文档的导入导出 前言 在日常的工作开发中,Excel的导入和导出是必不可少的,如果自己写相应的导入导出方法,会显得十分繁琐,本文采用Hutool工具类实现的Excel ...

  4. PHP excel导出(自定义样式,行高,合并单元格等)

    PHP 导出多个sheet 或者导出带样式的excel 修改样式方式见下文 具体使用需要根据具体业务进行一些调整和封装 $PHPExcel = new \PHPExcel(); $sheetIndex ...

  5. poi导出Excel报表多表头双层表头、合并单元格

    效果图: controller层方法: /**      *      * 导出Excel报表      * @param request      * @return      *      */ ...

  6. 复杂的POI导出Excel表格(多行表头、合并单元格)

    poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...

  7. PHPExcel导出Excel基本操作,实现设置字体、合并单元格、加粗等功能

    PHPExcel一些相关操作,只罗列了部分功能,后续有新增再补充.代码可直接复制使用,需要注意是引入PHPExcel类库时因为是thinkphp框架,所以使用了import导入,如果其他框架,需要做部 ...

  8. 前端vue导出 xlsx 实现带标题 内容居中 自动换行 合并单元格 加边框 合计 字体大小设置等

    1.在src下的libs文件夹下新建一个excel文件夹,里面放入下载好的两个文件(Blob.js和Export2Excel2.js) 2.在所需要导出的vue文件里引入: import { toEx ...

  9. Python操作高版本Excel文件:颜色、边框、合并单元格

    本文主要颜色Python扩展库openpyxl的一些基本用法,包括创建工作簿.选择活动工作表.写入单元格数据,设置单元格字体颜色.边框样式,合并单元格等等. from random import ra ...

最新文章

  1. java 语言如何判断素数_C语言实验之判断素数(循环结构java)方法讲解
  2. 直播预告 | 中国工程院院刊:信息与电子工程领域青年学术前沿论坛
  3. html5,表格与框架综合布局
  4. python递归求5!_Python | 递归
  5. mos 控制交流_小米智能排插的220V交流电压信号的开关控制电路设计
  6. 大侠学java之继承
  7. C# internal和public
  8. 控制沟通-监控过程组
  9. AD13如何导出坐标文件
  10. 顽皮的雪狐七七:CSS——清除浮动所有方法总结
  11. 什么是群发单显和分别发送,有什么区别,发客户邮件忘记群发单显
  12. 软件工程师待遇怎么样?软件工程师薪水到底有多高?
  13. ActiveMQ消息处理机制-Topic方式(二)
  14. python tensorflow 文本提取_用RNN构建文本生成器(TensorFlow Eager+ tf.keras)
  15. 绘图与滤镜全面解析--Quartz 2D 、Core Image
  16. JS 简繁体互转代码
  17. MacOS Big Sur 11.6 (20G165) OC 0.7.3 / Cl 5139 / PE 三分区原版黑苹果镜像
  18. 分布式与集群的区别是什么
  19. 学生信息管理信息系统--添加窗体(学籍,课程,班级,成绩)问题汇总
  20. 安卓从Flickr获取Json数据

热门文章

  1. WebService学习总结
  2. 地理信息软件属于计算机软件吗,地理信息系统试题名词解释1地理信息系统是在计算机硬软件...
  3. java开发校园一卡通项目复杂_基于jsp的校园一卡通-JavaEE实现校园一卡通 - java项目源码...
  4. CrystalDiskInfo磁盘工具及下载地址
  5. pdf打印机下载后如何打印成pdf文件
  6. 【C Primer Plus】美国体积测量系统
  7. 基于Java Swing 的马踏棋盘小游戏(附源码!免费下载!)
  8. Manjaro tty卸载显卡驱动-mhwd
  9. mysql mof提权_三、mysql 之mof提权学习
  10. 使用JS调用本地摄像头录制视频