一、最近做一个导出excel需求,按理说很简单,但是发现写公共方法的哥们儿并没有搞合并单元格,而且也不太熟悉他的那种写法,所以简单研究了下,和大家讨论,至少思路千万条,越想越明了
1、之前的写法简单看下,不晓得从哪个网上拷贝的,哈哈。大概思路是:定义三个数组(导出excel实体的字段名,表头名,每列宽度设置),通过反射获取这些参数。

2、接下来具体看封装的ExeclUtils工具类,反射就不在这赘述了,重点说HSSFCellStyle样式的设置,其中有2个居中(垂直居中和水平居中)。

// 设置水平垂直居中方式
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
...
// 中间省略
// 单元格创建、设置内容和样式(真正生效一定是样式被设置到单元格上)
HSSFCell cell = row1.createCell(j);
cell.setCellValue(value[j]);
cell.setCellStyle(style );
// 按理说这2个设置后,合并单元格就可以居中了,但是却遗漏了一个点,就是单元格合并是动态的,需要明确单元格合并数,不然会出现,单元格是合并了,但是单元格是上水平居中。

3、合并单元格居中,单元格如果是动态的,那么你就要明确给CellRangeAddress几行几列合并多少个。

// 合并单元格,四个参数分别是行号的起止、列号的起止,比如下面这个,列号相同,都是变量k,说明只是单元格合并行号
CellRangeAddress range = new CellRangeAddress(i - temp + 1, i, k, k);
sheet.addMergedRegion(range);

4、毕竟是公共类,为了不影响已有功能,简单开了一个分支出来写需要合并单元格的需求,方法不要太多,但是如果是我封装,我还是会定义一个注解,然后反射高度处理更多关于excel导入导出所需要求。

/**
*  一个定制化合并单元格代码简单示例。1、需求只合并行号。2、什么情况相邻行能合并
*/
@SuppressWarnings({ "deprecation", "unchecked" })
private static <T> void contractExcel(List<T> data, HSSFSheet sheet1, HSSFRow row1, String[] method,HSSFCellStyle ALIGN_CENTER) throws NoSuchMethodException, SecurityException, IllegalAccessException,IllegalArgumentException, InvocationTargetException {List<T> list = (List<T>) data;for (int i = 1; i < list.size(); i++) {// 此处发现不同的业务合并单元格要求不一样,此处强转成不同的类,按时处理什么情况能合并单元格。// 上一个单元格合同号(get(0)是第一个)String oldContractId = list.get(i - 1).getContractId();int size = 0;String newContractId = "";if(i != list.size()) {// 当前单元格合同号newContractId = list.get(i).getContractId();size = list.stream().filter(m -> m.getContractId().equals(oldContractId)).collect(Collectors.toList()).size();}int temp = size;row1 = sheet1.createRow(i);// 集合取0开始(本来就知道是某个对象了,不应该这么搞,拷贝方便,暂时不管)T t = data.get(i - 1);Class<?> clas = t.getClass();a: for (int j = 0; j < method.length; j++) {Method m = clas.getMethod(method[j]);Object value = m.invoke(t);HSSFCell cell = row1.createCell(j);cell.setCellStyle(ALIGN_CENTER);if (value == null) {cell.setCellValue("");} else if (value instanceof String) {cell.setCellValue((String) value);} else if (value instanceof Long) {cell.setCellValue((Long) value);} else if (value instanceof BigDecimal) {cell.setCellValue(((BigDecimal) value).doubleValue());} else if (value instanceof Integer) {cell.setCellValue((Integer) value);} else if (value instanceof LocalDateTime) {cell.setCellValue(((LocalDateTime) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));} else {throw new BussnisException(StateCommonCode.COMMON_SYSTEM_ERROR, "系统错误,没有相应实体的数据类型,请添加");}if (i > 1) {if (!oldContractId.equals(newContractId) && temp > 1) {for (int l = size; l > 0;) {if (size == 1) {for (int k = 0; k < 21; k++) {cell.setCellStyle(ALIGN_CENTER);// 合并单元格,只是行合并CellRangeAddress range = new CellRangeAddress(i - temp + 1, i, k, k);sheet1.addMergedRegion(range);}} else {size--;}continue a;}}}}}
}

为什么不居中(CellRangeAddress),关于excel导出合并单元格相关推荐

  1. JAVA EXCEL导出合并单元格自定义封装方法

    转载在C站上面看到一个大神写的自定义封装方法 转载地址:springboot 使用Poi 自定义封装方法 合并excel中的单元格_Tongyao-CSDN博客_springboot合并单元格 之前都 ...

  2. java实现excel导出合并单元格

    随着数据的不断增长,很多时候需要将数据导出到Excel中进行分析.处理和展示.而Java作为一种流行的编程语言,自然也提供了很多实现Excel导出的方法.本文将介绍如何使用Java实现Excel导出, ...

  3. java 复杂表头excel导出合并单元格

    easyexcel-wraper easyexcel-wraper是什么? 一个方便读取excel内容,且可以使用注解进行内容验证的包装工具 用到alibaba 2.1.4版本 定义导出excel复杂 ...

  4. Springboot导出excel,合并单元格示例

    原文链接:Springboot导出excel,合并单元格示例 更多文章,欢迎访问:Java知音,一个专注于技术分享的网站 以下用一个示例来说明springboot如何导出数据到excel. 首先引入M ...

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

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

  6. java下载excel实现合并单元格功能

    在下载excel中偶尔会出现需要合并单元格的情况再导出,代码如下: // 1.创建工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); // 标题合并单元格设 ...

  7. 玩电脑的岂能不知道excel怎么合并单元格?

    excel怎么合并单元格?单元格太小导致输入的内容只能看见一部分,这种情况下需要将两列合并起来,空出更多输入内容的空间,以此达到美观又详细的视觉效果,下面来看看如何操作吧! 方法一 第1步:打开一个e ...

  8. POI进行Excel的合并单元格数据处理

    POI进行Excel的合并单元格数据处理 近日接到一个要处理合并Excel单元格的上料表的需求,就到网上找了一些模板,发现有的技术大牛还是挺厉害的,对他们致以敬意. 合并单元格工具类 在这个类中将传入 ...

  9. html表格里面怎么合并单元格的快捷键,合并单元格快捷键:Excel怎么合并单元格...

    今天来聊聊一篇关于合并单元格快捷键:Excel怎么合并单元格的文章,现在就为大家来简单介绍下合并单元格快捷键:Excel怎么合并单元格,希望对各位小伙伴们有所帮助. 方法如下: 1.首先我们需要将&q ...

最新文章

  1. 单片机是否为嵌入式技术,单片机和嵌入式学哪个?
  2. C语言与C++不得不说的那点事
  3. Ubuntu12.04 安装MySQL简单步骤
  4. java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析
  5. java位于算——一个测试搞懂位运算
  6. 返回局部变量或临时变量的地址_C++的函数不可以返回局部变量的指针
  7. java中怎么判断一段代码时线程安全还是非线程安全_24张图带你彻底理解Java中的21种锁...
  8. as button onitemclicklistener为null_为vue3.0的学习TS解读高级类型
  9. Android 系统开发系列四
  10. 谷歌联合创始人:什么是数据分析闭环?
  11. ElasticSearch全文搜索引擎之Linux版安装教程
  12. 防火墙双机热备(应用场景分析及配置)
  13. 大数据框架之Spark详解
  14. 中国象棋马走日 — 递归
  15. (已解决)INSTALL_FAILED_CONFLICTING_PROVIDER虚拟机安装失败错误
  16. ARM Linux从Bootloader、kernel到filesystem启动流程
  17. java rgb转yuv_RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法(java实现)
  18. 【Halcon视觉】定位
  19. Android user版通过adb_enable开启adb 调试 不提示对话框
  20. VUE created与mounted区别

热门文章

  1. matlab矩阵 代表什么,matlab中矩阵AB是什么意思
  2. 关于Angular,开发人员经常忽视的9个想法
  3. python代码写名字_python代码实现给儿子儿女取名字
  4. mt管理器主题修改教程_微信皮肤主题怎么弄 微信设置更换修改气泡和主题教程...
  5. MySQL主从复制与读写分离配置及实操
  6. 小白Mac C/C++ for Visual Studio Code配置
  7. 【python爬虫】爬取深圳证券业协会公布的营业部数据并对pdf文件进行解析
  8. 掌薪阁分享:一个人人可做,汇聚了全网不同层次的网赚项目!
  9. 关于网页抓取的10个误区(最新)
  10. 世界港航人工智能领军企业CIMCAI成熟AI产品全球前三船公司及港口落地,智能港口码头海关智能铁路场站智能航运船公司堆场提效降本