row.getCell(cellNum++);本是String,自动转为了double
时间: 2024-03-01 19:55:38 浏览: 100
这是因为Excel表格中的单元格可能包含数字或者文本。当你使用getCell方法获取单元格的时候,它会自动根据单元格内容的类型返回不同的数据类型。如果单元格内容是数字,它会返回double类型的数据,如果单元格内容是文本,它会返回String类型的数据。
如果你想要获取单元格的String类型的数据,可以使用以下代码:
```
Cell cell = row.getCell(cellNum++);
String cellValue = cell.getStringCellValue();
```
这样就可以保证获取到的始终是String类型的数据了。
相关问题
for (ProfessionalDAO p:v.getProfessional()) { row = sheet.getRow(beginRow + p.getProfessionalNumber() - 1); fillVoluntaryDataProfession(xssfWorkbook, sheet, row.getCell(professionColumn), p.getProfessionalCode(), professionColumn); fillVoluntaryDataProfession(xssfWorkbook, sheet, row.getCell(professionColumn + 1), p.getProfessionalName(), professionColumn + 1); //fillVoluntaryData(xssfWorkbook, sheet, row.createCell(professionColumn ++), p.getProfessionalName(),columnIndex-1,beginRow, professionColumn+1); //把专业组名称改为定长 }详细解释代码
这是一段Java代码,主要是对Excel表格进行操作。该代码使用了foreach循环,遍历了一个类型为ProfessionalDAO的List对象v中的所有元素,并对每个元素进行操作。
具体来说,代码首先通过p.getProfessionalNumber()方法获取专业的序号,然后计算出该专业在Excel表格中的行数,并使用这个行数获取到该专业在表格中对应的行对象row。
接下来,代码调用fillVoluntaryDataProfession()方法,将专业代码和专业名称填入表格中。该方法的第一个参数是XSSFWorkbook对象,表示要操作的Excel文件;第二个参数是要填入数据的Sheet对象;第三个参数是要填入数据的单元格对象;第四个参数是要填入的数据;第五个参数是要填入数据的列数。
最后,代码将专业组名称改为定长,具体实现未给出。
private static List<String> readExcelFile() { List<String> datas = new ArrayList<>(); try (FileInputStream inputStream = new FileInputStream("/sdcard/Template/IC1001.xlsx"); Workbook workbook = WorkbookFactory.create(inputStream)) { // 获取第一个 Sheet Sheet sheet = workbook.getSheetAt(4); // 遍历 Sheet 中的每一行和每一列 Iterator<Row> rowIterator = sheet.rowIterator(); while (rowIterator.hasNext()) { ImportViewModel importViewModel = new ImportViewModel(); Row row = rowIterator.next(); while (rowIterator.hasNext()) { for (int i = 0; i < datas.size(); i+=4) { importViewModel.setName("商品名称:" + row.getCell(i).getStringCellValue()); importViewModel.setType("商品名称:" + row.getCell(i+1).getStringCellValue()); importViewModel.setStyle("商品名称:" + row.getCell(i+2).getStringCellValue()); importViewModel.setInventoryNum("预期应有库存:" + row.getCell(i+3).getStringCellValue()); } } workbook.close(); inputStream.close(); } } catch (IOException | InvalidFormatException e) { e.printStackTrace(); } return datas; }有什么问题,怎么修改
这段代码有以下几个问题:
1. 在 while 循环外部关闭 Workbook 和 FileInputStream,应该在 finally 中关闭,以确保资源能够被正确释放。
2. 在第二个 while 循环中,应该使用 columnIterator 来遍历每一列,而不是使用一个 for 循环来遍历 datas 列表。
3. 在设置 ImportViewModel 的属性时,属性名写错了,应该是 name、type、style、inventoryNum,而不是多次写商品名称。
下面是修改后的代码:
```
private static List<ImportViewModel> readExcelFile() {
List<ImportViewModel> datas = new ArrayList<>();
FileInputStream inputStream = null;
Workbook workbook = null;
try {
inputStream = new FileInputStream("/sdcard/Template/IC1001.xlsx");
workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(4);
Iterator<Row> rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
ImportViewModel importViewModel = new ImportViewModel();
Iterator<Cell> columnIterator = row.cellIterator();
while (columnIterator.hasNext()) {
importViewModel.setName("商品名称:" + columnIterator.next().getStringCellValue());
importViewModel.setType("商品类型:" + columnIterator.next().getStringCellValue());
importViewModel.setStyle("商品款式:" + columnIterator.next().getStringCellValue());
importViewModel.setInventoryNum("预期应有库存:" + columnIterator.next().getStringCellValue());
datas.add(importViewModel);
}
}
} catch (IOException | InvalidFormatException e) {
e.printStackTrace();
} finally {
try {
if (workbook != null) {
workbook.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return datas;
}
```
阅读全文