java poi對excel的操作詳解


一、 POI簡介

   Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。

二、 HSSF概況

            HSSF 是Horrible SpreadSheet Format的縮寫,通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。

三、 POI EXCEL文檔結構類

            HSSFWorkbook excel文檔對象

            HSSFSheet excel的sheet HSSFRow excel的行

            HSSFCell excel的單元格 HSSFFont excel字體

            HSSFName 名稱 HSSFDataFormat 日期格式

            HSSFHeader sheet頭

            HSSFFooter sheet尾

            HSSFCellStyle cell樣式

            HSSFDateUtil 日期

            HSSFPrintSetup 打印

            HSSFErrorConstants 錯誤信息表

基本介紹介紹完了,那么通過小例子來理解真正的用法:

首先創建excel文件。 
   static public void main(String arg[]) throws IOException
       { 
              /**創建一個空白的excel文件,這個是excel文件在java中的對象,java不是操作對象的語言嗎?
               *那么就將一個excel文件映射成為一個對象。然而這個excel的對象在java就是HSSFWorkbook
               *那么也就是說:在java中你要使用poi來操作excel那么HSSFWorkbook對象就是你要操作的那個excel文件,
               *當HSSFWorkbook 對象是一個空對象的時候,就默認為你創建了一個excel文件
               */ 
              HSSFWorkbook hssfworkbook = new HSSFWorkbook();
//           建議大家,當使用一個未知的類或者接口也好,當創建這個類或者接口的對象,最好用其全稱的小寫方式,容易記錄。學的能快點 
              FileOutputStream fileoutputstream = new FileOutputStream("D:exceltext.xls");
//           通過java的io包創建一個要輸出的文件,但是文件名要用“.xls”結尾 
              hssfworkbook.write(fileoutputstream);
//           調用HSSFWorkbook對象的write方法根據excel本書的規范生產新文件。注:並不是說你把文件是用什么結尾就是什么類型的文件。 
              fileoutputstream.close();
//           輸出完成之后要關閉文件流。要節約系統資源,同時可以避免不必要的麻煩。然后執行這段程序。 
       }

重點是我們要將我們的信息寫入excel中。
在excel中信息都是放在一個有一個sheet頁中的。那么每一個sheet也對java來說就是一個對象,但是這個對象的產生要依賴於excel對象,也就是HSSFWorkbook對象。要不sheet頁放在那里呢?那么在poi中sheet頁對象是哪個呢?在poi中sheet映射為HSSFSheet對象。剛已經說了,sheet頁對象的存在的前提就是HSSFWorkbook對象的存在。

方法如下,HSSFWrokbook hssfworkbook = new HSSFWorkbook();
                HSSFSheet     hssfsheet    = hssfworkbook.createSheet(“sheet_one”); 
     //到這里我們就通過HSSFWorkbook對象創建了HSSFSheet對象。同時將這個sheet頁定名為sheet_ont 也可以這樣創建sheet頁:

                hssfworkbook.createSheet();

                 hssfworkbook.setSheetName(0,””)

 其中0代表sheet頁的編號,在hssfworkbook對象中的每一個sheet頁是按照數組的形式存儲的,那么第一個sheet頁的數組下標就應該是0,可以從方法名字setSheetName看出來這個方法是給已經有的sheet頁定義名字的,那么如果這個sheet頁尚未建立,那么給一個根本沒有的sheet頁定義名字就會出現異常情況。
     //然后我們像上邊一樣輸出社個文件
                FileOutputStream fileoutputstream = new FileOutputStream(“D:exceltext.xls”);
                Hssfworkbook.write(fileoutputstream);
                Fileoutputstream.close();

 

好了以上我們就輸出了一個包括了中文命名sheet頁的excel文件。但是我們的目的是不是輸出這個東西啊,我們的目的是輸出信息。那么我們來輸出信息了,在excel文件中的信息存放形式是這樣的,首先文件是嚴格按照行列形式存放在每個單元格中,於是poi中就用HSSFRow對象來映射excel中的行,(也可以說是代替)那么列怎么映射呢?這里就體現出了poi創造者的智慧了,他使poi在獲得了行對象之后,通過這個行對象來創建了一個格子對象,同時將信息存放在格子(HSSFCell)對象中,同時借用了格子的數目達到了對列的映射。具體方法如下。

 

HSSFWorkbook hssfworkbook = new HSSFWorkbook();

 

              HSSFSheet    hssfsheet    = hssfworkbook.createSheet("frist");

 

              HSSFRow      hssfrow      = hssfsheet.createRow(0);

 

// 以上就不用說了,這里通過hssfsheet對象的createRow(int i)方法創建了一個行對象同時指定了就是第一行

 

              HSSFCell     hssfcell     = hssfrow.createCell((short)0);

 

//然后在這個行對象上創建了一個單元格對象,就是HSSFCell對象。Hssfrow.createCell()方法的參數是short型的,這里一定要注意轉型。

 

hssfcell.setCellValue("哈哈也是中文咯");

 

//然后給這個單元格對象設定值

 

              hssfrow.createCell((short)1).setCellValue(new Date());

 

              hssfrow.createCell((short)2).setCellValue(false);

 

              hssfrow.createCell((short)3).setCellValue(12.00);

 

              FileOutputStream fileoutputstream = new FileOutputStream("d:excela.xls");

 

              hssfworkbook.write(fileoutputstream);

 

              fileoutputstream.close();

 



這個時候我們發現了第一個單元格的中文沒有顯示出來,同時日期型數據也沒有給我們正確的顯示出來。我們來一個一個的解決,中文問題出現的原因剛已經說了是因為字符的問題,將上面藍色的部分替換成下邊這樣即可:
hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
              hssfcell.setCellValue("哈哈也是中文咯");

 

注意:hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);

 

這句一定要寫在給單元格設定值的前面,個人建議在單元格建立之后直接就寫這個方法,無論單元格里是不是中文。

 

 

 


好了中文的問題解決了,就要處理日期的問題了:

 

我們在excel中看到的那串數字其實不是日期型的亂碼,而是excel將日期型作為了long型來處理了,那么要這樣才能得到我們要的那種日期呢?java中有一個包叫java.text其中多是些操作字符傳,日期,數字等等的規則方法,建議有時間多看看,但是在poi中不能這樣用,於是poi給了我們一個特殊的對象,就是excel樣式表對象,所謂的樣式表就是按照預先定義好了的方式來進行數據的顯示,在頁面上很常用,要是有精力的人還是要看看,雖然對java程序員來說意義不大,但是義不壓人嗎?

 

好了廢話少說來定義excel中的日期樣式:同樣excel也給出了一個HSSFCellseyle對象,那么我們就來操作這個對象好了啊。方法如下:

 

HSSFWorkbook hssfworkbook = new HSSFWorkbook();

 

              HSSFSheet    hssfsheet    = hssfworkbook.createSheet();

 

              hssfworkbook.setSheetName(0, "哈哈中文咯",HSSFWorkbook.ENCODING_UTF_16);

 

              HSSFRow      hssfrow      = hssfsheet.createRow(0);

 

              HSSFCell     hssfcell     = hssfrow.createCell((short)0);

 

              hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);

 

              hssfcell.setCellValue("哈哈也是中文咯");

 

              HSSFCellStyle hssfcellstyle = hssfworkbook.createCellStyle();

 

              hssfcellstyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

 

             

 

              HSSFCell celldate = hssfrow.createCell((short)1);

 

              celldate.setCellValue(new Date());

 

              celldate.setCellStyle(hssfcellstyle);

 

              hssfrow.createCell((short)2).setCellValue(false);

 

              hssfrow.createCell((short)3).setCellValue(12.00);

 

              FileOutputStream fileoutputstream = new FileOutputStream("d:exceltext.xls");

 

              hssfworkbook.write(fileoutputstream);

 

              fileoutputstream.close();  

 

到這里我們就可以自由的用poi來操作excel文件的信息輸出部分了。

 

 

 

信息輸出的目的是為了更好的讀取(引自“今天的撤退就是為了明天的勝利!”)

 

既然我們把信息當成了這樣或者那樣的對象輸出的,那么我們就再把信息按照這樣和那樣的對象讀取出來就可以了。如果你清楚了怎么輸出那么輸入就比較簡單了,只要知道幾個方法就OK了。

 

例子如下:

 

String filepath = "d:excela.xls";

 

              HSSFWorkbook hssfworkbook = new HSSFWorkbook(new FileInputStream(filepath));

 

              HSSFSheet    hssfsheet    = hssfworkbook.getSheetAt(0);

 

              int i = hssfsheet.getLastRowNum();

 

              for(int k=0;k<=i;k++)

 

              {

 

                     HSSFRow hssfrow = hssfsheet.getRow(k);

 

                     for(int j=0;j<hssfrow.getLastCellNum();j++)

 

                     {

 

                            HSSFCell hssfcell = hssfrow.getCell((short)j);

 

                            System.out.println(hssfcell.getDateCellValue());

 

                     }

 

              }

 

解釋一下:filepath 是你要操作的excel,通過有參數的HSSFWorkbook()構造器我們可以獲得一個已有的excel文件,就像我們打開一個excel文件一樣。因為一個excel文件可能有多個sheet頁。那么我們首先要定位操作那個sheet頁。方法是:hssfworkbook.getSheetAt(0);

 

這個方法其實也是一個創建sheet頁的過程,但是由於對象在已經有了(顯示中),我們就引用就可以了。

 

得到要操作的sheet頁之后就要操作信息了,int i = hssfsheet.getLastRowNum();這個方法很重要的,就是我們通過HSSFSheet對象,獲得了這個對象下最大的行數。然后用這個作為索引可以遍歷所有的行,方法是:HSSFRow hssfrow = hssfsheet.getRow(k);這樣就依次的獲得了每個行對象,然后根據行對象了

 

hssfrow.getLastCellNum()這個方法就可以獲得對於的行中最大了單元格的數目,然后通過HSSFCell hssfcell = hssfrow.getCell((short)j);這個方法得到單元格的內容;注意標紅的位置,也是一個short型的。

 

 

注意:現在給出其他幾個鏈接可以參考學習poi

www.cnblogs.com/vTree/archive/2011/11/30/2268721.html

blog.csdn.net/xjun15/article/details/5805429

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM