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

一、最近做一个导出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, i - 1, 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++) {
		// 此处发现不同的业务合并单元格要求不一样,此处强转成不同的类,按时处理什么情况能合并单元格。
		// 上一个单元格合同号
		String oldContractId = list.get(i - 1).getContractId();
		// 当前单元格合同号
		String newContractId = list.get(i).getContractId();
		int size = list.stream().filter(m -> m.getContractId().equals(oldContractId)).collect(Collectors.toList())
				.size();
		int temp = size;
		row1 = sheet1.createRow(i);
		T t = data.get(i);
		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, i - 1, k, k);
								sheet1.addMergedRegion(range);
							}
						} else {
							size--;
						}
						continue a;
					}
				}
			}
		}
	}
}
发布了10 篇原创文章 · 获赞 0 · 访问量 352

猜你喜欢

转载自blog.csdn.net/weixin_43137113/article/details/105192169
今日推荐