Answers:
我有同样的问题。我cell.setCellType(Cell.CELL_TYPE_STRING);
在读取字符串值之前做了此操作,无论用户如何格式化单元格,它都能解决问题。
当您提出问题时,我认为我们没有上过这堂课,但是今天有一个简单的答案。
您要做的是使用DataFormatter类。您将其传递给一个单元格,它会尽力返回一个字符串,其中包含Excel将对该单元格显示的内容。如果将字符串单元格传递给它,则将字符串取回。如果您向其传递一个应用了格式设置规则的数字单元格,它将根据它们格式化数字并返回字符串。
对于您的情况,我假设数字单元格已应用整数格式设置规则。如果您要求DataFormatter格式化这些单元格,它将给您返回其中包含整数字符串的字符串。
另外,请注意,很多人建议这样做cell.setCellType(Cell.CELL_TYPE_STRING)
,但是Apache POI JavaDocs明确指出您不应该这样做!进行setCellType
调用将导致格式设置松散,因为javadocs解释了剩下的格式转换为String的唯一方法是使用DataFormatter类。
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
以下代码适用于任何类型的单元格。
InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();
while(objIterator.hasNext()){
Row row = objIterator.next();
Cell cellValue = row.getCell(0);
objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);
}
getCreationHelper().createFormulaEvaluator()
方法提供了一个公式评估器。这样,您的代码将不会与HSSFFormulaEvaluator类结合使用。
FormulaEvaluator
简单地从该解决方案中删除吗?它有目的吗?
当不希望修改单元格的类型时,我建议使用以下方法:
if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}
NumberToTextConverter可以使用Excel规则将双精度值正确转换为文本,而不会造成精度损失。
如Poi的JavaDocs(https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29)所述,请勿使用:
cell.setCellType(Cell.CELL_TYPE_STRING);
但使用:
DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);
是的,这很完美
推荐的:
DataFormatter dataFormatter = new DataFormatter();
String value = dataFormatter.formatCellValue(cell);
旧:
cell.setCellType(Cell.CELL_TYPE_STRING);
即使您在通过cell
公式检索值时遇到问题,仍然可以使用。
尝试:
new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )
应该正确格式化数字。
2
和2.0
。您的解决方案无法做到这一点。(但仍然欢迎Stack Overflow!)
只要用户输入数字之前该单元格为文本格式,POI便可以让您以字符串形式获取该值。一个关键是,如果单元格的左上角有一个小小的绿色三角形,其格式设置为“文本”,则您将能够以字符串形式检索其值(只要出现数字,该绿色三角形就会出现强制转换为文本格式)。如果您具有包含数字的文本格式的单元格,但是POI不允许您将这些值作为字符串获取,则可以对电子表格数据执行以下操作以允许这样做:
您可以做的最后一件事是,如果使用POI从Excel 2007电子表格中获取数据,则可以使用Cell类的“ getRawValue()”方法。这并不关心格式是什么。它只会返回带有原始数据的字符串。
当我们使用Apache POI库读取MS Excel的数字单元格值时,它会将其读取为数字。但是有时候我们希望它读为字符串(例如电话号码等)。这是我的方法:
用第一个单元格= CONCATENATE(“!”,D2)插入新列。我假设D2是您的电话号码列的手机ID。向上拖动新单元格。
现在,如果您使用POI读取单元格,它将读取公式而不是计算值。现在执行以下操作:
添加另一列
选择在步骤1中创建的完整列,然后选择“编辑”->“复制”
转到在步骤3中创建的列的顶部单元格。然后选择“编辑”->“选择性粘贴”
在打开的窗口中,选择“值”单选按钮
选择“确定”
现在,使用POI API进行阅读...用Java读取之后...只需删除第一个字符即“!”
这些答案中有许多参考旧的POI文档和类。在最新的POI 3.16中,不推荐使用具有int类型的Cell
Cell.CELL_TYPE_STRING
而是可以使用CellType枚举。
CellType.STRING
只需确保使用poi依赖项以及poi-ooxml依赖项将pom更新到新的3.16版本,否则您将继续获得异常。此版本的一个优点是,您可以在创建单元格时指定单元格类型,从而消除了先前答案中描述的所有其他步骤:
titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
String retVal=null;
try {
FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
Workbook wb=WorkbookFactory.create(fis);
Sheet s=wb.getSheet(sheetname);
Row r=s.getRow(rownum);
Cell c=r.getCell(cellnum);
if(c.getCellType() == Cell.CELL_TYPE_STRING)
retVal=c.getStringCellValue();
else {
retVal = String.valueOf(c.getNumericCellValue());
}
我试过了,对我有用
这对我来说很完美。
Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}