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;
}
Напротив, приведенное ниже преобразование типа принуждения намного короче и может быть выполнено одной строкой кода!
Сложите, бросьте воду сквозь камень!