Невозможно прочитать числовое значение Excel с помощью Apache POI [duplicate]

В дополнение к ответу @ Khanetor для тех, кто работает с запросами на перекрестный поиск: credentials: 'include'

Пример запроса выборки JSON:

fetch(url, {
  method: 'GET',
  credentials: 'include'
})
  .then((response) => response.json())
  .then((json) => {
    console.log('Gotcha');
  }).catch((err) => {
    console.log(err);
});

https : //developer.mozilla.org/en-US/docs/Web/API/Request/credentials

21
задан crstamps2 28 June 2011 в 18:50
поделиться

7 ответов

Вы можете получить значение как String, используя формат, определенный для этой ячейки:

final DataFormatter df = new DataFormatter();
final XSSFCell cell = row.getCell(cellIndex);
String valueAsString = df.formatCellValue(cell);

Благодаря этот ответ .

23
ответ дан Community 19 August 2018 в 11:37
поделиться
  • 1
    спасибо, это работало как шарм для меня! – eugene.polschikov 25 April 2016 в 17:53

Я также получил эту ошибку с POI версии 3.12. Я думаю, что ошибка зарегистрирована там: https://bz.apache.org/bugzilla/show_bug.cgi?id=56702 , и я добавил комментарий там с моим анализом.

Вот обходной путь, который я использовал: Исключение было поднято HSSFCell.getNumericCellValue, которое было вызвано DateUtil.isCellDateFormatted. DateUtil.isCellDateFormatted делает 2 вещи: 1) проверьте тип значения ячейки, вызвав HSSFCell.getNumericCellValue, а затем DateUtil.isValidExcelDate (), что, по-моему, почти бессмысленно. 2) проверьте, является ли формат ячейки форматом даты

Я скопировал код раздела 2) выше в новой функции «myIsADateFormat» и использовал его вместо DateUtil.isCellDateFormatted (это довольно грязно копировать библиотечный код, но он работает ...):

private boolean myIsADateFormat(Cell cell){
    CellStyle style = cell.getCellStyle();
    if(style == null) return false;
    int formatNo = style.getDataFormat();
    String formatString = style.getDataFormatString();
    boolean result = DateUtil.isADateFormat(formatNo, formatString);
    return result;
}

Если вам нужно сначала проверить тип значения, вы также можете использовать это:

CellValue cellValue = evaluator.evaluate(cell);
int cellValueType = cellValue.getCellType();
if(cellValueType == Cell.CELL_TYPE_NUMERIC){
    if(myIsADateFormat(cell){
        ....
    }
}
2
ответ дан Herve 19 August 2018 в 11:37
поделиться

Решение Рави работает: просто используйте cell.setCellType (1); перед чтением значения ячейки и всегда получать ее как строку, после чего вы можете использовать ее в своем собственном формате (тип).

0
ответ дан JavaLover 19 August 2018 в 11:37
поделиться

Документация ясно говорит, что вместо setCellType в 1 вместо 1 использовать DataFormatter, как объяснил Тьерри:

https://poi.apache.org/apidocs/org/apache/poi/ss /usermodel/Cell.html#setCellType(int)

1
ответ дан Jobin Thomas 19 August 2018 в 11:37
поделиться
Use This as reference

switch (cell.getCellType()) {
                case Cell.CELL_TYPE_STRING:
                    System.out.println(cell.getRichStringCellValue().getString());
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        System.out.println(cell.getDateCellValue());
                    } else {
                        System.out.println(cell.getNumericCellValue());
                    }
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    System.out.println(cell.getBooleanCellValue());
                    break;
                case Cell.CELL_TYPE_FORMULA:
                    System.out.println(cell.getCellFormula());
                    break;
                default:
                    System.out.println();
            }
52
ответ дан Mayank 19 August 2018 в 11:37
поделиться
  • 1
    Спасибо, но дела должны быть XSSFCell.CELL_TYPE_... – No Idea For Name 25 June 2015 в 07:45
  • 2
    @Mayank Добавьте листинг в System.out.println (cell.getNumericCellValue ()); для получения целочисленного значения, потому что оператор avove возвращает double. Поэтому правильным ответом для значения interger является System.out.println ((int) cell.getNumericCellValue ()); – Rahul Ranjan 26 July 2015 в 07:14
  • 3
    @Mayank Преобразует RichStringCellValue в обычную строку, используя toString (), чтобы получить строковое значение, которое может быть сохранено в строковой переменной. Таким образом, ответом будет System.out.println (cell.getRichStringCellValue (). GetString (). ToString ()); – Rahul Ranjan 26 July 2015 в 07:15

Используйте приведенный ниже код для чтения любого типа данных из xcels с помощью poi.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 *
 * @author nirmal
 */
public class ReadWriteExcel {

    public static void main(String ar[]) {
        ReadWriteExcel rw = new ReadWriteExcel();
        rw.readDataFromExcel();

    }
    Object[][] data = null;

    public File getFile() throws FileNotFoundException {
        File here = new File("test/com/javaant/ssg/tests/test/data.xlsx");
        return new File(here.getAbsolutePath());

    }

    public Object[][] readDataFromExcel() {
        final DataFormatter df = new DataFormatter();
        try {

            FileInputStream file = new FileInputStream(getFile());
            //Create Workbook instance holding reference to .xlsx file
            XSSFWorkbook workbook = new XSSFWorkbook(file);

            //Get first/desired sheet from the workbook
            XSSFSheet sheet = workbook.getSheetAt(0);

            //Iterate through each rows one by one
            Iterator<Row> rowIterator = sheet.iterator();

            int rownum = 0;
            int colnum = 0;
            Row r=rowIterator.next();

            int rowcount=sheet.getLastRowNum();
            int colcount=r.getPhysicalNumberOfCells();
            data = new Object[rowcount][colcount];
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();

                //For each row, iterate through all the columns
                Iterator<Cell> cellIterator = row.cellIterator();
                colnum = 0;
                while (cellIterator.hasNext()) {

                    Cell cell = cellIterator.next();
                    //Check the cell type and format accordingly
                    data[rownum][colnum] =  df.formatCellValue(cell);
                    System.out.print(df.formatCellValue(cell));
                    colnum++;
                    System.out.println("-");
                }
                rownum++;
                System.out.println("");
            }
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }
}
3
ответ дан Nirmal Dhara 19 August 2018 в 11:37
поделиться

Просто используйте cell.setCellType (1); перед чтением значения ячейки и всегда получать его как String, после чего вы можете использовать его в своем собственном формате (тип).

Ravi

21
ответ дан user 19 August 2018 в 11:37
поделиться
  • 1
    Это не рекомендуется, так как он потеряет всю информацию форматирования ячейки – Gagravarr 18 September 2014 в 13:08
  • 2
    «Я думаю», что это может привести к тому, что он не будет давать поля дат совершенно так, как вам может их захотеть ... что-то, о чем нужно помнить, если это проблема. – BVernon 28 July 2015 в 19:51
Другие вопросы по тегам:

Похожие вопросы: