无法从数字单元格“Poi”获取文本值

时间:2015-05-08 13:47:12

标签: java apache-poi

我正在尝试使用Excel中的电子表格中的数据,但总是出现此错误,已尝试将工作表格式化为文本和数字,但错误仍然存​​在。

我看到一个人使用它解决cell.setCellType ( Cell.CELL_TYPE_STRING ) ;,但我不知道我的代码在哪里适合这段。

WebElement searchbox = driver.findElement(By.name("j_username"));
WebElement searchbox2 = driver.findElement(By.name("j_password"));         

try {
    FileInputStream file = new FileInputStream(new File("C:\\paulo.xls")); 
    HSSFWorkbook workbook = new HSSFWorkbook(file);
    HSSFSheet sheet = workbook.getSheetAt(0);

    for (int i=1; i <= sheet.getLastRowNum(); i++){
        String j_username = sheet.getRow(i).getCell(0).getStringCellValue();
        String j_password = sheet.getRow(i).getCell(0).getStringCellValue();

        searchbox.sendKeys(j_username);
        searchbox2.sendKeys(j_password);
        searchbox.submit();  

        driver.manage().timeouts().implicitlyWait(10000, TimeUnit.MILLISECONDS);
    }

    workbook.close();
    file.close();
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
} catch (IOException ioe) {
    ioe.printStackTrace();

12 个答案:

答案 0 :(得分:45)

<击>

<击>
    Cell cell = sheet.getRow(i).getCell(0);
    cell.setCellType ( Cell.CELL_TYPE_STRING );
    String j_username = cell.getStringCellValue();

<击>

<强>更新

好的,正如在评论中所说的那样,尽管如此,但从Excel的单元格中检索数据并不正确。

根据手册here

  

如果您要做的是获取数值单元格的String值,   停!。这不是这样做的方法。相反,用于获取字符串   数字或布尔或日期单元格的值,请改用DataFormatter。

根据DataFormatter API

  

DataFormatter包含格式化存储在的值的方法   细胞。 这对于您的报表和GUI演示非常有用   需要完全按照Excel中显示的数据显示数据。支持的格式   包括货币,SSN,百分比,小数,日期,电话号码,   邮政编码等。

因此,显示数字单元格值的正确方法如下:

 DataFormatter formatter = new DataFormatter(); //creating formatter using the default locale
 Cell cell = sheet.getRow(i).getCell(0);
 String j_username = formatter.formatCellValue(cell); //Returns the formatted value of a cell as a String regardless of the cell type.

答案 1 :(得分:39)

在这种情况下,Formatter可以正常工作。

import org.apache.poi.ss.usermodel.DataFormatter;

FileInputStream fis = new FileInputStream(workbookName);
Workbook workbook = WorkbookFactory.create(fis);
Sheet sheet = workbook.getSheet(sheetName);
DataFormatter formatter = new DataFormatter();
String val = formatter.formatCellValue(sheet.getRow(row).getCell(col));
list.add(val);   //Adding value to list

答案 2 :(得分:6)

正如Apache POI Javadocs中所述,您不应使用cell.setCellType(Cell.CELL_TYPE_STRING)来获取数字单元格的字符串值,因为您将丢失所有格式

相反,作为javadocs explain,您应该使用DataFormatter

DataFormatter所做的是将表示单元格的浮点值与文件中存储的格式规则一起存储在文件中,并返回一个与Excel中的单元格相似的字符串。

所以,如果你是在一个单元格的字符串之后,看起来就像在Excel中看一样,只需这样做:

 // Create a formatter, do this once
 DataFormatter formatter = new DataFormatter(Locale.US);

 .....

 for (int i=1; i <= sheet.getLastRowNum(); i++) {
        Row r = sheet.getRow(i);
        if (r == null) { 
           // empty row, skip
        } else {
           String j_username = formatter.formatCellValue(row.getCell(0));
           String j_password =  formatter.formatCellValue(row.getCell(1));

           // Use these
        }
 }

格式化程序将按原样返回String单元格,对于Numeric单元格,将样式上的格式规则应用于单元格的数量

答案 3 :(得分:4)

使用DataFormatter此问题已解决。感谢“Gagravarr”的首发。

DataFormatter formatter = new DataFormatter();

String empno = formatter.formatCellValue(cell0);

答案 4 :(得分:2)

CellType cell = row.getCell(j).getCellTypeEnum();

switch(cell) {
    case NUMERIC:
        intVal = row.getCell(j).getNumericCellValue();
        System.out.print(intVal);
        break;
    case STRING:
        stringVal = row.getCell(j).getStringCellValue();
        System.out.print(stringVal);
        break;
}

答案 5 :(得分:2)

使用代码
cell.setCellType(Cell.CELL_TYPE_STRING);
在读取字符串值之前,这对您有帮助。
我正在使用POI版本3.17 Beta1版本, 还要确保版本兼容性。

答案 6 :(得分:1)

使用该代码肯定有效,我修改了它。

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
//import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.*;

public class TestApp {

    public static void main(String[] args) throws Exception {

        try {

            Class forName = Class.forName("com.mysql.jdbc.Driver");
            Connection con = null;
            con = DriverManager.getConnection("jdbc:mysql://localhost/tables", "root", "root");
            con.setAutoCommit(false);
            PreparedStatement pstm = null;
            FileInputStream input = new FileInputStream("C:\\Users\\Desktop\\a1.xls");
            POIFSFileSystem fs = new POIFSFileSystem(input);
            Workbook workbook;
            workbook = WorkbookFactory.create(fs);
            Sheet sheet = workbook.getSheetAt(0);
            Row row;
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                row = (Row) sheet.getRow(i);
                String name = row.getCell(0).getStringCellValue();
                String add = row.getCell(1).getStringCellValue();

                int  contact = (int) row.getCell(2).getNumericCellValue();

                String email = row.getCell(3).getStringCellValue();

                String sql = "INSERT INTO employee (name, address, contactNo, email) VALUES('" + name + "','" + add + "'," + contact + ",'" + email + "')";
                pstm = (PreparedStatement) con.prepareStatement(sql);
                pstm.execute();
                System.out.println("Import rows " + i);
            }
            con.commit();
            pstm.close();
            con.close();
            input.close();
            System.out.println("Success import excel to mysql table");
        } catch (IOException e) {
        }
    }

}

答案 7 :(得分:1)

这是解决错误的另一种方法:“无法从数字单元格“ Poi”获取文本值”

转到Excel工作表。拖动并选择要从Excel工作表中导入数据的数字。转到格式>数字>然后选择“纯文本”,然后导出为.xlsx。现在尝试运行脚本

希望效果很好...!

Cannot get a text value from a numeric cell “Poi”.img

答案 8 :(得分:1)

如果您正在使用cellIterator处理行...。那么这对我有用....

  DataFormatter formatter = new DataFormatter();   
  while(cellIterator.hasNext())
  {                         
        cell = cellIterator.next();
        String val = "";            
        switch(cell.getCellType()) 
        {
            case Cell.CELL_TYPE_NUMERIC:
                val = String.valueOf(formatter.formatCellValue(cell));
                break;
            case Cell.CELL_TYPE_STRING:
                val = formatter.formatCellValue(cell);
                break;
        }
    .....
    .....
  }

答案 9 :(得分:0)

这将有效:

WebElement searchbox = driver.findElement(By.name("j_username"));
WebElement searchbox2 = driver.findElement(By.name("j_password"));         


try {

      FileInputStream file = new FileInputStream(new File("C:\\paulo.xls")); 
      HSSFWorkbook workbook = new HSSFWorkbook(file);

      HSSFSheet sheet = workbook.getSheetAt(0);

    for (int i=1; i <= sheet.getLastRowNum(); i++){

            HSSFCell j_username = sheet.getRow(i).getCell(0)
            HSSFCell j_password = sheet.getRow(i).getCell(0)

            //Setting the Cell type as String
            j_username.setCellType(j_username.CELL_TYPE_STRING)
            j_password.setCellType(j_password.CELL_TYPE_STRING)

            searchbox.sendKeys(j_username.toString());
            searchbox2.sendKeys(j_password.toString());


            searchbox.submit();       

            driver.manage().timeouts().implicitlyWait(10000, TimeUnit.MILLISECONDS);

    }

      workbook.close();
      file.close();

     } catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
     } catch (IOException ioe) {
      ioe.printStackTrace();
     }

答案 10 :(得分:0)

public class B3PassingExcelDataBase {


    @Test()
    //Import the data::row start at 3 and column at 1: 
    public static void imortingData () throws IOException {

        FileInputStream  file=new         FileInputStream("/Users/Downloads/Book2.xlsx");
        XSSFWorkbook book=new XSSFWorkbook(file);
        XSSFSheet sheet=book.getSheet("Sheet1");

        int rowNum=sheet.getLastRowNum();
        System.out.println(rowNum);

        //get the row and value and assigned to variable to use in application
        for (int r=3;r<rowNum;r++) {

            // Rows stays same but column num changes and this is for only one person. It iterate for other.
             XSSFRow currentRow=sheet.getRow(r);

             String fName=currentRow.getCell(1).toString();
             String lName=currentRow.getCell(2).toString();
             String phone=currentRow.getCell(3).toString();
             String email=currentRow.getCell(4).toString()

               //passing the data
                yogen.findElement(By.name("firstName")).sendKeys(fName);    ;
                yogen.findElement(By.name("lastName")).sendKeys(lName); ;
                yogen.findElement(By.name("phone")).sendKeys(phone);    ;

        }

        yogen.close();


    }

}

答案 11 :(得分:0)

不同细胞类型的辅助类:

private static String returnStringValue(Cell cell) {
    CellType cellType = cell.getCellType();

    switch (cellType) {
        case NUMERIC:
            double doubleVal = cell.getNumericCellValue();
            return String.valueOf(doubleVal);
        case STRING:
            return cell.getStringCellValue();
        case ERROR:
            return String.valueOf(cell.getErrorCellValue());
        case BLANK:
            return "";
        case FORMULA:
            return cell.getCellFormula();
        case BOOLEAN:
            return String.valueOf(cell.getBooleanCellValue());
    }
    return "error decoding string value of the cell";
}