【问题标题】:get cell background color in poi event在 poi 事件中获取单元格背景颜色
【发布时间】:2012-08-30 12:46:26
【问题描述】:

我使用 POI 事件导入了一个非常大的 Excel。我得到了所有的内容,但没有单元格的背景颜色!

我尝试了 ExtendedFormatRecords(如 here 所述),但我无法确定哪个是具有行号和列号信息的前一个单元格!

就我而言,我需要 NumberRecords 的颜色!

我是这样尝试的:

    switch (record.getSid()) {
    case BOFRecord.sid:
        break;
    case BoundSheetRecord.sid:
        BoundSheetRecord bsr = (BoundSheetRecord) record;
        System.out.println("New sheet named: " + bsr.getSheetname());
        break;
    case RowRecord.sid:
        break;
    case NumberRecord.sid: // Contains a numeric cell value
        NumberRecord numrec = (NumberRecord) record;
        row = numrec.getRow();
        col = numrec.getColumn();
        //Do something
        break;
    case ExtendedFormatRecord.sid:
        ExtendedFormatRecord efr = (ExtendedFormatRecord) record;
        if (previousSid == NumberRecord.sid) {
            // row = previousRecord.getRow();
            // col = previousRecord.getColumn();
            // System.out.println("row: " + row + " column: " + col);
            System.out.println("ExtendedFormat "+efr.getFillForeground() + "");
        } else {
            System.out.println("ops! not that");
        }
        break;
        //other cases
        ...
    }//end switch
    previousSid = record.getSid();
    if (previousRecord != record) {
        previousRecord = null;
    }

谁能帮帮我!?

谢谢!

【问题讨论】:

标签: java excel apache-poi


【解决方案1】:

在我们深入细节之前,我认为有两段代码您应该看一下。第一个是 Apache POI 的一部分,在处理作为 EventUserModel 的一部分的 Excel 文件时处理跟踪格式和样式 - FormatTrackingHSSFListener。其次,Apache Tika 的一部分是使用它在事件处理中对单元格进行即时格式化的示例 - ExcelExtractor

您想做的事情应该是可能的,但需要做一些工作。幸运的是,Excel 中的格式和样式信息是工作簿信息的一部分,而不是工作表信息的一部分,所以它是第一位的。您需要做的是在第一次访问这些记录时缓存它们,以便在单元格经过时可以使用它们。

其次,您应该查看 POI UserModel 代码,并了解它如何与记录一起处理颜色和格式设置。虽然您不能使用这些类,但您很可能可以从它们中借用一些关键的 sn-ps 代码用于您自己的类来实现相同的东西。

您要做的是使用 FormatTrackingHSSFListener 获取可用的 ExtendedFormatRecords,然后查找遇到的每个单元格的记录。在 XFR 上,您会发现各种与颜色相关的细节。有填充前景色和背景色、边框和字体。接下来,当您获得 PaletteRecord 时,保留它,并将其包装在 UserModel HSSFPalette 类中。然后,您可以使用它根据 XFR 的索引获取颜色。您还应该捕获 FontRecords,这样您就可以从 XFR 上的索引中查找它们,并且从 FontRecord 中您可以获得颜色索引,在 HSSFPalette 上查找它就完成了!

最后,如果您确实可以使用,请考虑将其作为 Apache POI 的增强功能发送以帮助下一个人!

【讨论】:

  • 非常感谢!有效。诀窍是了解 ExtendedFormatRecord 是工作簿的一部分,以及如何将其链接到后面的单元格!我无法访问 HSSFPalete 构造函数,因此重新创建了具有不同名称 (ExcelPalette) 但内容相同的类。
  • 如果还有人需要,我把之前的代码改成:case PaletteRecord.sid: palette = new ExcelPalette((PaletteRecord) record);break; case ExtendedFormatRecord.sid: ExtendedFormatRecord xfr = (ExtendedFormatRecord) record; _xfRecords.add(xfr); break; case NumberRecord.sid: // Contains a numeric cell value NumberRecord numrec = (NumberRecord) record; ExtendedFormatRecord xfr = _xfRecords.get(numrec.getXFIndex()); if (xfr != null) { HSSFColor color = palette.getColor(xfr.getFillForeground()); if (color != null) short[] rgb = color.getTriplet(); ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多