Серверная часть Java, чтобы избежать ям - числовой тип преобразуется в целочисленный тип

Java

Jakarta POI — это набор API-интерфейсов Java для доступа к документам в формате Microsoft. Jakarta POI состоит из множества компонентов, в том числе HSSF для работы с файлами формата Excel. При использовании POI для импорта таблицы Excel мы часто сталкиваемся с проблемой преобразования формата. Сегодня при импорте листа Excel в проект произошла следующая ошибка:

2019-04-24 22:06:06.799 ERROR 7248 --- [io-8082-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell] with root cause java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell

В начале для числа в таблице Excel был установлен тип String, и об указанной выше ошибке сообщалось после импорта таблицы Excel во внешнем интерфейсе, поэтому число было изменено на числовой тип, но при возникновении проблемы преобразования типа, компилятор дал следующую подсказку:

После поиска в Интернете Baidu знает, что небольшой партнер предложил следующие идеи:

cell.getNumericCellValue() возвращает двойной
Integer.parseInt может конвертировать только строку
Вы можете заставить формат ячейки быть String
cell.setCellType(1);//Установить в строку
String str_temp = cell.getStringCellValue().trim();//Получить значение
Целое число a = Integer.parseInt(strtemp);//преобразование

Поэтому модификация сделана в соответствии с этой идеей для решения проблемы сообщения об ошибках.Измененный код выглядит следующим образом

Правильный пример программы выглядит следующим образом:

public static List<JObLevel> parseFile2list(MultipartFile file) throws IOException{
    List<JObLevel> jObLevels = new ArrayList<>();
    //创建文档对象
    HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream());
    //创建excel的表单
    HSSFSheet sheet = workbook.getSheetAt(0);
    int physicalNumberofRows = sheet.getPhysicalNumberOfRows();
    for (int i = 1;i < physicalNumberofRows;i++){
    HSSFRow row = sheet.getRow(i);
    HSSFCell c0 = row.getCell(0);
    double numericCellValue = c0.getNumericCellValue();//返回double
    JObLevel jl = new JObLevel();
    c0.setCellType(CellType.STRING);//设置为String
    String str_temp = c0.getStringCellValue();//得到值
    Integer int_temp = Integer.parseInt(str_temp);//转换
    jl.setId(int_temp);
    }
    return jObLevels;
}

Хотя ошибка была решена, я всегда чувствую, что это не лучшее решение, потому что очень проблематично сначала получить значение типа String, а затем преобразовать его. Поэтому, посоветовавшись с окружающими меня коллегами, я использую метод принудительного преобразования типов и напрямую преобразовываю его в тип int.

Примерная программа выглядит следующим образом:

public static List<JObLevel> parseFile2list(MultipartFile file) throws IOException{
    List<JObLevel> jObLevels = new ArrayList<>();
    //创建文档对象
    HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream());
    //创建excel的表单
    HSSFSheet sheet = workbook.getSheetAt(0);
    int physicalNumberofRows = sheet.getPhysicalNumberOfRows();
    for (int i = 1;i < physicalNumberofRows;i++){
    HSSFRow row = sheet.getRow(i);
    HSSFCell c0 = row.getCell(0);
    double numericCellValue = c0.getNumericCellValue();//返回double
    JObLevel jl = new JObLevel();
    jl.setId((int)numericCellValue);
    }
    return jObLevels;
}

Напротив, приведенное ниже преобразование типа принуждения намного короче и может быть выполнено одной строкой кода!

Сложите, бросьте воду сквозь камень!