如何将Excel单元格中的数字字符串作为字符串(而非数字)读取?

166
  1. 我有一个Excel文件,其中包含以下内容:

    • A1:SomeString

    • A2:2

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

  2. 当我在Java中使用POI读取文件时,它告诉我A2是数字单元格格式。

  3. 问题在于,A2中的值可以是2或2.0(我希望能够区分它们),因此我不能仅使用.toString()

我该怎么做才能将其作为字符串读取?

24个回答

0

许多答案都参考了旧的POI文档和类。在最新的POI 3.16中,带有int类型的单元格已被弃用。

Cell.CELL_TYPE_STRING

enter image description here

可以使用CellType枚举

CellType.STRING 

请确保将您的pom文件更新为poi依赖项以及poi-ooxml依赖项的新3.16版本,否则您将继续收到异常。这个版本的一个优点是,您可以在创建单元格时指定单元格类型,从而消除了之前答案中描述的所有额外步骤:

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

0

我遇到了同样的问题,最简单的解决方法是将CELL TYPE设置为STRING。这样可以避免出现exceptions

FileInputStream fis = new FileInputStream(new File(filePath));
XSSFWorkbook wb = new XSSFWorkbook(fis);
XSSFSheet sheet = wb.getSheetAt(0); // get first sheet
row.getCell(1).setCellType(CellType.STRING); // set Cell Type as String
String val = row.getCell(1).getStringCellValue(); // get the value as String type
System.out.println(val); // prints the value; 

0

这对我来说完美地运作了。

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

0

如果单元格类型为数字,getStringCellValue会返回NumberFormatException。如果您不想将单元格类型更改为字符串,可以这样做。

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

0

我也曾在一个包含数千个数字的数据集上遇到类似的问题,我认为我已经找到了一个简单的解决方法。我需要在数字前插入撇号,以便单独的数据库导入始终将数字视为文本。在此之前,数字8将被导入为8.0。

解决方案:

  • 保留所有格式设置为常规。
  • 这里我假设数字存储在从第1行开始的A列中。
  • 在B列中输入',并复制所需的行数。工作表中不会显示任何内容,但单击单元格后,您可以在公式栏中看到撇号。
  • 在C列中:=B1&A1。
  • 选择列C中的所有单元格,并使用值选项将其粘贴到列D中。

嘿,预备,所有数字都被存储为文本。


0
当我们使用Apache POI库读取MS Excel的数字单元格值时,它将其读取为数字。但是有时我们希望将其读取为字符串(例如电话号码等)。以下是我的做法:
  1. 插入一个新列,第一个单元格为=CONCATENATE("!",D2)。这里假设D2是你的电话号码列的单元格ID。将新单元格拖到末尾。
  2. 现在,如果你使用POI读取该单元格,它将读取公式而不是计算出的值。现在执行以下操作:
  3. 添加另一列
  4. 选择步骤1中创建的整个列,并选择“编辑”->“复制”
  5. 转到步骤3中创建的列的顶部单元格,并选择“编辑”->“粘贴特殊”
  6. 在打开的窗口中,选择“值”单选按钮
  7. 选择“确定”
  8. 现在使用POI API进行读取...在Java中读取后...只需删除第一个字符即“!”

你的解决方案似乎不可用,如果没有自己生成Excel文件的话,是吗?(另外,你能在回答中放一个摘录吗?它并不长。) - Paŭlo Ebermann
是的,当一个人不是自己生成Excel文件时,它不能被使用。 - Asif Shahzad

0

我更愿意采用Wil或Vinayak Dornala的方法,但不幸的是它们对我的性能影响太大了。 我选择了一个巧妙的解决方案:隐式转换。

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

我不建议你这样做,因为在我的情况下它起作用是因为系统的本质以及我有可靠的文件源。
注: numericColumn 是从处理的文件头生成的 int。

0
另一个选择是强制Excel将整数值作为字符串进行评估。为了实现这一点,您需要在数字前面加上单引号。
以下是将单引号附加到数字1的示例:

enter image description here


0

有一个可直接使用的包装器(可以应用一些额外的优化)

  • 它支持数字和字符串单元格

  • 公式会被自动识别和处理

  • 避免一些样板代码

     public final class Cell {
    
     private final static DataFormatter FORMATTER = new DataFormatter();
    
     private XSSFCell mCell;
    
     public Cell(@NotNull XSSFCell cell) {
         mCell = cell;
    
         if (isFormula()) {
             XSSFWorkbook book = mCell.getSheet().getWorkbook();
             FormulaEvaluator evaluator = book.getCreationHelper().createFormulaEvaluator();
             mCell = (XSSFCell) evaluator.evaluateInCell(mCell);
         }
     }
    
     /**
      * 获取内容
      */
     public final int getInt() {
         return (int) getLong();
     }
    
     public final long getLong() {
         return Math.round(getDouble());
     }
    
     public final double getDouble() {
         return mCell.getNumericCellValue();
     }
    
     public final String getString() {
         if (!isString()) {
             return FORMATTER.formatCellValue(mCell);
         }
         return mCell.getStringCellValue();
     }
    
     /**
      * 获取属性
      */
     public final boolean isNumber() {
         if (isFormula()) {
             return mCell.getCachedFormulaResultType().equals(CellType.NUMERIC);
         }
         return mCell.getCellType().equals(CellType.NUMERIC);
     }
    
     public final boolean isString() {
         if (isFormula()) {
             return mCell.getCachedFormulaResultType().equals(CellType.STRING);
         }
         return mCell.getCellType().equals(CellType.STRING);
     }
    
     public final boolean isFormula() {
         return mCell.getCellType().equals(CellType.FORMULA);
     }
    
     /**
      * 调试信息
      */
     @Override
     public String toString() {
         return getString();
     }
     }
    

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接