【问题标题】:How to get conditional formatting info from excel 2007?如何从 excel 2007 获取条件格式信息?
【发布时间】:2015-07-29 19:44:54
【问题描述】:

我必须比较两个不同的 excel 文件,并且在 HSSFConditionalFormattingRule 方法正常工作时,我不断从 XSSFConditionalFormattingRule 方法获取 0 或 null 值。

这是 .xls 和 .xlsx 文件的结果(两者具有相同的条件格式)。

2. CONDITIONAL FORMATTING DIFFERENCES

FORMULA1: 
Sheet1(0) Rule 0 IS:  SHOULD BE: IF(INT(COUNT($C$1:$C$7)*13%)>0,LARGE($C$1:$C$7,INT(COUNT($C$1:$C$7)*13%)),MAX($C$1:$C$7))<=A1

BCOLOR: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 20

UNDERLINE: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 255
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 255
Sheet1(0) Rule 1 IS: 0 SHOULD BE: 255

LCOLOR: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 20

FOREGROUND: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 64
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 64
Sheet1(0) Rule 1 IS: 0 SHOULD BE: 64

TYPE: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 2

ESCAPMENT TYPE: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: -1
Sheet1(0) Rule 0 IS: 0 SHOULD BE: -1
Sheet1(0) Rule 1 IS: 0 SHOULD BE: -1

TCOLOR: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 20

BACKCOLOR: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 45
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 43
Sheet1(0) Rule 1 IS: 0 SHOULD BE: 43

FONT COLOR: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 20
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 60
Sheet1(0) Rule 1 IS: 0 SHOULD BE: 60

RCOLOR: 
Sheet1(0) Rule 0 IS: 0 SHOULD BE: 20

【问题讨论】:

  • 您尝试使用哪个版本的 Apache POI?
  • 你是如何获取颜色的?
  • 我一直在尝试 POI 3.10 - 3.12 rule.getPatternFormatting().getFillBackgroundColor(); 我没有找到任何其他方法。我知道它只是一个索引,在 excel 2003 和 2007 中有不同的调色板,但它不应该一直返回 0。

标签: java excel apache-poi conditional-formatting xssf


【解决方案1】:

您有两个问题 - 一,您使用的是 Apache POI 的旧副本,二,您调用了错误的方法来获取颜色

目前,您对rule.getPatternFormatting().getFillBackgroundColor() 的调用将返回颜色的索引,如果颜色未编入索引,则返回 0。 HSSF 中几乎所有的条件格式颜色都被索引,XSSF 中很少。因此,对于大多数 XSSF 文件,如果您要求索引颜色,您只会得到 0。相反,您需要调用返回颜色对象的 rule.getPatternFormatting().getFillBackgroundColorColor()。从中,您可以获得描述颜色的十六进制字符串,索引与否

所以,你应该像这样更改代码

int colourIndex = rule.getPatternFormatting().getFillBackgroundColor();
System.out.println("Colour index is " + colourIndex);

改为:

Color colour = rule.getPatternFormatting().getFillBackgroundColorColor();
if (colour instanceof ExtendedColor) {
   System.out.println("Colour is " + ((ExtendedColor)colour).getARGBHex());
} else {
   System.out.println("Colour is " + ((HSSFColor)colour).getHexString());
}

更新后的代码正确地获取颜色对象,无论是否被索引,然后允许您获取它的十六进制表示。

另外,如前所述,您的 Apache POI 版本对于其中的某些内容来说太旧了。自 2015 年 7 月 20 日起,您需要至少升级到 3.13 beta 1,或者理想情况下是 3.13 beta 2 / nightly build。

【讨论】:

  • 在哪里可以获得 3.13 beta 2?我已经尝试了 3.13 beta 1,但我无法使用这一行:Color colour = rule.getPatternFormatting().getFillBackgroundColorColor(); 并且没有要导入的 ExtendedColor 类。我设法解决了这个问题,因为我对 HSSF 和 XSSF 格式有不同的功能。我将在这里写下我的进展。
  • 3.13 beta 2 尚未发布,因此在发布之前您需要使用夜间构建。答案被设计为持续很长时间!
  • XSSF 返回:“FFFFFFFF”,相同颜色的 HSSF 返回 0:0:0。我到了 HSSF 返回的地步:“FF000000”,但由于自定义调色板(Excel 2003),它仍然是完全不同的值。有什么解决办法吗?其他示例:excel 2007 中的“FFC00000”等于 2003 中的“FF993300”。
  • 如果你在 Excel 97 中打开 .xls 文件,我感觉你会看到那里的颜色不同。可以试试吗?
  • 颜色一模一样。我创建了带有主题和标准颜色的 .xlsx 文件并将其保存为 .xls ,它们在那里具有不同的十六进制值。与创建 .xls 并将其保存到 .xlsx 以及分别创建 .xls 和 .xlsx 相同。
猜你喜欢
  • 2010-11-03
  • 2013-12-24
  • 1970-01-01
  • 2011-09-02
  • 2011-06-16
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多