Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache POI-应用于克隆工作表上的单元格的单元格样式显示在原始工作表上_Java_Excel_Apache Poi - Fatal编程技术网

Java Apache POI-应用于克隆工作表上的单元格的单元格样式显示在原始工作表上

Java Apache POI-应用于克隆工作表上的单元格的单元格样式显示在原始工作表上,java,excel,apache-poi,Java,Excel,Apache Poi,在我正在编写的程序中,我准备了一个excel表(“master”)并多次克隆它。每次克隆此母版工作表时,我都会将CellStyles应用于新克隆工作表上的特定单元格。问题是,每次我将CellStyles应用到我克隆的工作表上的单元格时,这些样式都会一直出现在主工作表和所有其他克隆工作表上。以下是我如何进行克隆的片段: for(成员:所有成员){ memberName=member.getFirstName(); //下面的'schedule'是工作簿对象 XSSFSheet individual

在我正在编写的程序中,我准备了一个excel表(“master”)并多次克隆它。每次克隆此母版工作表时,我都会将
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); 
    }
   }
  }
 }