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

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            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)訪問對應(yīng)的子工作表HSSFSheet,序號從'0'開始.在獲得HSSFSheet對象后通過sheet.getRow(rowNum)方法獲得子工作表的指定行HSSFRow,HSSFRow提供了getCell(short)方法訪問其中的單元格對象.在處理單元格的時候要注意,不能簡單使用HSSShellgetStringCellValue()方法獲得單元格中的值,在我使用的版本中(2.0)沒有提供自動類型轉(zhuǎn)換的功能,所以在取值的時候要根據(jù)類型判斷:
          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沒有提供時間類型常量,這時候你只能根據(jù)自己判斷是否要將它轉(zhuǎn)換成時間格式了: 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的單元格格式是常規(guī)格式,B1E1的單元格格式是文本,D1的單元格格式是日期

             運行上面的例子會輸出:

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

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

          Feedback

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

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

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

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

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

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

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

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

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

          主站蜘蛛池模板: 安阳县| 青海省| 桂阳县| 中牟县| 大埔区| 龙海市| 河曲县| 邛崃市| 峨眉山市| 修文县| 祥云县| 娱乐| 连山| 盈江县| 沈丘县| 九江县| 岳西县| 庄河市| 大关县| 清涧县| 中牟县| 峨山| 揭西县| 尤溪县| 大丰市| 丰原市| 禄丰县| 汉阴县| 巴林左旗| 郑州市| 凤凰县| 江油市| 工布江达县| 新昌县| 莱阳市| 洛阳市| 辽阳县| 新巴尔虎右旗| 合阳县| 双峰县| 绥棱县|