Java Apache POI-应用于克隆工作表上的单元格的单元格样式显示在原始工作表上
在我正在编写的程序中,我准备了一个excel表(“master”)并多次克隆它。每次克隆此母版工作表时,我都会将Java Apache POI-应用于克隆工作表上的单元格的单元格样式显示在原始工作表上,java,excel,apache-poi,Java,Excel,Apache Poi,在我正在编写的程序中,我准备了一个excel表(“master”)并多次克隆它。每次克隆此母版工作表时,我都会将CellStyles应用于新克隆工作表上的特定单元格。问题是,每次我将CellStyles应用到我克隆的工作表上的单元格时,这些样式都会一直出现在主工作表和所有其他克隆工作表上。以下是我如何进行克隆的片段: for(成员:所有成员){ memberName=member.getFirstName(); //下面的'schedule'是工作簿对象 XSSFSheet individual
CellStyle
s应用于新克隆工作表上的特定单元格。问题是,每次我将CellStyle
s应用到我克隆的工作表上的单元格时,这些样式都会一直出现在主工作表和所有其他克隆工作表上。以下是我如何进行克隆的片段:
for(成员:所有成员){
memberName=member.getFirstName();
//下面的'schedule'是工作簿对象
XSSFSheet individualSheet=schedule.cloneSheet(0,memberName);
HighlightMemberName(individualSheet,memberName);
}
highlightMemberNames(individualSheet,memberName)
所做的是突出显示individualSheet
中包含memberName
的单元格。代码如下:
void highlightmembername(XSSFSheet individualSheet,String memberName){
for(行:独立工作表){
用于(单元格:行){
if(cell.getStringCellValue().equals(memberName)){
cell.getCellStyle().setFillBackgroundColor(IndexedColors.LIGHT_GREEN.index);
cell.getCellStyle().setFillForegroundColor(IndexedColors.LIGHT_GREEN.index);
cell.getCellStyle().setFillPattern(FillPatternType.SOLID_前台);
cell.getCellStyle().setAlignment(HorizontalAlignment.CENTER);
}
}
}
}
是否有办法避免此问题?在
Excel
文件中,单元格样式位于工作簿级别,而不是工作表级别或单元格级别。因此,您的cell.getCellStyle()
从工作簿级别获取一个单元格样式,该样式也可以应用于其他工作表中的其他单元格。如果随后更改该样式,则会更改应用该单元格样式的所有工作表中的所有单元格
您需要首先在工作簿级别创建所有需要的单元格样式,然后将这些样式应用于单元格,或者需要使用CellUtil
方法。使用CellUtil
方法应该是首选方法
方法用于将单个单元格样式属性设置为单个单元格。然后,这些方法在内部决定是否需要在工作簿级别创建新的单元格样式,或者是否已经存在只需要应用的样式
在您的情况下,这可能看起来像:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellUtil;
import java.util.Map;
import java.util.HashMap;
void highlightMemberNames(Sheet individualSheet,String memberName){
映射属性=新的HashMap();
properties.put(CellUtil.FILL\u PATTERN、FillPatternType.SOLID\u前台);
properties.put(CellUtil.FILL_FOREGROUND_COLOR,IndexedColors.LIGHT_GREEN.getIndex());
properties.put(CellUtil.ALIGNMENT、HorizontalAlignment.CENTER);
for(行:独立工作表){
用于(单元格:行){
if(cell.getCellType()==CellType.STRING&&cell.getStringCellValue().equals(memberName)){
setCellStyleProperties(单元格,属性);
}
}
}
}
突出显示问题已修复。谢谢但是现在,如果(cell.getCellType()==CellType.STRING&&cell.getStringCellValue().equals(memberName))在一些克隆的工作表上,甚至与条件不匹配的单元格的水平对齐方式正在从HorizontalAlignment.CENTER
更改为HorizontalAlignment.LEFT
(我注意到一个不可预测的模式)@Mike:我无法复制你的对齐问题。如果您需要帮助,请进一步询问有关此问题的新问题,并在出现问题的地方提供一份“主”表样本。
void highlightMemberNames(Sheet individualSheet, String memberName) {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
properties.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.LIGHT_GREEN.getIndex());
properties.put(CellUtil.ALIGNMENT, HorizontalAlignment.CENTER);
for (Row row : individualSheet) {
for (Cell cell : row) {
if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().equals(memberName)) {
CellUtil.setCellStyleProperties(cell, properties);
}
}
}
}