最近在写项目中用到了excel的导入,遇到了Cannot get a NUMERIC value
from a STRING
cell的报错。原因是无法从纯数字的单元格用获取String的方式获取。跟了一下蛋码,但是我明明做了处理了啊,看这里

 

图片 1图片 2

图片 3

Java读写Excel的包是Apache
POI(项目地址:
3.9稳定版。
Apache POI
代码例子地址:
本例子可以读取Microsoft Office Excel
2003/2007/2010,具体代码及注释如下:
读取“.xls”格式使用  import
org.apache.poi.hssf.usermodel.*;包的内容,例如:HSSFWorkbook
读取“.xlsx”格式使用 import org.apache.poi.xssf.usermodel.*;
包的内容,例如:XSSFWorkbook
读取两种格式使用    import
org.apache.poi.ss.usermodel.*    包的内容,例如:Workbook
引入包如下:

   @Test
    public void poi() throws Exception {
        InputStream inputStream=new FileInputStream("C:\Users\Administrator.SKY-20170602BKZ\Desktop\111.xlsx");
        //整个excel文件
        XSSFWorkbook xssfSheets = new XSSFWorkbook(inputStream);
        //每行的数据存一个list,然后每页的数据存到一个list
        List<List<String>> result=new ArrayList<List<String>>();
        //遍历XSSFWorkbook是否有多个sheet
        for (XSSFSheet xss:xssfSheets){
            //如果当前sheet为空则开始下一次循环
            if (xss==null)
                continue;
            //循环当前页 获取每一行
            for (int rowNum=1;rowNum<=xss.getLastRowNum();rowNum++){
                ArrayList<String> rowlist= new ArrayList<String>();
                XSSFRow row = xss.getRow(rowNum);
                short firstCellNum = row.getFirstCellNum();
                short lastCellNum = row.getLastCellNum();
                //获取每一个单元格
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()){
                    Cell next = cellIterator.next();
                    next.setCellType(Cell.CELL_TYPE_STRING);
                    rowlist.add(next.getStringCellValue());
                }
                result.add(rowlist);
            }


        }
        System.out.println(result);




    }

真是奇了个怪。。。。

 

解析代码

网上百度了一堆,基本都指出了这个错误的原因,但。。。可能是我这个新手看不懂别人的蛋码吧,其实我觉得他们的蛋码没有抽出来真的难看。

1 import org.apache.poi.ss.usermodel.Cell;  
2 import org.apache.poi.ss.usermodel.Row;  
3 import org.apache.poi.ss.usermodel.Sheet;  
4 import org.apache.poi.ss.usermodel.Workbook;  
5 import org.apache.poi.ss.usermodel.WorkbookFactory;  
6 import org.apache.poi.ss.usermodel.DateUtil; 

原文地址:

好了,看看我之前的代码:

【其中的DateUtil不是必须的】

如果poi导入excel表格数据时报出Cannot get a text value from a numeric
cell错误

图片 4

 

异常描述:在导入excel的时候在获取excel单元格数据的时候会出现Cannot get a
text value from a numeric cell的异常抛出。

再看看我修改之后的代码:

 1 /** 
 2  * 读取Excel测试,兼容 Excel 2003/2007/2010 
 3  */  
 4 public String readExcel()  
 5 {  
 6     SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");  
 7     try {  
 8         //同时支持Excel 2003、2007  
 9         File excelFile = new File("/home/zht/test.xls"); //创建文件对象  
10         FileInputStream is = new FileInputStream(excelFile); //文件流  
11         Workbook workbook = WorkbookFactory.create(is); //这种方式 Excel 2003/2007/2010 都是可以处理的  
12         int sheetCount = workbook.getNumberOfSheets();  //Sheet的数量  
13         //遍历每个Sheet  
14         for (int s = 0; s < sheetCount; s++) {  
15             Sheet sheet = workbook.getSheetAt(s);  
16             int rowCount = sheet.getPhysicalNumberOfRows(); //获取总行数  
17             //遍历每一行  
18             for (int r = 0; r < rowCount; r++) {  
19                 Row row = sheet.getRow(r);  
20                 int cellCount = row.getPhysicalNumberOfCells(); //获取总列数  
21                 //遍历每一列  
22                 for (int c = 0; c < cellCount; c++) {  
23                     Cell cell = row.getCell(c);  
24                     int cellType = cell.getCellType();  
25                     String cellValue = null;  
26                     switch(cellType) {  
27                         case Cell.CELL_TYPE_STRING: //文本  
28                             cellValue = cell.getStringCellValue();  
29                             break;  
30                         case Cell.CELL_TYPE_NUMERIC: //数字、日期  
31                             if(DateUtil.isCellDateFormatted(cell)) {  
32                                 cellValue = fmt.format(cell.getDateCellValue()); //日期型  
33                             }  
34                             else {  
35                                 cellValue = String.valueOf(cell.getNumericCellValue()); //数字  
36                             }  
37                             break;  
38                         case Cell.CELL_TYPE_BOOLEAN: //布尔型  
39                             cellValue = String.valueOf(cell.getBooleanCellValue());  
40                             break;  
41                         case Cell.CELL_TYPE_BLANK: //空白  
42                             cellValue = cell.getStringCellValue();  
43                             break;  
44                         case Cell.CELL_TYPE_ERROR: //错误  
45                             cellValue = "错误";  
46                             break;  
47                         case Cell.CELL_TYPE_FORMULA: //公式  
48                             cellValue = "错误";  
49                             break;  
50                         default:  
51                             cellValue = "错误";  
52                     }  
53                     System.out.print(cellValue + "    ");  
54                 }  
55                 System.out.println();  
56             }  
57         }  
58   
59     }  
60     catch (Exception e) {  
61         e.printStackTrace();  
62     }  
63   
64     return Action.SUCCESS;  
65 }  

异常原因:poi读取excel单元格的数据,cell有不同的数据类型(CELL_TYPE_NUMERIC,CELL_TYPE_STRING,CELL_TYPE_FORMULA),如果cell中的数据是数值的话,如果你没有给他设置cell的类型的话。默认会认为是CELL_TYPE_NUMERICl类型,如果从一个NUMBER类型的Cell使用.cell.getStringCellValue()读取出一个字符串就会出错。

图片 5

 

解决的方法:在读取数据之前,设置cell的类型为CELL_TYPE_STRING;

发表评论

电子邮件地址不会被公开。 必填项已用*标注