Java POI - кто-нибудь смог извлечь числа из ячеек формулы? - PullRequest
1 голос
/ 09 февраля 2009

Я уже давно использую Java POI, но столкнулся с новой проблемой, и мне интересно, нашел ли кто-нибудь решение.

Когда вы читаете электронную таблицу, вам нужно знать тип ячейки, чтобы использовать правильный метод чтения.

Таким образом, вы получаете тип ячейки, а затем вызываете соответствующий метод чтения, чтобы получить содержимое ячейки.

Это работает для всех ячеек, кроме ячейки FORMULA, где значением является число. Если это текст, вы можете прочитать его просто отлично. Но если полученное значение является числом, то все, что вы получаете из ячейки, это пустая строка.

Я прошел через javadocs для POI и использую правильный тип данных (HSSFRichTextString), но все равно не радуюсь.

У кого-нибудь есть решение?

P.S. это поведение POI меня действительно беспокоит, так как должен существовать метод cell.toString () по умолчанию, который возвращал бы строковое представление ЛЮБОГО типа ячейки, скажем, по умолчанию для свойства value ячейки. (что-то вроде специальной вставки, где вы можете выбрать «значение»).

PPS: как и спрашивалось - я использую Java 6 (1.6.0_06) и poi-3.0.2-FINAL-20080204.jar

Ответы [ 4 ]

3 голосов
/ 09 февраля 2009
 FileInputStream fis = new FileInputStream("c:/temp/test.xls");
    Workbook wb = new HSSFWorkbook(fis); //or new XSSFWorkbook("c:/temp/test.xls")
    Sheet sheet = wb.getSheetAt(0);
    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

    // suppose your formula is in B3
    CellReference cellReference = new CellReference("B3"); 
    Row row = sheet.getRow(cellReference.getRow());
    Cell cell = row.getCell(cellReference.getCol()); 

    CellValue cellValue = evaluator.evaluate(cell);

    switch (cellValue.getCellType()) {
        case Cell.CELL_TYPE_BOOLEAN:
            System.out.println(cellValue.getBooleanValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            System.out.println(cellValue.getNumberValue());
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println(cellValue.getStringValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_ERROR:
            break;

        // CELL_TYPE_FORMULA will never happen
        case Cell.CELL_TYPE_FORMULA: 
            break;
    }

Скопировано беззастенчиво из здесь

2 голосов
/ 12 декабря 2010

Просто конвертируйте эту ячейку в текст ... используя copy- "paste special" ... Я сделал это следующим образом ...

Чтение из пункта № 2 по адресу:

http://www.asif -shahzad.com / 2010/12 / как для чтения-номера-как-струнной-ценностного in.html

1 голос
/ 13 августа 2012

Альтернативой использованию createFormulaEvaluator является использование SetCellType (CellType.STRING), а затем доступ к StringCellValue. Я столкнулся с проблемами при использовании формулы формулы (используя NPOI), когда она содержит функцию WORKDAY ().

1 голос
/ 09 февраля 2009

Если POI не работает для вас, попробуйте JExcel Энди Кхана . Я предпочитаю это.

...