【问题标题】:Apache POI & colorsApache POI 和颜色
【发布时间】:2014-06-08 11:06:45
【问题描述】:

我在使用 Apache POI 时遇到了一些问题,请提供帮助!

我想删除 Excel 工作表子部分中的颜色。 为此,我尝试的第一件事是渲染我想要清理的单元格(比如说第一行的那个)并将它们的颜色设置为白色:

cell.getCellStyle().setFillForegroundColor(IndexedColors.WHITE.index);

但如果我这样做,一些未渲染的单元格的颜色(比如说第二行之一)也会更改为白色单元格。很奇怪,因为被改变的单元格没有相同的前景色,所以我以为它们会有不同的风格......

因此,我尝试了另一种方法:

CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.WHITE.index);
cell.setCellStyle(style);

这个想法是为了避免更改 Excel 工作表中不同单元格可能共有的样式。实际上,它解决了颜色问题,但如果这样做,我会在 Excel 工作表中松散不同的样式,而我只想删除一些颜色...

我正在使用通用工作簿,并且正在阅读 xlsx(与 xls 相同的问题) 你知道怎么做吗? 多谢, 问候,

【问题讨论】:

    标签: excel colors apache-poi cells


    【解决方案1】:

    如果您想删除颜色,那么将填充模式更改为NO_FILL 而不是将颜色设置为白色可能更有意义,如下所示:

    style.setFillPattern(CellStyle.NO_FILL)
    

    回到你的主要问题,你有两个处理单元格样式修改的选项:

    • 通过CellUtil.setCellStyleProperty方法修改样式

    CellUtil.setCellStyleProperty(cell, workbook, CellUtil.FILL_PATTERN, CellStyle.NO_FILL)

    • 通过从现有样式中克隆样式并修改属性

    示例代码如下:

     CellStyle oldStyle = cell.getCellStyle();
     CellStyle newStyle = workbook.createCellStyle();
     newStyle.cloneStyleFrom(oldStyle);
     newStyle.setFillPattern(CellStyle.NO_FILL);
     cell.setCellStyle(newStyle);
    

    但是在第二种情况下,您将为每个单元格创建一个新的单元格样式,您可能会考虑重用一些已更新的单元格样式并实施某种缓存(否则可能会导致性能问题和达到允许的样式限制)。

    【讨论】:

    • 谢谢你的答案。填充图案选项确实比前景更好。关于克隆,我遇到了你描述的关于新样式的大小限制的问题......我想我必须按照你的建议将不同的样式保存在缓存中。谢谢。
    • @tlapeg07 如果您达到了样式限制,那么您可以尝试使用CellUtil.setCellStyleProperty 方法。它旨在避免重复创建已经存在的样式。请尝试以下操作:CellUtil.setCellStyleProperty(cell, workbook, CellUtil.FILL_PATTERN, CellStyle.NO_FILL),让我知道这是否能解决您的问题。
    • 完美运行!感谢您的快速回答!
    • 酷,很高兴它有帮助! :) 我修改了答案以反映这两种解决方案。请接受答案,除非您需要任何其他帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2012-05-24
    • 2012-07-16
    相关资源
    最近更新 更多