Apache POI-应用于克隆工作表上的单元格的CellStyles出现在原始工作表上

时间:2019-06-27 22:03:43

标签: java excel apache-poi

在我正在编写的程序中,我准备一张excel工作表(“母版”)并将其克隆多次。每次我克隆此主表时,我将CellStyle应用于新克隆表上的特定单元格。问题是,每当我向克隆的工作表上的单元格应用CellStyle时,样式就会一直出现在母版工作表和所有其他克隆工作表上。这是显示我如何进行克隆的代码片段:

for (Member member : allMembers) {
    memberName = member.getFirstName();
    // `schedule` below is a WorkBook object
    XSSFSheet individualSheet = schedule.cloneSheet(0, memberName);

    highlightMemberNames(individualSheet, memberName);
}

highlightMemberNames(individualSheet, memberName)的工作是突出显示individualSheet中包含memberName的单元格。这是代码:

void highlightMemberNames(XSSFSheet individualSheet, String memberName) {
    for (Row row : individualSheet) {
        for (Cell cell : row) {
            if (cell.getStringCellValue().equals(memberName)) {
                cell.getCellStyle().setFillBackgroundColor(IndexedColors.LIGHT_GREEN.index);
                cell.getCellStyle().setFillForegroundColor(IndexedColors.LIGHT_GREEN.index);
                cell.getCellStyle().setFillPattern(FillPatternType.SOLID_FOREGROUND);
                cell.getCellStyle().setAlignment(HorizontalAlignment.CENTER);
            }
        }
    }
}

有没有办法避免这个问题?

1 个答案:

答案 0 :(得分:2)

Excel文件中,单元格样式位于工作簿级别,而不是工作表级别或单元格级别。因此,您的cell.getCellStyle()从工作簿级别获得了一种单元格样式,该样式也可能已应用于其他工作表中的其他单元格。如果您随后更改该样式,则会更改所有应用了该单元格样式的工作表中的所有单元格。

您需要首先在工作簿级别上创建所有所需的单元格样式,然后将这些样式应用于单元格,或者您需要使用CellUtil方法。使用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) {
  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); 
    }
   }
  }
 }