POI 在从 excel 读取数字数据时附加 .0
Posted
技术标签:
【中文标题】POI 在从 excel 读取数字数据时附加 .0【英文标题】:POI Appending .0 while reading numeric data from excel 【发布时间】:2012-09-29 19:40:46 【问题描述】:我正在使用 POI HSSF 读取 excel 数据,我正在使用 JUnit 对照数据库 proc RefCursor 检查数据。
Junit 测试失败,因为来自 Refcursor 的数字数据(例如 100)与 Excel 表 100 中的数据进行比较,但它失败,因为 POI 将其读取为 100.0。
InputStream fileInputStream = Testdb.class.getClassLoader().getResourceAsStream(fileName);
//retrieve number of columns and rows
int numRows=0, numCols=0, i, j, minColIndex=0, maxColIndex=0;
POIFSFileSystem fsFileSystem = new POIFSFileSystem(fileInputStream);
HSSFWorkbook workBook = new HSSFWorkbook(fsFileSystem);
HSSFSheet hssfSheet = workBook.getSheetAt(0);
Iterator rowIterator = hssfSheet.rowIterator();
while (rowIterator.hasNext())
numRows++;
HSSFRow hssfRow = (HSSFRow) rowIterator.next();
Iterator iterator = hssfRow.cellIterator();
List cellTempList = new ArrayList();
if (numRows == 1)
minColIndex = hssfRow.getFirstCellNum();
maxColIndex = hssfRow.getLastCellNum();
numCols = maxColIndex;
for(int colIndex = minColIndex; colIndex < maxColIndex; colIndex++)
HSSFCell hssfCell = hssfRow.getCell(colIndex);
cellTempList.add(hssfCell);
cellDataList.add(cellTempList);
String expected[][] = new String[numRows][numCols];
String[] tableColumns = new String[numCols];
System.out.println("Rows : " + numRows + "Columns : " + numCols);
System.out.println("Min Col Index : " +minColIndex + "Max Col Index : " + maxColIndex);
for (i=0; i<numRows; i++)
List cellTempList = (List) cellDataList.get(i);
for (j=0; j < numCols; j++)
HSSFCell hssfCell = (HSSFCell) cellTempList.get(j);
if (i == 0)
tableColumns[j] = hssfCell.toString();
System.out.print(tableColumns[j] + "\t");
else
if(hssfCell != null)
expected[i-1][j] = hssfCell.toString();
else
expected[i-1][j] = null;
System.out.print(expected[i-1][j] + "\t");
System.out.println();
这是我正在构建的通用框架程序,因此该框架应该足够智能以忽略“.0”。 有关如何解决此问题的任何意见?
【问题讨论】:
不要将所有内容都视为字符串。使用最合适的类型,例如BigDecimal,整数。 excel数据不会是特定于表格的,它可能包含任何引用的数据,因此无法预先确定列的内容和数据类型。上网的时候发现可以用DataFormatter解决这个问题,但是不知道这里需要做什么。 一个足够聪明的系统知道应该忽略带有尾随“.0”的字符串听起来并不聪明,它听起来很糟糕:) 我对 Junit 和 POI 还很陌生,我可以使程序足够聪明,但这会涉及合并逻辑,这会使程序变得复杂,我不想重新发明***以防万一如果 POI 中已经存在为我们执行此操作的功能。 returning decimal instead of string (POI jar) 的可能重复项 【参考方案1】:这与此处的许多其他问题几乎相同,例如returning decimal instead of string (POI jar)
答案同one I gave here:
POI 为您提供 Excel 存储在文件中的确切值。通常,如果您在 Excel 单元格中写入数字,Excel 会将其存储为带格式的数字。如果您愿意,POI 支持为您进行格式化(大多数人不这样做 - 他们希望将数字作为数字,以便他们可以使用它们)
您要查找的课程是DataFormatter。您的代码将类似于
DataFormatter fmt = new DataFormatter();
for (Row r : sheet)
for (Cell c : r)
CellReference cr = new CellRefence(c);
System.out.println("Cell " + cr.formatAsString() + " is " +
fmt.formatCellValue(c) );
【讨论】:
【参考方案2】:您好,我的解决方案是添加符号:
'
在每个数字前面。然后将数字作为文本处理。
执行此操作后,您会看到小绿色三角形和警告:
对我来说这不是问题,因为它有效。
【讨论】:
以上是关于POI 在从 excel 读取数字数据时附加 .0的主要内容,如果未能解决你的问题,请参考以下文章