好好生活,努力工作,天天向上!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks
               Apache POI是Apache軟件基金會的開放源碼函式庫,用來幫助Java程序讀寫Microsoft Office的格式檔案。POI提供了下面這幾種類型對Microsoft Office的格式檔案進行解析:

                HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能。

                XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。

                HWPF - 提供讀寫Microsoft Word DOC格式檔案的功能。

                HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。

                HDGF - 提供讀Microsoft Visio格式檔案的功能。

                HPBF - 提供讀Microsoft Publisher格式檔案的功能。  

             你可以訪問POI的主頁http://poi.apache.org/ 下載你喜歡的版本和了解更多的信息.

             這里只介紹使用POI讀取Excel文件,在讀取Excel時首先要定位Excel文件的位置,然后通過POI的API生成一個工作表HSSFWorkbook對象:

              File file = new File(filePath);
              FileInputStream fint 
          = new
           FileInputStream(file);
              POIFSFileSystem poiFileSystem 
          = new
           POIFSFileSystem(fint);
              HSSFWorkbook workbook 
          = new
           HSSFWorkbook(poiFileSystem);

             可以通過HSSFWorkbook提供的getSheetAt(int sheetNum)訪問對應的子工作表HSSFSheet,序號從'0'開始.在獲得HSSFSheet對象后通過sheet.getRow(rowNum)方法獲得子工作表的指定行HSSFRow,HSSFRow提供了getCell(short)方法訪問其中的單元格對象.在處理單元格的時候要注意,不能簡單使用HSSShellgetStringCellValue()方法獲得單元格中的值,在我使用的版本中(2.0)沒有提供自動類型轉換的功能,所以在取值的時候要根據類型判斷:
          public static String getCell(HSSFCell cell) {
                  
          if (cell == null
          )
                      
          return ""
          ;
                  
          switch
           (cell.getCellType()) {
                    
          case
           HSSFCell.CELL_TYPE_NUMERIC:
                        
          return cell.getNumericCellValue() + ""
          ;
                    
          case
           HSSFCell.CELL_TYPE_STRING:
                        
          return
           cell.getStringCellValue();
                    
          case
           HSSFCell.CELL_TYPE_FORMULA:
                        
          return
           cell.getCellFormula();
                    
          case
           HSSFCell.CELL_TYPE_BLANK:
                        
          return ""
          ;
                    
          case
           HSSFCell.CELL_TYPE_BOOLEAN:
                        
          return cell.getBooleanCellValue() + ""
          ;
                    
          case
           HSSFCell.CELL_TYPE_ERROR:
                       
          return cell.getErrorCellValue() + ""
          ;
                   }
                   
          return ""
          ;
                }

             HSSFCell沒有提供時間類型常量,這時候你只能根據自己判斷是否要將它轉換成時間格式了: cell.getDateCellValue();      

             下面是一個簡單的例子,你可以參考一下:

          /**
           *  打印Excel文件 。 
           * 
          @author vwpolo
           * <p>2009-9-15</p>
           
          */

          public class PrintExcelTest {

            
          public static void main(String[] args) throws
           Exception {
              File file 
          = new File("User.xls"
          );
              FileInputStream fint 
          = new
           FileInputStream(file);
              POIFSFileSystem poiFileSystem 
          = new
           POIFSFileSystem(fint);
              HSSFWorkbook workbook 
          = new
           HSSFWorkbook(poiFileSystem);
              HSSFSheet sheet 
          = workbook.getSheetAt(0
          );
              HSSFRow rowTitle 
          = sheet.getRow(0
          );
              Iterator
          <HSSFCell> iterTitle =
           rowTitle.cellIterator();
              
          while
          (iterTitle.hasNext()) {
                System.out.print(iterTitle.next().getStringCellValue()
          +"  "
          );
              }
              System.out.println(
          ""
          );
              HSSFRow rowUser 
          = sheet.getRow(1
          );
              Iterator
          <HSSFCell> iterUser =
           rowUser.cellIterator();
              
          while
          (iterUser.hasNext()) {
                System.out.print(getCell(iterUser.next())
          +"  "
          );
              }
              System.out.println(
          "\n"
          );
              System.out.println(
          "出生日期:"+rowUser.getCell((short)3
          ).getDateCellValue().toLocaleString());
            }
            
            
          public static
           String getCell(HSSFCell cell) {
              
          if (cell == null
          )
                
          return ""
          ;
              
          switch
           (cell.getCellType()) {
                
          case
           HSSFCell.CELL_TYPE_NUMERIC:
                  
          return cell.getNumericCellValue() + ""
          ;
                
          case
           HSSFCell.CELL_TYPE_STRING:
                  
          return
           cell.getStringCellValue();
                
          case
           HSSFCell.CELL_TYPE_FORMULA:
                  
          return
           cell.getCellFormula();
                
          case
           HSSFCell.CELL_TYPE_BLANK:
                  
          return ""
          ;
                
          case
           HSSFCell.CELL_TYPE_BOOLEAN:
                  
          return cell.getBooleanCellValue() + ""
          ;
                
          case
           HSSFCell.CELL_TYPE_ERROR:
                  
          return cell.getErrorCellValue() + ""
          ;
              }
              
          return ""
          ;
            }
          }
             這里的User.xls文件時一個模板,

           

             A1C1的單元格格式是常規格式,B1E1的單元格格式是文本,D1的單元格格式是日期

             運行上面的例子會輸出:

           姓名  員工編號  所屬公司  出生日期  身份證號碼  
           張三  
          000018   上海      32117.0   370684198712066666
            

           出生日期:1987-12-6 0:00:00
              在那個迭代方法中無法對日期類型的判斷,所以輸出格式存在問題,可以將日期格式額外處理。
          posted on 2009-09-16 08:08 VWPOLO 閱讀(6283) 評論(7)  編輯  收藏 所屬分類: Java 技術Open Source

          Feedback

          # re: 使用Apache POI讀取Excel文件 2009-09-16 08:17 sorcerer
          記得以前的poi讀取某些excel文件時會讓jvm直接崩潰的.  回復  更多評論
            

          # re: 使用Apache POI讀取Excel文件 2009-09-16 08:38 VWPOLO
          @sorcerer
          現在好像沒有碰到這種情況,估計你使用的版本有問題吧,我這是為公司人事部提供的員工信息導入功能,差不多每次導入的數據都在500條左右。  回復  更多評論
            

          # re: 使用Apache POI讀取Excel文件 2009-09-16 11:36 sy
          500條很多么,我們至少是1萬以上,poi在處理大量數據是確實不怎么樣  回復  更多評論
            

          # re: 使用Apache POI讀取Excel文件 2009-09-16 12:43 Tomdog
          @sy
          微軟都不開源的,他的格式鬼才知道怎么高效解析,poi能用java做到這地步還是免費的已經是nb哄哄了  回復  更多評論
            

          # re: 使用Apache POI讀取Excel文件 2009-09-16 16:13 99書城
          是的速度發生點擊附件多舒服  回復  更多評論
            

          # re: 使用Apache POI讀取Excel文件 2009-09-16 19:44 cxh8318
          用poi導入幾千條是沒有問題的  回復  更多評論
            

          # re: 使用Apache POI讀取Excel文件 2009-09-18 09:33 DMC
          Excel畢竟都發展二十多年了,要完全兼容本來就很困難。微軟雖然讓人看很不順眼,但他們的程序員可不是吃飽了撐著的。

          另,微軟其實有公開doc,xls,ppt的文件格式。不然POI可能還做不到現在的程度。

          http://www.microsoft.com/interop/docs/OfficeBinaryFormats.mspx  回復  更多評論
            

          主站蜘蛛池模板: 莆田市| 渭南市| 晋宁县| 苗栗市| 昂仁县| 巢湖市| 遵义县| 盐亭县| 河间市| 曲阳县| 瓮安县| 江津市| 临泽县| 观塘区| 旬邑县| 始兴县| 鹤庆县| 安陆市| 化州市| 南陵县| 南安市| 泸西县| 辽源市| 信宜市| 河东区| 罗山县| 新竹市| 南靖县| 横山县| 甘肃省| 邯郸县| 五大连池市| 渝中区| 汉阴县| 伊宁市| 镇巴县| 惠东县| 齐河县| 临泉县| 闸北区| 大名县|