java rowstyle_POI CellStyle 中样式覆盖问题
在使用 Apache POI-3.8的时候,需要一个功能,就是处理上传得 Excel的 cell style。如果数据有错误,则标红或者加上其他 style 标识。但是当直接获取到 cell 的 style 进行处理后,再 set 回去会发现很多其他的 cell 的 style 也被修改了。其实是因为在 Excel 中,多个 cell 会共用一个 style,这样会就不必为每个 cell存储一个
在使用 Apache POI-3.8的时候,需要一个功能,就是处理上传得 Excel的 cell style。如果数据有错误,则标红或者加上其他 style 标识。但是当直接获取到 cell 的 style 进行处理后,再 set 回去会发现很多其他的 cell 的 style 也被修改了。其实是因为在 Excel 中,多个 cell 会共用一个 style,这样会就不必为每个 cell存储一个 style。所以虽然我们只想修改一个 cell 的 style,其他 cell 也跟着变了。

1 // 改一个style,其他的cell 的 style也跟着变了
2 Cell cell = row.getCell(cellIndex);
3
4 CellStyle style = cell.getRow().getSheet().getWorkbook().createCellStyle();
5
6 style.setBorderBottom(CellStyle.BORDER_THIN);
7 style.setBorderLeft(CellStyle.BORDER_THIN);
8 style.setBorderRight(CellStyle.BORDER_THIN);
9 style.setBorderTop(CellStyle.BORDER_THIN);
10 style.setBottomBorderColor(IndexedColors.RED.index);
11 style.setLeftBorderColor(IndexedColors.RED.index);
12 style.setRightBorderColor(IndexedColors.RED.index);
13 style.setTopBorderColor(IndexedColors.RED.index);
14
15 cell.setCellStyle(style);

解决方法
使用 POI提供的方法 - cloneStyleFrom 来克隆一个 style 出来专门为这个 cell 来设置 style。

1 Cell cell = row.getCell(cellIndex);
2
3 CellStyle style = cell.getRow().getSheet().getWorkbook().createCellStyle();
4 style.cloneStyleFrom(cell.getCellStyle()); // 克隆出一个 style
5
6 style.setBorderBottom(CellStyle.BORDER_THIN);
7 style.setBorderLeft(CellStyle.BORDER_THIN);
8 style.setBorderRight(CellStyle.BORDER_THIN);
9 style.setBorderTop(CellStyle.BORDER_THIN);
10 style.setBottomBorderColor(IndexedColors.RED.index);
11 style.setLeftBorderColor(IndexedColors.RED.index);
12 style.setRightBorderColor(IndexedColors.RED.index);
13 style.setTopBorderColor(IndexedColors.RED.index);
14
15 cell.setCellStyle(style);
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)