【问题标题】:Apache POI - Parsing Dates with HSSFListenerApache POI - 使用 HSSFListener 解析日期
【发布时间】:2020-08-05 20:41:27
【问题描述】:

首先,我正在使用 Apache POI 的事件 API 使用 HSSFListener 和 XSSFSheetXMLHandler.SheetContentsHandler 来读取大文件。所以我没有使用可以使用一些方便方法的工作簿。我已经用这种方法实现了它,但遇到了 OOM 错误。

对于 XLS 文件,我无法确定如何从 NumberRecord 确定格式是日期格式还是数字格式。我查看了这个旧链接 (Using Apache POI HSSFListener how to identify date type),但只有 Tika 链接有效,因为另一个链接不再存在。似乎有些修改可以与 FormatTrackingHSSFListener 一起使用,但我在那里遗漏了一些东西。

我看到有人提到使用 DateUtil 来检查值是否在下面的 InternalDateFormat 中,但这不起作用。

case NumberRecord.sid:
    NumberRecord numrec = (NumberRecord) record;
    if (DateUtil.isInternalDateFormat(numrec.getXFIndex())) {
        System.out.println("Cell found with date value " + DateUtil.getJavaDate(numrec.getValue())
                + " at row " + numrec.getRow() + " and column " + numrec.getColumn());
    } else {
        System.out.println("Cell found with value " + numrec.getValue()
                + " at row " + numrec.getRow() + " and column " + numrec.getColumn());
    }

我想知道 isADateFormat 方法是否可行 (https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/DateUtil.html#isADateFormat-int-java.lang.String-),但我不知道 formatString 会是什么。

想法?非常感激。文档有些在那里,但通过它很“有趣”。

【问题讨论】:

标签: java excel date apache-poi poi-hssf


【解决方案1】:

如果其他人对此有任何疑问,我已经在另一个问题中的 TIKA extractor 链接的帮助下解决了这个问题。我建议实现一个 HSSFListener,它本身有一个 FormatTrackingHSSFListener 作为成员变量。这将是您的初始侦听器并将捕获所有格式(如果我理解正确的话),并且它本身将具有您的实现的子侦听器。

public class YourListener implements HSSFListener {

    private SSTRecord sstRecord;
    private FormatTrackingHSSFListener formatListener;
    private List<String> sheetNames = new ArrayList<>();
    private Integer currentSheetIndex = -1;
    private Integer rowCount = 0;

    public YourListener() {
        this.formatListener = new FormatTrackingHSSFListener(this);
    }
}

当您覆盖 processRecord 时,您的 NumberRecord.sid 开关可以调用 formatListener 的 formatNumberDateCell。所以像:

case NumberRecord.sid: // Contains a numeric cell value
     NumberRecord number = (NumberRecord) record;
     System.out.println(record, formatListener.formatNumberDateCell(number));
     break;

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多