Как читать реальные числовые значения вместо форматированного значения с помощью API потоковой передачи POI Apache XSSF? - PullRequest
0 голосов
/ 29 мая 2018

Я использую API потокового POI и хотел бы прочитать реальное значение ячейки вместо отформатированной.Мой код, который приведен ниже, работает нормально, но если пользователь не отображает все цифры значения на листе Excel, который читается моим кодом, я получаю такое же усеченное значение в моем результате.Я не нашел никакого решения в API потоковой передачи - что необходимо в моем случае для решения проблемы с памятью, которая у меня была при использовании API POI без потоковой передачи.

    /**
     * @see org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler cell(java.lang.String,
     *      java.lang.String)
     */
    @Override
    void cell(String cellReference, String formattedValue, XSSFComment comment) { 
       useTheCellValue(formattedValue) 
    }

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Если вы создаете XSSFSheetXMLHandler , вы можете предоставить DataFormatter .Поэтому, если вы создаете свой собственный DataFormatter, этот DataFormatter может дать вам полный доступ к проблемам форматирования.

Пример того, как это может выглядеть, изменив public void processSheet из примера XLSX2CSVв свн :

...
public void processSheet(
        StylesTable styles,
        ReadOnlySharedStringsTable strings,
        SheetContentsHandler sheetHandler, 
        InputStream sheetInputStream) throws IOException, SAXException {
    //DataFormatter formatter = new DataFormatter();
    DataFormatter formatter = new DataFormatter(java.util.Locale.US) {
        //do never formatting double values but do formatting dates
        public java.lang.String formatRawCellContents(double value, int formatIndex, java.lang.String formatString) {
            if (org.apache.poi.ss.usermodel.DateUtil.isADateFormat(formatIndex, formatString)) {
                return super.formatRawCellContents(value, formatIndex, formatString);
            } else {
                //return java.lang.String.valueOf(value);
                return super.formatRawCellContents(value, 0, "General");
            }
        }
    };
    InputSource sheetSource = new InputSource(sheetInputStream);
    try {
        XMLReader sheetParser = SAXHelper.newXMLReader();
        ContentHandler handler = new XSSFSheetXMLHandler(
              styles, null, strings, sheetHandler, formatter, false);
        sheetParser.setContentHandler(handler);
        sheetParser.parse(sheetSource);
     } catch(ParserConfigurationException e) {
        throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());
     }
}
...
0 голосов
/ 29 мая 2018

Я видел тикет на POI об этом пункте: https://bz.apache.org/bugzilla/show_bug.cgi?id=61858

Он предоставляет первое решение путем изменения существующего класса.

Это может быть интересным решением, даже если идеальным решением будет использование стандартного.

...