轉自:http://blog.sina.com.cn/s/blog_5e0d59fb0100bx5s.html
開發環境爲windowsXP-SP2,Eclipse3.2,JDK1.5.07,其實差很少都行,不會有太大的差別。本文從POI下載開始講解,前提是開發環境包括系統變量等等已經正確設置完畢。html
1.POI的下載apache
POI官方網址:ide
http://poi.apache.org/
JAR包下載:學習
http://apache.mirror.phpchina.com/poi/release/bin/poi-bin-3.0.1-FINAL-20070705.zip
×××:測試
http://apache.mirror.phpchina.com/poi/release/src/poi-src-3.0.1-FINAL-20070705.zip字體
下載上面的JAR和源碼(源碼不是必須的,可是爲了早日修得正果,深刻系統的看看POI代碼仍是有必要的)並解壓待用。ui
2.用Eclipse搭建項目設計
第一講:基本的Excel讀寫
//建立一個空白的WorkBook
HSSFWorkbook wb = new HSSFWorkbook();
//基於上面的WorkBook建立屬於此WorkBook的Sheet,
//3.0.1版在使用全角Sheet名的時候沒必要再setEncdoing了,我的感受方便了許多。
HSSFSheet st = wb.createSheet("測試頁");
//建立屬於上面Sheet的Row,參數0能夠是0~65535之間的任何一個,
//注意,儘管參數是Int類型,可是Excel最多支持65536行
HSSFRow row = st.createRow(0);
//建立屬於上面Row的Cell,參數0能夠是0~255之間的任何一個,
//一樣,是由於Excel最大支持的列數爲256列
HSSFCell cell = row.createCell((short) 0);
//設置此單元格的格式爲文本,此句能夠省略,Excel會自動識別。
//其餘還有幾種經常使用的格式,請參考本文底部的補充部分。
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
//此處是3.0.1版的改進之處,上一版能夠直接setCellValue("Hello, World!"),
//可是在3.0.1裏,被deprecated了。
cell.setCellValue(new HSSFRichTextString("Hello, World!"));
//建立一個文件輸出流,指定到C盤根目錄下(C盤都有吧?)
//xls是Excel97-2003的標準擴展名,2007是xlsx,目前的POI能直接生產的仍是xls格式,
//若是此處把擴展名改爲xlsx,在用Excel2007打開此文件時會報錯。
FileOutputStream writeFile = new FileOutputStream("c:/helloworld.xls");
//把WorkBook寫到流裏
wb.write(writeFile);
//記得手動關閉流,官方文檔已經作了特別說明,說POI不負責關閉用戶打開的流。因此...
writeFile.close();
上面就是建立一個新文檔的簡易代碼,下面的例子是讀取剛纔建立的Excel並把讀取到的內容顯示在控制檯上。
//指定要讀取的文件,本例使用上面生成的helloworld.xls
FileInputStream readFile = new FileInputStream("c:/helloworld.xls");
//建立一個WorkBook,從指定的文件流中建立,即上面指定了的文件流
HSSFWorkbook wb = new HSSFWorkbook(readFile);
//獲取名稱爲「測試頁」的sheet
//注意,若是不能肯定具體的名稱,能夠用getSheetAt(int)方法取得Sheet
HSSFSheet st = wb.getSheet("測試頁");
//得到第一行,同上,若是此行沒有被建立過則拋出異常
HSSFRow row = st.getRow(0);
//獲取第一個單元格,若是沒有被建立過則拋出異常
HSSFCell cell = row.getCell((short) 0);
//把cell中的內容按字符串方式讀取出來,並顯示在控制檯上
//注意,getRichStringCellValue()方法是3.0.1新追加的,
//老版本中的getStringCellValue()方法被deprecated了
System.out.println(cell.getRichStringCellValue());
//記得關閉流
readFile.close();
上面對建立和讀取分別舉例說明,回顧兩段代碼,不難看出POI操做Excel的「套路」:
得到一個WorkBook(準確說是HSSFWorkBook,對於POI來講,WorkBook是「另有其類」,如下類同)
得到要讀/寫的Sheet對象
得到要操做的Row對象
得到最小單位——Cell對象
而後就能夠隨意的讀取、寫入了。
--------------------------------------------------------------------------------
關於單元格格式的補充:
單元格一共有以下幾種格式,都是HSSFCell類的靜態共有屬性,
CELL_TYPE_NUMERIC - 數字格式
CELL_TYPE_STRING - 字符串(默認)
CELL_TYPE_FORMULA - 公式
CELL_TYPE_BLANK - 空白
CELL_TYPE_BOOLEAN - 布爾
CELL_TYPE_ERROR - 錯誤
第二講:單元格邊框、字體及顏色
此文概要性的講述了一下單元格的邊框、字體以及顏色的設置方式,在POI中,這一切都是經過實例化HSSFCellStyle對象來實現的,HSSFCellStyle類還有不少其餘實際有用方法,本例中只是取平時用的比較廣泛的一些設置來作演示的。好,開始講解了……
// 設置行號
row.setHeightInPoints((short) 50);
// 設置列寬,(256 * 50)這種寫法是由於width參數單位是單個字符的256分之一
st.setColumnWidth(cell.getCellNum(), (short) (256 * 50));
// 讓HSSFWorkbook建立一個單元格樣式的對象
// 小技巧:在多處用到徹底同樣的樣式的時候能夠用工廠模式生產
HSSFCellStyle cellStyle = wb.createCellStyle();
// 設置單元格的橫向和縱向對齊方式,具體參數就不列了,參考HSSFCellStyle
cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 這個地方是用來在單元格里畫斜線的
// 原理是在指定的兩個點之間畫線,而後默認狀況此線會隨着單元格的變化而變化
// 相似Excel那種設置邊框的方式達到的斜線效果目前好像POI不支持
// 若是是我疏忽了請記得告訴我一些,先行謝過啦
HSSFPatriarch patriarch = st.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor();
anchor.setAnchor(cell.getCellNum(), row.getRowNum(), 0, 0, (short) (cell.getCellNum() + 1),
row.getRowNum() + 1, 0, 0);
patriarch.createSimpleShape(anchor);
// 設置單元格的文本方式爲可多行編寫方式
cellStyle.setWrapText(true);
// 設置單元格的填充方式,以及前景顏色和背景顏色
// 三點注意:
// 1.若是須要前景顏色或背景顏色,必定要指定填充方式,二者順序無所謂;
// 2.若是同時存在前景顏色和背景顏色,前景顏色的設置要寫在前面;
// 3.前景顏色不是字體顏色。
cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
// 設置單元格底部的邊框及其樣式和顏色
// 這裏僅設置了底邊邊框,左邊框、右邊框和頂邊框同理可設
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
// 建立一個字體對象,由於字體也是單元格格式的一部分,因此從屬於HSSFCellStyle
// 下面幾個字體的相關設置望文生義,就不用一一說明了吧
HSSFFont font = wb.createFont();
font.setFontName("宋體");
font.setItalic(true);
font.setColor(HSSFColor.BLUE.index);
font.setFontHeightInPoints((short) 20);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 將字體對象賦值給單元格樣式對象
cellStyle.setFont(font);
// 將單元格樣式對應應用於單元格
cell.setCellStyle(cellStyle);
這樣就OK了,能夠能夠看到效果了。
補充,各個章節的例子最終都在同一個附件內,下載的時候下任何一個頁面內的均可以,都是同樣的。
Java-Excel報表開發POI—合併、分組及凍結
Java-Excel報表開發POI系列講座
第三講:單元格的合併、數據行的分組以及Excel窗口的凍結
原本想把這三個東西分開來實現的,後來發現分開後內容都不多,因而就合在一塊兒說吧。那總不能乾巴巴的列幾個例子就完了吧,那就拿比較初級但又會常常遇到的表格類數據的統計的設計來作個小例子。(×××)
結果發現——還真夠辛苦的。
此次先看效果圖吧,其中的豎排並非真正意義上Excel那種設置的豎排,而是稍微轉變了一下輸出的方式實現的,由於老外的英文單詞沒有這種豎排的可能(頂可能是旋轉,可是那樣字體就變了)。除此以外想到的另一種豎排文字的實現方式就是樣式旋轉+字體旋轉,沒測試,不知道是否可用,誰有功夫實現一下,而後記得告訴我結果啊。
老樣子,把核心的代碼和簡要的說明列出來你們看一下吧。
// 這裏首先建立一個單元格樣式對象,設置了四周的邊框以及字體能夠換行
其實這樣實現起來是否是很麻煩呢?答案是:是。
其實這只是舉個例子,熟悉一下POI的各類API而已,真正要實現這樣一個表格的時候,例如項目須要製做報表等等,一般的作法都是事先把格式一切的東西都手動製做好(這個作好了的文件在實際的項目裏咱們稱之爲「數據模板」,簡稱「模板」),而後在Java應用中適當的時機把這個文件讀進來修改,最後再另存到指定的位置或者傳遞給下一個處理者(例如以流的方式送給Servlet等等),這樣其實POI具體作的事情就是向模板裏寫業務的數據,仍是很方便快捷的。