我有一个使用apache poi读取xls表的应用程序。当单元格具有数值时,我通过row.getCell(i).getNumericValue()进行读取。但是它返回浮点数。像如果单元格值为1,则返回1.0。我可以将其转换为int吗?任何帮助,将不胜感激。我尝试了Integer.parseInt(value)-,但是它抛出NumberFormat异常。感谢您的帮助。以下是伪代码:
FileInputStream file = new FileInputStream(new File("C:\\test.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(file);
HSSFSheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.iterator();
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch(cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
String value= String.valueOf(cell.getNumericCellValue());
int intVal = Integer.parseInt(value)-->>throws Exception
您可以通过简单的步骤将int值读取为字符串apache poi
首先使用以下方法计算工作表中的行
private int getRowCount(Sheet currentSheet) {
int rowCount = 0;
Iterator<Row> rowIterator = currentSheet.iterator();
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
if(row == null || row.getCell(0) == null || row.getCell(0).getStringCellValue().trim().equals("") || row.getCell(0).toString().trim().equals("")
|| row.getCell(0).getCellType()==Cell.CELL_TYPE_BLANK){
break;
}
else
rowCount=rowCount + 1;
}
return rowCount;
}
然后在您的方法中使用下面的代码
Workbook workbook = WorkbookFactory.create(new File("c:/test.xls");
Sheet marksSheet = (Sheet) workbook.getSheet("Sheet1");
int zoneLastCount = 0;
if(marksSheet !=null ) {
zoneLastCount = getRowCount(marksSheet);
}
int zone = zoneLastCount-1;
int column=1
for(int i = 0; i < zone; i++) {
Row currentrow = marksSheet.getRow(i);
double year = Double.parseDouble(currentrow.getCell(columnno).toString());
int year1 = (int)year;
String str = String.valueOf(year1);
}
Excel中的数字(少数情况除外)存储为浮点数。如您所见,Java中的浮点数在格式化为字符串时,会打印一个尾随的小数点。
假设您真正想要的是“给我一个看起来像Excel为该单元格显示的字符串”,然后不要
调用cell.toString()。在大多数情况下,这不会给您想要的东西相反,您需要使用DataFormatter class,它提供的方法可以读取应用于单元格的Excel格式规则,然后(尽可能)重新创建Java中的格式规则
您的代码应为:
Workbook wb = WorkbookFactory.create(new File("c:/test.xls"); DataFormatter fmt = new DataFormatter(); Sheet sheet = wb.getSheetAt(0); for (Row row : sheet) { Cell cell = row.getcell(0, Row.RETURN_BLANK_AS_NULL); if(cell!=null) { String value = fmt.formatCellValue(cell); if (! value.trim().isEmpty()) { System.out.println("Cell as string is " + value); } } }
您可能会注意到我也修复了很多其他东西。...!
某人可能会发现此黑客有用:
您可以只将float
强制转换为int
:
Cell cell = row.getCell(cellCpt);
String cellContent = "";
if (cell != null) {
cell.setCellType(CellType.STRING);
cellContent = fmt.formatCellValue(cell);
}
尝试执行以下操作(以获得较长的时间:):
// to extract the exact numerical value either integer/double
DataFormatter fmt = new DataFormatter();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
//DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
fetchedRow.add(dateFormat.format(date));
} else {
fetchedRow.add(fmt.formatCellValue(cell));
}
rowEmpty = false;
break;
case STRING:
fetchedRow.add(cell.toString());
rowEmpty = false;
break;
case BOOLEAN:
fetchedRow.add(cell.toString());
rowEmpty = false;
break;
case FORMULA:
fetchedRow.add(Double.toString(cell.getNumericCellValue()));
rowEmpty = false;
break;
case BLANK:
fetchedRow.add("");
break;
}
}
if (!rowEmpty) {
allRows.add(fetchedRow.toArray(new String[0]));
count++;
}
if (count >= limit) {
break;
}
}
return allRows;