一、 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