Apache POI - Даты разбора с HSSFListener - PullRequest
       112

Apache POI - Даты разбора с HSSFListener

0 голосов
/ 05 августа 2020

Во-первых, я работаю над использованием Apache API событий POI с использованием HSSFListener и XSSFSheetXMLHandler.SheetContentsHandler для чтения больших файлов. Так что я не использую рабочую тетрадь, в которой могу использовать некоторые из удобных методов. Я уже реализовал это с этим подходом и получил ошибки OOM.

Для файлов XLS у меня возникли проблемы с выяснением того, как определить из NumberRecord, является ли формат форматом даты или числовым форматом. Я просмотрел эту старую ссылку ( Используя Apache POI HSSFListener, как определить тип даты ), но работает только ссылка 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 быть.

Мысли? Очень признателен. Документация в некотором роде есть, но разобраться с ней "весело".

1 Ответ

0 голосов
/ 07 августа 2020

Если у кого-то еще есть проблемы с этим, я проработал это с помощью ссылки 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...