我怎样才能读取Excel单元格数字的字符串作为字符串(不是数字)?我怎样才能读取Excel单元格数字

2019-05-14 10:59发布

  1. 我让Excel这样的文件内容:

    • A1:SomeString

    • A2:2

    所有字段设置为字符串格式。

  2. 当我读到使用POI的java文件,它告诉A2是数字单元格的格式。

  3. 问题是,在A2值可以是2或2.0(我希望能够区分它们),所以我不能只是使用.toString()

我能做些什么来读取值作为字符串?

Answer 1:

我有同样的问题。 我做cell.setCellType(Cell.CELL_TYPE_STRING); 以前读的字符串值,无论用户如何格式化的单元格,其解决了这个问题。



Answer 2:

我不认为我们有这个班回来时,你问的问题,但今天有一个简单的答案。

你想要做的是使用DataFormatter类 。 你通过这一个细胞,它会尽力回报你什么包含Excel中会告诉你该小区的字符串。 如果你传递一个字符串单元格,你会得到的字符串返回。 如果你通过它与格式规则数字小区中应用,它会格式化基于它们的数量,并给你的字符串返回。

对于你的情况,我会假设数字单元应用了整数格式规则。 如果你问DataFormatter格式化这些细胞,它会给你回在它的整数字符串的字符串。

另外请注意,很多人建议做cell.setCellType(Cell.CELL_TYPE_STRING)但Apache的POI的JavaDoc很清楚地说明,你不应该这样做 ! 在做setCellType通话将松散的格式,为的javadoc解释转换为字符串格式化剩下的唯一办法就是使用DataFormatter类 。



Answer 3:

下面的代码为我工作的任何类型的细胞。

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);

}


Answer 4:

我建议以下方法时修改单元格的类型是不可取的:

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

NumberToTextConverter可以使用Excel的规则不失精度双重价值正确地转换为文本。



Answer 5:

由于在POI的Javadoc已经提到( 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);

在更多的例子http://massapi.com/class/da/DataFormatter.html



Answer 6:

是的,这完美的作品

推荐的:

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);

旧:

cell.setCellType(Cell.CELL_TYPE_STRING);

即使你有一个得到一张价值问题cell具有式,还是这个工程。



Answer 7:

尝试:

new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

要正确格式化数字。



Answer 8:

只要细胞是在数量,用户类型前的文本格式,POI将让您获得价值为字符串。 一个关键是,如果在电池的上方左上角被格式化为文本绿色的小三角形,你将能够检索其值作为字符串(绿色三角形出现时出现的东西是一个数字被强制转换为文本格式)。 如果您有包含数字的文本格式的单元格,但POI不会让你获取了这些值的字符串,有几件事情可以做,以电子表格的数据,以允许:

  • 对细胞双击使编辑光标是存在于细胞内,然后点击Enter键(可以在同一时间内只完成一个单元)。
  • 使用Excel 2007中的文本转换功能(可在多个小区上一次完成)。
  • 切出违规值到另一个位置,重新格式化电子表格单元格为文本,然后repaste先前切出的值作为未格式化的值返回到正确的区域。

你可以做的最后一件事是,如果你使用的是POI从Excel电子表格2007,你可以在Cell类'getRawValue()方法获取数据。 这并不关心的格式是什么。 它只是与原始数据返回一个字符串。



Answer 9:

当我们读到使用Apache POI库中的MS Excel的数字单元格的值,读这本书是为数字。 但有时我们希望它读成字符串(如电话号码等)。 这是我做的:

  1. 与第一小区= CONCATENATE插入新列( “!”,D2)。 我认为D2是您的电话号码列的小区ID。 拖动新的细胞器结束。

  2. 现在,如果你阅读使用POI的细胞,它会读取公式,而不是计算值。 现在做如下:

  3. 添加另一列

  4. 选择在步骤1中创建完整的列,然后选择编辑 - > COPY

  5. 转到步骤3和选择编辑 - 创建的列的顶部电池>选择性粘贴

  6. 在打开的窗口中,选择“值”单选按钮

  7. 选择“OK”

  8. 现在读使用POI API ...在Java中看完后...只是删除第一个字符,即“!”



Answer 10:

我也曾经有过对数千数的数据集类似的问题,我认为我已经找到一个简单的方法来解决。 我需要得到一个编号前插入撇号,这样一个单独的数据库导入总是能看到这些数字作为文本。 在此之前8号将被导入为8.0。

解:

  • 保留所有格式如通用。
  • 在这里,我假设号码存储在A柱开始第1行。
  • 将在“在B列,并根据需要复制下来尽可能多的行。 没有出现在工作表中,但点击单元格,你可以看到在公式栏的apostophe。
  • 在柱C:= B1&A1。
  • 选择C列所有单元格,并使用值选项做特别糊成列d。

变戏法似的所有的数字,但作为文本存储。



Answer 11:

getStringCellValue返回NumberFormatException如果该细胞类型是数字的。 如果你不想改变细胞类型为字符串,你可以做到这一点。

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}


Answer 12:

许多这些答案的参考老POI文件和类。 在最新的POI 3.16, 与int型细胞已被弃用

Cell.CELL_TYPE_STRING

相反, 单元格类型枚举可以使用。

CellType.STRING 

只是一定要更新与POI依赖你的POM以及兴趣点,OOXML依赖于新版本3.16,否则你会继续得到例外。 这个版本的一个好处是,你可以在单元格中创建消除以前的答案描述的所有额外的步骤时指定的细胞类型:

titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);


Answer 13:

我宁愿去西港岛线的答案或维纳亚克Dornala的路线,可惜的是他们影响我的表现远得多。 我去的隐式转换的哈克解决方案:

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

我不建议你这样做,我的情况,它的工作,因为系统是如何工作的性质,我有一个可靠的文件来源。

脚注:numericColumn是从读取处理的文件的报头产生一个int。



Answer 14:

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());
        }

我想这和它的工作对我来说



Answer 15:

我们有同样的问题,迫使我们的用户在进入值的细胞为“文本”格式。 Excel中正确的方式存储偶数为文本。 如果格式是继改变的Excel只改变显示值的方式,但不会改变,除非再次输入的数值的数值的存储方式(例如,通过按回车键在单元格时)。

无论Excel中正确存储的值作为文本由,如果它认为在电池的左上角Excel显示单元格包含数字,但格式化文本的小绿色三角形。



Answer 16:

你控制的Excel工作表中呢? 有没有给你输入模板的用户有哪些? 如果是这样,你可以有代码格式为您输入的单元格。



Answer 17:

它看起来像这样不能POI的当前版本来完成,基于这样的事实,这个错误:

https://issues.apache.org/bugzilla/show_bug.cgi?id=46136

依然突出。



Answer 18:

cell.setCellType(Cell.CELL_TYPE_STRING); 工作对我罚款



Answer 19:

转换为int然后做.toString() 这是丑陋的,但它的工作原理。



Answer 20:

这为我工作完美。

Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
    legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}


文章来源: How can I read numeric strings in Excel cells as string (not numbers)?