0

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

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

就我而言,我需要 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;
    }

谁能帮我!?

谢谢!

4

1 回答 1

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 的增强发送来帮助下一个人!

于 2012-09-02T07:11:04.200 回答