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

Java 如何将Excel单元格中的数字字符串读取为字符串(而不是数字)?,java,excel,apache-poi,Java,Excel,Apache Poi,我有包含以下内容的excel文件: A1:一些字符串 A2:2 所有字段都设置为字符串格式 当我使用POI读取java中的文件时,它告诉我A2是数值单元格格式 问题是A2中的值可以是2或2.0(我希望能够区分它们),所以我不能只使用.toString() 如何将值读取为字符串?强制转换为int,然后执行.toString()。它很难看,但很有效。我们也遇到了同样的问题,在输入值之前,我们强迫用户将单元格格式化为“文本”。这样Excel就可以正确地将偶数存储为文本。 如果随后更改了格式,Exc

我有包含以下内容的excel文件:

  • A1:一些字符串

  • A2:2

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

  • 当我使用POI读取java中的文件时,它告诉我A2是数值单元格格式

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

  • 如何将值读取为字符串?

    强制转换为int,然后执行
    .toString()
    。它很难看,但很有效。

    我们也遇到了同样的问题,在输入值之前,我们强迫用户将单元格格式化为“文本”。这样Excel就可以正确地将偶数存储为文本。 如果随后更改了格式,Excel仅会更改值的显示方式,但不会更改值的存储方式,除非再次输入值(例如,在单元格中按return键)


    如果Excel认为单元格包含数字,但格式为文本,则Excel在单元格左上角显示的绿色小三角形指示是否将值正确存储为文本

    您是否控制excel工作表?用户是否有提供输入的模板?如果是这样的话,您可以用代码格式化输入单元格。

    我也有同样的问题。我做了
    cell.setCellType(cell.cell\u TYPE\u字符串),该字符串值解决了问题,无论用户如何格式化单元格。

    基于以下事实,在当前版本的POI中似乎无法执行此操作:


    仍然是未完成的。

    当我们使用Apache POI库读取MS Excel的数值单元格值时,它将其读取为数值。但有时我们希望它读作字符串(例如电话号码等)。我就是这样做的:

  • 插入第一个单元格为CONCATENATE(“!”,D2)的新列。我假设D2是您的电话号码列的手机id。将新单元格向上拖动到末尾

  • 现在,如果使用POI读取单元格,它将读取公式而不是计算值。现在,请执行以下操作:

  • 添加另一列

  • 选择在步骤1中创建的完整列。然后选择编辑->复制

  • 转到步骤3中创建的列的顶部单元格。然后选择编辑->粘贴特殊

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

  • 选择“确定”

  • 现在请阅读使用POI API。。。在读了Java之后。。。只需删除第一个字符,即“!”

  • 尝试:


    应该正确设置数字的格式。

    我认为当你问这个问题时,我们没有上过这门课,但今天有一个简单的答案

    您要做的是使用。您将其传递给一个单元格,它会尽力返回一个字符串,其中包含Excel将为该单元格显示的内容。如果你给它一个字符串单元格,你会得到字符串。如果您将应用了格式规则的数字单元格传递给它,它将根据这些规则对数字进行格式设置,并返回字符串

    对于您的情况,我假设数值单元格应用了整数格式规则。如果您要求DataFormatter格式化这些单元格,它将返回一个包含整数字符串的字符串


    另外,请注意,许多人建议执行
    cell.setCellType(cell.cell\u TYPE\u STRING)
    ,但是!执行
    setCellType
    调用将丢失格式,因为转换为保留格式的字符串的唯一方法是使用。

    我也遇到过类似的问题,关于数千个数字的数据集,我认为我找到了一个简单的解决方法。我需要在数字之前插入撇号,以便单独的DB导入始终将数字视为文本。在此之前,数字8将作为8.0导入

    解决方案:

    • 将所有格式保持为常规格式
    • 这里我假设数字存储在A列中,从第1行开始
    • 在B列中输入“并根据需要复制尽可能多的行”。工作表中没有显示任何内容,但单击单元格可以在公式栏中看到撇号
    • 在C列中:=B1和A1
    • 选择C列中的所有单元格,并使用“值”选项在D列中进行特殊粘贴

    Hey Presto所有数字,但存储为文本。

    只要在用户键入数字之前单元格为文本格式,POI将允许您以字符串形式获取值。一个关键是,如果单元格左上角有一个小的绿色三角形,它的格式为文本,您将能够以字符串的形式检索它的值(只要看起来是数字的内容被强制转换为文本格式,绿色三角形就会出现)。如果您有包含数字的文本格式单元格,但POI不允许您以字符串形式获取这些值,则可以对电子表格数据执行以下操作:

    • 双击单元格,使编辑光标出现在单元格内,然后单击Enter(一次只能完成一个单元格)
    • 使用Excel 2007文本转换功能(可以一次在多个单元格上完成)
    • 将有问题的值剪切到另一个位置,将电子表格单元格重新格式化为文本,然后将先前剪切的值作为未格式化的值重新粘贴回适当的区域

    您可以做的最后一件事是,如果您使用POI从Excel 2007电子表格中获取数据,则可以使用单元格类“getRawValue()”方法。这与格式无关。它将简单地返回一个包含原始数据的字符串。

    是的,这非常有效

    建议:

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


    即使您在从具有公式的
    单元格中检索值时遇到问题,这仍然有效。

    以下代码适用于任何类型的单元格

    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);
    
    }
    
    InputStream inp=getClass().g
    
    cell.setCellType(Cell.CELL_TYPE_STRING);
    
    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);
    
    }
    
    String rsdata = "";
    try {
        rsdata = cell.getStringValue();
    } catch (NumberFormatException ex) {
        rsdata = cell.getNumericValue() + "";
    }
    
    if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
        String str = NumberToTextConverter.toText(cell.getNumericCellValue())
    }
    
    cell.setCellType(Cell.CELL_TYPE_STRING);
    
    DataFormatter df = new DataFormatter();
    String value = df.formatCellValue(cell);
    
    Cell.CELL_TYPE_STRING
    
    CellType.STRING 
    
    titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
    
    Double legacyRow = row.getCell(col).getNumericCellValue();
    String legacyRowStr = legacyRow.toString();
    if(legacyRowStr.contains(".0")){
        legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
    }
    
    for (Row row : sheet){
    String strValue = (row.getCell(numericColumn)+""); // hack
    ...
    
    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());
            }
    
     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);
         }
     }
    
     /**
      * Get content
      */
     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();
     }
    
     /**
      * Get properties
      */
     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);
     }
    
     /**
      * Debug info
      */
     @Override
     public String toString() {
         return getString();
     }
     }