Apache POI - CellStyles, примененные к ячейкам на клонированном листе, появляются на исходном листе - PullRequest
2 голосов
/ 28 июня 2019

В программе, которую я пишу, я готовлю лист Excel ("master") и клонирую его несколько раз.Каждый раз, когда я клонирую этот мастер-лист, я применяю CellStyle s к определенным ячейкам на новом клонированном листе.Проблема заключается в том, что каждый раз, когда я применяю CellStyle s к ячейкам на листе (-ях), которые я клонирую, стили продолжают появляться на мастер-листе и на всех других клонированных листах.Вот фрагмент, который показывает, как я делаю клонирование:

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 Ответ

2 голосов
/ 28 июня 2019

В 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); 
    }
   }
  }
 }
...