Java Apache POI的getCachedFormulaResultType()返回不正确的类型
我正在看一张Excel表格。最初(在rowid 30之前),我得到的是公式单元格的正确(单元格类型\字符串)结果类型,但从第id 31行开始,我收到的结果类型不正确(单元格类型\数值) 请参阅下面的日志:我使用了Java Apache POI的getCachedFormulaResultType()返回不正确的类型,java,excel,apache-poi,Java,Excel,Apache Poi,我正在看一张Excel表格。最初(在rowid 30之前),我得到的是公式单元格的正确(单元格类型\字符串)结果类型,但从第id 31行开始,我收到的结果类型不正确(单元格类型\数值) 请参阅下面的日志:我使用了==作为分隔符来分隔每一行的日志。第1列是焦点,其中对于rowID=30,我获取类型=String,而对于rowID=31,我获取类型=Numeric,但每行的第1列是String类型,因此我缺少如何获取字符串值 请查看日志对应行的Excel工作表内容 switch (c
==
作为分隔符来分隔每一行的日志。第1列是焦点,其中对于rowID=30,我获取类型=String,而对于rowID=31,我获取类型=Numeric,但每行的第1列是String类型,因此我缺少如何获取字符串值
请查看日志对应行的Excel工作表内容
switch (cell.getCellType()) {
case Cell.CELL_TYPE_FORMULA:
cellWrapper.setCellValueFarmula(true);
switch (cell.getCachedFormulaResultType()) {
case Cell.CELL_TYPE_NUMERIC:
cellValue = String.valueOf(cell.getNumericCellValue());
logged.append("CELL_TYPE_FORMULA->CELL_TYPE_NUMERIC");
break;
case Cell.CELL_TYPE_STRING:
cellValue = "" + cell.getRichStringCellValue();
logged.append("CELL_TYPE_FORMULA->CELL_TYPE_STRING");
break;
case Cell.CELL_TYPE_BOOLEAN:
cellValue = "" + cell.getBooleanCellValue();
logged.append("CELL_TYPE_FORMULA->CELL_TYPE_BOOLEAN");
break;
case Cell.CELL_TYPE_ERROR:
cellValue = "error! ";
logged.append("CELL_TYPE_FORMULA->CELL_TYPE_ERROR");
break;
default:
cellValue = null;
logged.append("case not captured" + " type fetched = " + cell.getCellType());
break;
}
break;
case Cell.CELL_TYPE_BLANK:
logged.append("CELL_TYPE_BLANK");
cellValue = null;
break;
case Cell.CELL_TYPE_ERROR:
cellValue = "error!";
logged.append("CELL_TYPE_ERROR");
break;
... some for cases below
Excel内容
Col1 Col2 Col3 Col4
[ACTIVE] - 21 - 1A - CALDRA - 305 . {Chitra Subramaniam - 9538924280}, {deepakag@yahoo.com} 12 Rs. 1,000
[ACTIVE] - 22 - 1A - CALDRA - 306 . {Parasad Parigi - 9538924280}, {deepakag@yahoo.com} 25 Rs. 1,000
[SEALED] - 23 - 1A - CALDRA - 401 . {Vivek - 9538924280}, {deepakag@yahoo.com} <empty cell> Rs. 1,075
那么,如何检索单元格结果值,即使该值是数字?
是否有一种通用方法可以以字符串形式给出结果值,而不管单元格的类型是什么?Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!) 如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:
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) );
}
}
Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!) 如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:
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) );
}
}
Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!) 如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:
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) );
}
}
Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!) 如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:
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) );
}
}
你试过数据格式化程序吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。你能再详细解释一下吗?你试过DataFormatter吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。你能再详细解释一下吗?你试过DataFormatter吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。你能再详细解释一下吗?你试过DataFormatter吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。请您再详细解释一下。POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为单元格的适当格式。尽管我通过在excel工作表中显式选择列并将其类型设置为文本来解决了此问题(前面是指向数值的),但我也会尝试这种方法。如果您有字符串,请给POI字符串。如果您有数字,请给POI数字+可选的格式规则。如果我在字符串变量中存储了一个数值,这正是Excel为您做的。例如
String a=“12”;
,然后POI可以在内部将其转换为数字格式,或者我必须先将其转换为数字格式并将其传递给POI。您需要自己进行转换,而且这样您才能完全控制POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为适当的格式虽然我通过在excel工作表中显式选择列并将其类型设置为text(之前指向数值)解决了这个问题,但我也会尝试这种方法。如果您有字符串,请给POI字符串。如果您有数字,请给POI数字+可选的格式规则。如果我在字符串变量中存储了一个数值,这正是Excel为您所做的。例如String a=“12”;
,然后POI可以在内部将其转换为数字格式,或者我必须先将其转换为数字格式并将其传递给POI。您需要自己进行转换,而且这样您才能完全控制POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为适当的格式虽然我通过在excel工作表中显式选择列并将其类型设置为text(之前指向数值)解决了这个问题,但我也会尝试这种方法。如果您有字符串,请给POI字符串。如果您有数字,请给POI数字+可选的格式规则。如果我在字符串变量中存储了一个数值,这正是Excel为您所做的。例如String a=“12”;
,然后POI可以在内部将其转换为数字格式,或者我必须先将其转换为数字格式并将其传递给POI。您需要自己进行转换,而且这样您才能完全控制POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为适当的格式虽然我通过在excel工作表中显式选择列并将其类型设置为text(之前指向数值)解决了这个问题,但我也将尝试这种方法。如果