Java.lang.IllegalStateException: Impossible d'obtenir une valeur numérique à partir d'une cellule de texte


J'ai vu beaucoup de réponses ici concernant ma question, mais je ne peux pas trouver de solution pour cela. Je lis un fichier Excel et le stocke dans la base de données mysql. Ceci est mon code

            Sheet mySheet = wb.getSheetAt(0);
            for (Row row : mySheet) {
                int columnNumber = mySheet.getFirstRowNum();
                Cell c = row.getCell(columnNumber);
                String sql = "insert into medtest(FMCODE,FLAG,MCODE,EMPNO,NAME,ADDRESS1,ADDRESS2,ADDRESS3,BALANCE,HOSPITAL_O,HOSPITAL_I,NURSING,GENERAL,PRIVATE,SPLCODE,BKCD,ACCOUNT_NO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
                PreparedStatement ps = (PreparedStatement) con
                        .prepareStatement(sql); 
                ps.setString(1, row.getCell(0).getStringCellValue());
                ps.setString(2, row.getCell(1).getStringCellValue());
                ps.setInt(3, (int) row.getCell(2).getNumericCellValue());
                if (c != null) {
                if (c.getCellType() == Cell.CELL_TYPE_STRING)
                    ps.setString(4, row.getCell(3).getStringCellValue());
                else if(c.getCellType() == Cell.CELL_TYPE_NUMERIC)
                    ps.setInt(4, (int) row.getCell(3).getNumericCellValue());
                }
                ps.setString(5, row.getCell(4).getStringCellValue());
                ps.setString(6, row.getCell(5).getStringCellValue());
                ps.setString(7, row.getCell(6).getStringCellValue());
                ps.setString(8, row.getCell(7).getStringCellValue());
                ps.setFloat(9, (float) row.getCell(8).getNumericCellValue());
                ps.setFloat(10, (float) row.getCell(9).getNumericCellValue());
                ps.setFloat(11, (float) row.getCell(10).getNumericCellValue());
                ps.setFloat(12, (float) row.getCell(11).getNumericCellValue());
                ps.setFloat(13, (float) row.getCell(12).getNumericCellValue());
                ps.setFloat(14, (float) row.getCell(13).getNumericCellValue());
                ps.setString(15, row.getCell(14).getStringCellValue());
                ps.setString(16, row.getCell(15).getStringCellValue());
                ps.setString(17, row.getCell(16).getStringCellValue());
                ps.executeUpdate(); 
            }

Ce qui suit est mon exception se produisant à la ligne ps.setString(4, row.getCell(3).getStringCellValue());

java.lang.IllegalStateException: Cannot get a text value from a numeric cell
    at org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:643)
    at org.apache.poi.hssf.usermodel.HSSFCell.getRichStringCellValue(HSSFCell.java:720)
    at org.apache.poi.hssf.usermodel.HSSFCell.getStringCellValue(HSSFCell.java:703)
    at org.stc.action.DataImport.doGet(DataImport.java:94)
    at org.stc.action.DataImport.doPost(DataImport.java:70)

La cellule contient des valeurs de chaîne et d'entier

1.Exemple de données: D05 (Chaîne)

2.Exemple de données: 3916 (Entier)

Mais dans ma table, j'ai pris varchar comme type de données

Author: spt, 2015-05-21

2 answers

Vous devez vérifier le type de la cellule retournée:

if (row.getCell(3).getCellType() == Cell.CELL_TYPE_STRING) 
   ps.setString(4, row.getCell(3).getStringCellValue());
else 
   ps.setString(4, String.valueOf(row.getCell(3).getNumericCellValue()))
 3
Author: Jens, 2015-05-21 08:56:08

Écrivez une méthode d'aide, j'ai eu un problème similaire, parfois même si vous attendez une chaîne (ou une cellule int), elles sont de type différent si elles sont vides:

if (cell.getCellType() == Cell.CELL_TYPE_STRING)
{
 //process string value
}
else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC)
{
 //process numeric value
}
else
{
}
 0
Author: Stugal, 2015-05-21 07:10:20