JAVA解析Excel文件的两种方式 --Poi技术

时间:2022-10-02 20:27:19

原文链接:http://max1487.iteye.com/blog/2298289

目前有两种比较主流的技术解析Excel文件,这里我讲解的是Poi技术的实现。
话不多话,Poi包里有4个主要的类,包括:

Workbook------工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取,

Sheet------------表格,Workbook实例的getSheetAt(int num)方法获取,

Row--------------行,Sheet实例的getRow(int num)方法获取,

Cell--------------单元格,Row实例的getCell(int num)方法获取,

最后通过Cell实例根据数据类型调用对应的方法获取单元格的值。

下面是我做的一个实例。

excel文件内容:包含字符串、日期、数值、公式等数值类型


JAVA解析Excel文件的两种方式 --Poi技术
 

解析类代码:

 

Java代码  JAVA解析Excel文件的两种方式 --Poi技术
  1. public class Poi {  
  2.       
  3.     
  4.     private Sheet sheet;    //表格类实例  
  5.     LinkedList[] result;    //保存每个单元格的数据 ,使用的是一种链表数组的结构  
  6.   
  7.     //读取excel文件,创建表格实例  
  8.     private void loadExcel(String filePath) {  
  9.         FileInputStream inStream = null;  
  10.         try {  
  11.             inStream = new FileInputStream(new File(filePath));  
  12.             Workbook workBook = WorkbookFactory.create(inStream);  
  13.              
  14.             sheet = workBook.getSheetAt(0);           
  15.         } catch (Exception e) {  
  16.             e.printStackTrace();  
  17.         }finally{  
  18.             try {  
  19.                 if(inStream!=null){  
  20.                     inStream.close();  
  21.                 }                  
  22.             } catch (IOException e) {                  
  23.                 e.printStackTrace();  
  24.             }  
  25.         }  
  26.     }  
  27.     //获取单元格的值  
  28.     private String getCellValue(Cell cell) {  
  29.         String cellValue = "";  
  30.         DataFormatter formatter = new DataFormatter();  
  31.         if (cell != null) {  
  32.             //判断单元格数据的类型,不同类型调用不同的方法  
  33.             switch (cell.getCellType()) {  
  34.                 //数值类型  
  35.                 case Cell.CELL_TYPE_NUMERIC:  
  36.                     //进一步判断 ,单元格格式是日期格式   
  37.                     if (DateUtil.isCellDateFormatted(cell)) {  
  38.                         cellValue = formatter.formatCellValue(cell);  
  39.                     } else {  
  40.                         //数值  
  41.                         double value = cell.getNumericCellValue();  
  42.                         int intValue = (int) value;  
  43.                         cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);  
  44.                     }  
  45.                     break;  
  46.                 case Cell.CELL_TYPE_STRING:  
  47.                     cellValue = cell.getStringCellValue();  
  48.                     break;  
  49.                 case Cell.CELL_TYPE_BOOLEAN:  
  50.                     cellValue = String.valueOf(cell.getBooleanCellValue());  
  51.                     break;  
  52.                     //判断单元格是公式格式,需要做一种特殊处理来得到相应的值  
  53.                 case Cell.CELL_TYPE_FORMULA:{  
  54.                     try{  
  55.                         cellValue = String.valueOf(cell.getNumericCellValue());  
  56.                     }catch(IllegalStateException e){  
  57.                         cellValue = String.valueOf(cell.getRichStringCellValue());  
  58.                     }  
  59.                       
  60.                 }  
  61.                     break;  
  62.                 case Cell.CELL_TYPE_BLANK:  
  63.                     cellValue = "";  
  64.                     break;  
  65.                 case Cell.CELL_TYPE_ERROR:  
  66.                     cellValue = "";  
  67.                     break;  
  68.                 default:  
  69.                     cellValue = cell.toString().trim();  
  70.                     break;  
  71.             }  
  72.         }  
  73.         return cellValue.trim();  
  74.     }  
  75.   
  76.   
  77.   
  78.     //初始化表格中的每一行,并得到每一个单元格的值  
  79.     public  void init(){  
  80.         int rowNum = sheet.getLastRowNum() + 1;  
  81.         result = new LinkedList[rowNum];  
  82.         for(int i=0;i<rowNum;i++){  
  83.             Row row = sheet.getRow(i);  
  84.             //每有新的一行,创建一个新的LinkedList对象  
  85.             result[i] = new LinkedList();  
  86.             for(int j=0;j<row.getLastCellNum();j++){  
  87.                 Cell cell = row.getCell(j);  
  88.                 //获取单元格的值  
  89.                 String str = getCellValue(cell);  
  90.                 //将得到的值放入链表中  
  91.                 result[i].add(str);  
  92.             }  
  93.         }  
  94.     }  
  95.     //控制台打印保存的表格数据  
  96.     public void show(){  
  97.         for(int i=0;i<result.length;i++){  
  98.             for(int j=0;j<result[i].size();j++){  
  99.                 System.out.print(result[i].get(j) + "\t");  
  100.             }  
  101.             System.out.println();  
  102.         }  
  103.     }  
  104.     public static void main(String[] args) {  
  105.         Poi poi = new Poi();  
  106.         poi.loadExcel("jxl.xls");  
  107.         poi.init();  
  108.         poi.show();  
  109.     }  
  110.       
  111. }  

控制台输出结果: