POI导出Excel,单元格样式被后面覆盖

最近在做导出Excel,遇到了一些问题,导出的Excel的单元格样式老是被后面的覆盖掉,查看代码,发现了一些端倪。

Row row = sheet.createRow(x); //创建行对象
Cell cell = row.createCell(y); //创建单元格
cell.setCellValue("a啊啊");
CellStyle cellStyle = cell.getCellStyle();
Font font = workbook.createFont();
font.setBold(true);
font.setFontHeightInPoints((short)40);
font.setColor(COLOR_RED);
cellStyle.setAlignment(HorizontalAlignment.RIGHT);
cellStyle.setFont(font);
System.out.println(cellStyle.getIndex());
cell.setCellStyle(cellStyle);

问题出在CellStyle cellStyle = cell.getCellStyle();这一行,首先查看官方文档,
在这里插入图片描述
仔细阅读便能发现,这个函数返回的是样式没错,但每次返回的是当前工作Workbook的第一个默认样式,即workbook有一个默认样式,并且索引为0,由此就能豁然开朗,原来每次获取的样式是同一个,那后面的做了修改,可不就覆盖了前面的。其实问题是在于cell单元格它自己本身并没有一个默认的样式,因此为单元格添加样式时,需要根据当前工作簿为这个单元格创建一个新的样式,即上述代码应改为
CellStyle cellstyle = workbook.createCellStyle();


写在后面,上述代码虽然能够正确设置样式,但如果导出图表单元格太多,而每个单元格又需要创建一个新样式,这样就会超过单个工作簿单元格样式数量为64000(针对xlsx是64000,xls是40000),控制台会报错,解决方案移步:
POI导出Excel,报错样式数量超出限制:The maximum number of Cell Styles was exceeded

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值