在咱們實際的開發中,表現層的解決方案雖然有多樣,可是IE瀏覽器已成爲最多人使用的瀏覽器,由於你們都用Windows。在企業辦公系統中,經常有客戶這樣子要求:你要把咱們的報表直接用Excel打開(電信系統、銀行系統)。或者是:咱們已經習慣用Excel打印。java
Apache的Jakata項目的POI子項目,目前比較成熟的是HSSF接口,處理MSExcel對象。它不象咱們僅僅是用csv生成的沒有格式的能夠由Excel轉換的東西,而是真正的Excel對象,你能夠控制一些屬性如sheet,cell等等。apache
首先,理解一下一個Excel的文件的組織形式,一個Excel文件對應於一個workbook(HSSFWorkbook),一個workbook能夠有多個sheet(HSSFSheet)組成,一個sheet是由多個row(HSSFRow)組成,一個row是由多個cell(HSSFCell)組成。數組
POI能夠到www.apache.org下載到。實際運行時,須要有poi包就能夠了。HSSF提供給用戶使用的對象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel對象,樣式和格式,還有輔助操做。有如下幾種對象:瀏覽器
HSSFWorkbook excel的文檔對象測試
HSSFSheet excel的表單字體
HSSFRow excel的行 ui
HSSFCell excel的格子單元編碼
HSSFFont excel字體spa
HSSFDataFormat 日期格式excel
在poi1.7中才有如下2項:
HSSFHeader sheet頭
HSSFFooter sheet尾(只有打印的時候才能看到效果)
和這個樣式
HSSFCellStyle cell樣式
輔助操做包括
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 錯誤信息表
如下可能須要使用到以下的類
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
先看poi的examples包中提供的最簡單的例子,創建一個空xls文件。
import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ExcelSample1 {
public static void main(String[] args) throws IOException { //建立一個excel文件 HSSFWorkbook wb= new HSSFWorkbook(); FileOutputStream fileOut= new FileOutputStream("c:\\workbook.xls"); // FileOutputStream fileOut= new FileOutputStream("c:/workbook.xls"); wb.write(fileOut); fileOut.close(); } } |
經過這個例子,咱們在c盤下創建的是一個空白的xls文件(不是空文件)。在此基礎上,咱們能夠進一步看其它的例子。
import org.apache.poi.hssf.usermodel.*; import java.io.FileOutputStream; import java.io.IOException; public class CreateCells { public static void main(String[] args) throws IOException { HSSFWorkbook wb = new HSSFWorkbook(); //創建新HSSFWorkbook對象 HSSFSheet sheet = wb.createSheet("new sheet"); //創建新的sheet對象 HSSFRow row = sheet.createRow((short)0); //在sheet裏建立一行,參數爲行號(第一行,此處可想象成數組) HSSFCell cell = row.createCell((short)0); //在row裏創建新cell(單元格),參數爲列號(第一列) cell.setCellvalue(1); //設置cell的整數類型的值 row.createCell((short)1).setCellvalue(1.2); //設置cell浮點類型的值 row.createCell((short)2).setCellvalue("test"); //設置cell字符類型的值 row.createCell((short)3).setCellvalue(true); //設置cell布爾類型的值 HSSFCellStyle cellStyle = wb.createCellStyle(); //創建新的cell樣式 cellStyle.setDataFormat(HSSFDataFormat. getBuiltinFormat("m/d/yy h:mm")); //設置cell樣式爲定製的日期格式 HSSFCell dCell =row.createCell((short)4); dCell.setCellvalue(new Date()); //設置cell爲日期類型的值 dCell.setCellStyle(cellStyle); //設置該cell日期的顯示格式 HSSFCell csCell =row.createCell((short)5); csCell.setEncoding(HSSFCell.ENCODING_UTF_16); //設置cell編碼解決中文高位字節截斷 csCell.setCellvalue("中文測試_Chinese Words Test"); //設置中西文結合字符串 row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR); //創建錯誤cell FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); } } |
經過這個例子,咱們能夠清楚的看到xls文件從大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell這樣幾個對象。咱們能夠在cell中設置各類類型的值。
尤爲要注意的是若是你想正確的顯示非歐美的字符時,尤爲象中日韓這樣的語言,必須設置編碼爲16位的便是HSSFCell.ENCODING_UTF_16,才能保證字符的高8位不被截斷而引發編碼失真造成亂碼。
其餘測試能夠經過參考examples包中的測試例子掌握poi的詳細用法,包括字體的設置,cell大小和低紋的設置等。須要注意的是POI是一個仍然在完善中的公開代碼的項目,因此有些功能正在不斷的擴充。
感受上面的操做比較的繁瑣,而後就本身寫了一個方法。這個方法不須要事先建立row和cell,直接進行cteateCell就能夠了,在程序中會自動進行判斷,若是不存在的話會建立。
private static void cteateCell(HSSFWorkbook wb,HSSFRow row,short col,short align,String val){ HSSFCell cell = row.createCell(col); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(val); HSSFCellStyle cellstyle = wb.createCellStyle(); cellstyle.setAlignment(align); cell.setCellStyle(cellstyle); } |
對裏面的幾個參數的說明:
short col 應該是你的cell單元格的位置也就是列號;
short align 應該是你的對齊方式;
String val 應該是你單元格里面要添加的值;
具體的調用以下:
HSSFRow row = sheet.createRow((short)1); cteateCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER_SELECTION,"SampleID"); |
在上邊的例子裏咱們看到了要設置一個單元格里面信息的格式(例如,要將信息居中)設置的操做以下:
HSSFCellStyle cellstyle = wb.createCellStyle(); cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION); cell.setCellStyle(cellstyle); |
還有咱們咱們常常會用到的合併單元格,在這裏咱們也有這樣的操做,代碼以下:
sheet.addMergedRegion(new Region(1,(short)1,2,(short)4)); |
這裏面咱們還要介紹一個常常會遇到的問題,就是怎麼來凍結一個窗口。poi也爲咱們集成了這樣的事情了。代碼以下:
sheet.createFreezePane(1,2); |
l 在這裏咱們須要注意的是
1、 該方法是在一個具體的sheet裏面來進行操做。
2、 方法createFreezepane;有2個參數。前一個參數表明列;後一個參數表明行。
上邊的代碼對應的excel文件以下:
我麼在畫面上看到了明顯的兩條黑線,這就是凍結的窗口。
而後咱們來看一個完整的STRUTS的小例子,在這個例子裏面咱們要作的事情是要模擬移動公司的網上營業廳裏面的一個功能,咱們要把一個客戶當月的通話記錄和各類信息查詢出來,而且生成一張excel報表。首先,咱們來看一下網上效果的截圖。