为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

互换的青春 2023-02-23 15:54:45
在我正在编写的程序中,我准备了一个 excel 表(“master”)并多次克隆它。每次我克隆这个主表时,我都会将CellStyles 应用于新克隆表上的特定单元格。问题是,每次我将CellStyles 应用于我克隆的工作表上的单元格时,样式一直出现在主工作表和所有其他克隆工作表上。这是显示我如何进行克隆的片段: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 回答

?
DIEA

TA贡献1820条经验 获得超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); 

    }

   }

  }

 }


查看完整回答
反对 回复 2023-02-23
  • 1 回答
  • 0 关注
  • 196 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信