在poi事件中获取细胞背景颜色

时间:2012-08-30 12:46:27

标签: java excel apache-poi

我使用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;
    }

任何人都可以帮助我!?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

你想做什么应该是可能的,但它需要一点工作。幸运的是,Excel中的格式和样式信息是工作簿信息的一部分,而不是工作表信息的一部分,因此它首先出现。你需要做的是在你第一次到达它们时缓存这些记录,这样你就可以在细胞过去时使用它们。

其次,您应该查看POI UserModel代码,并查看它如何与记录一起处理颜色和格式。虽然你不能使用这些类,但你很可能从它们那里借用一些代码片段来为你自己的类实现同样的东西。

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

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