您的位置:首页 > 运维架构 > Apache

Apache POI CellStyle cloneStyleFrom

2015-08-26 10:59 567 查看

问题描述

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

// 改一个style,其他的cell 的 style也跟着变了
Cell cell = row.getCell(cellIndex);

CellStyle style = cell.getRow().getSheet().getWorkbook().createCellStyle();

style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setBorderTop(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.RED.index);
style.setLeftBorderColor(IndexedColors.RED.index);
style.setRightBorderColor(IndexedColors.RED.index);
style.setTopBorderColor(IndexedColors.RED.index);

cell.setCellStyle(style);


解决方法

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

Cell cell = row.getCell(cellIndex);

CellStyle style = cell.getRow().getSheet().getWorkbook().createCellStyle();
style.cloneStyleFrom(cell.getCellStyle());    // 克隆出一个 style

style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setBorderTop(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.RED.index);
style.setLeftBorderColor(IndexedColors.RED.index);
style.setRightBorderColor(IndexedColors.RED.index);
style.setTopBorderColor(IndexedColors.RED.index);

cell.setCellStyle(style);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: