java用poi读取Excel表格中的数据

 

Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版。
Apache POI 代码例子地址:http://poi.apache.org/spreadsheet/quick-guide.html
本例子可以读取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
引入包如下:

 

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不是必须的】

 

 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表格数据时Cannot get a text value from a numeric cell

异常描述:在导入excel的时候在获取excel单元格数据的时候会出现Cannot get a text value from a numeric cell的异常抛出。
异常原因:poi读取excel单元格的数据,cell有不同的数据类型(CELL_TYPE_NUMERIC,CELL_TYPE_STRING,CELL_TYPE_FORMULA),如果cell中的数据是数值的话,如果你没有给他设置cell的类型的话。默认会认为是CELL_TYPE_NUMERICl类型,如果从一个NUMBER类型的Cell使用.cell.getStringCellValue()读取出一个字符串就会出错。
解决的方法:在读取数据之前,设置cell的类型为CELL_TYPE_STRING;
                         cell.setCellType(Cell.CELL_TYPE_STRING);

 

所以,上面的代码可以简单写成

 

 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                     
27                     //在读取单元格内容前,设置所有单元格中内容都是字符串类型
28                     cell.setCellType(Cell.CELL_TYPE_STRING);
29                     
30                     //按照字符串类型读取单元格内数据
31                     cellValue = cell.getStringCellValue();
32                     
33                     /*在这里可以对每个单元格中的值进行二次操作转化*/
34                     
35                     System.out.print(cellValue + "    ");  
36                 }  
37                 System.out.println();  
38             }  
39         }  
40   
41     }  
42     catch (Exception e) {  
43         e.printStackTrace();  
44     }  
45   
46     return Action.SUCCESS;  
47 }  

 

 

 

 

 

项目中原来就有maven的相关poi依赖,具体如下:

 1 maven依赖配置:
 2 <!--poi-->
 3 <dependency>
 4     <groupId>fakepath</groupId>
 5     <artifactId>poi-ooxml-schemas</artifactId>
 6     <version>3.14-20160307</version>
 7     
 8     <groupId>fakepath</groupId>
 9     <artifactId>poi-scratchpad</artifactId>
10     <version>3.14-20160307</version>
11     
12     <groupId>fakepath</groupId>
13     <artifactId>poi-ooxml</artifactId>
14     <version>3.14-20160307</version>
15     
16     <groupId>fakepath</groupId>
17     <artifactId>poi-examples</artifactId>
18     <version>3.14-20160307</version>
19     
20     <groupId>fakepath</groupId>
21     <artifactId>poi-excelant</artifactId>
22     <version>3.14-20160307</version>
23     
24     <groupId>fakepath</groupId>
25     <artifactId>poi</artifactId>
26     <version>3.14-20160307</version>
27     
28     <groupId>fakepath</groupId>
29     <artifactId>xmlbeans</artifactId>
30     <version>2.6.0</version>
31     
32 </dependency>

 

posted @ 2017-10-09 14:49  戈博折刀  阅读(7565)  评论(0编辑  收藏  举报