POI報表
--用POI與Excel交互
AURISOFT
第一章 POI簡介
--Jakata Poi HSSF:純java的Excel解決方案
在我們實際的開發中,表現層的解決方案雖然有多樣,但是IE瀏覽器已成為最多人使用的瀏覽器,因為大家都用Windows。在企業辦公系統中,常常有客戶這樣子要求:你要把我們的報表直接用Excel打開(電信系統、銀行系統)。或者是:我們已經習慣用Excel打印。
Apache的Jakata項目的POI子項目,目前比較成熟的是HSSF接口,處理MSExcel對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。
首先,理解一下一個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的行
HSSFCell excel的格子單元
HSSFFont excel字體
HSSFDataFormat 日期格式
在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文件。
|
||
通過這個例子,我們在c盤下建立的是一個空白的xls文件(不是空文件)。在此基礎上,我們可以進一步看其它的例子。
|
通過這個例子,我們可以清楚的看到xls文件從大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell這樣幾個對象。我們可以在cell中設置各種類型的值。
尤其要注意的是如果你想正確的顯示非歐美的字符時,尤其象中日韓這樣的語言,必須設置編碼為16位的即是HSSFCell.ENCODING_UTF_16,才能保證字符的高8位不被截斷而引起編碼失真形成亂碼。
其他測試可以通過參考examples包中的測試例子掌握poi的詳細用法,包括字體的設置,cell大小和低紋的設置等。需要注意的是POI是一個仍然在完善中的公開代碼的項目,所以有些功能正在不斷的擴充。
感覺上面的操作比較的繁瑣,然后就自己寫了一個方法。這個方法不需要事先創建row和cell,直接進行cteateCell就可以了,在程序中會自動進行判斷,如果不存在的話會創建。
|
對里面的幾個參數的說明:
short col 應該是你的cell單元格的位置也就是列號;
short align 應該是你的對齊方式;
String val 應該是你單元格里面要添加的值;
具體的調用如下:
|
在上邊的例子里我們看到了要設置一個單元格里面信息的格式(例如,要將信息居中)設置的操作如下:
|
還有我們我們經常會用到的合并單元格,在這里我們也有這樣的操作,代碼如下:
sheet.addMergedRegion(new Region(1,(short)1,2,(short)4)); |
這里面我們還要介紹一個經常會遇到的問題,就是怎么來凍結一個窗口。poi也為我們集成了這樣的事情了。代碼如下:
|
l 在這里我們需要注意的是
一、 該方法是在一個具體的sheet里面來進行操作。
二、 方法createFreezepane;有2個參數。前一個參數代表列;后一個參數代表行。
上邊的代碼對應的excel文件如下:
我么在畫面上看到了明顯的兩條黑線,這就是凍結的窗口。
然后我們來看一個完整的小例子,在這個例子里面我們要做的事情是要把數據庫里面的一張表,把他里面的數據導出到一個具體的Excel文件當中。首先,我們來做一個數據庫連接的bean。
|
然后就是我們具體的FixationExcel這個類了,這里面寫的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
import java.io.FileOutputStream; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; 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.Region; public class FixationExcel implements SuperExcel { private HSSFWorkbook wb= null ; public FixationExcel() { wb= new HSSFWorkbook(); } public void createFixationSheet(ResultSet res) { HSSFSheet sheet=wb.createSheet( "new sheet" ); wb.setSheetName( 0 , "Case-control" ,HSSFWorkbook.ENCODING_UTF_16); HSSFRow row=sheet.createRow(( short ) 0 ); sheet.createFreezePane( 1 , 2 ); HSSFCell cell=row.createCell(( short ) 6 ); cell.setCellValue( "SNP110" ); HSSFCellStyle cellstyle=wb.createCellStyle(); cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION); cell.setCellStyle(cellstyle); sheet.addMergedRegion( new Region( 0 ,( short ) 6 , 0 ,( short ) 7 )); HSSFCell cell1=row.createCell(( short ) 8 ); cell1.setCellValue( "SNP102" ); cell1.setCellStyle(cellstyle); sheet.addMergedRegion( new Region( 0 ,( short ) 8 , 0 ,( short ) 9 )); HSSFRow row1=sheet.createRow(( short ) 1 ); cteateCell(wb,row1,( short ) 0 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "SampleID" ); cteateCell(wb,row1,( short ) 1 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "ID" ); cteateCell(wb,row1,( short ) 2 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "PID" ); cteateCell(wb,row1,( short ) 3 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "MID" ); cteateCell(wb,row1,( short ) 4 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "Sex" ); cteateCell(wb,row1,( short ) 5 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "Status" ); cteateCell(wb,row1,( short ) 6 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "A1-C" ); cteateCell(wb,row1,( short ) 7 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "A1-T" ); cteateCell(wb,row1,( short ) 8 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "A2-A" ); cteateCell(wb,row1,( short ) 9 ,HSSFCellStyle.ALIGN_CENTER_SELECTION, "A2-G" ); int ii= 0 ; try { int i= 1 ; ii=res.getMetaData().getColumnCount(); while (res.next()) { i++; HSSFRow row2=sheet.createRow(( short )i); for ( int j= 0 ;j<ii;j++) { String ss= "" ; if (res.getString(j+ 1 )== null ) ss= "空 null" ; else ss=res.getString(j+ 1 ); cteateCell(wb,row2,( short )j, HSSFCellStyle.ALIGN_CENTER_SELECTION,ss); } } } catch (SQLException e) { e.printStackTrace(); } } private 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); } public void writeExcel(String filename) throws Exception { FileOutputStream fileout= new FileOutputStream(filename+ ".xls" ); wb.write(fileout); fileout.flush(); fileout.close(); } } |
原文:http://my.oschina.net/yangzhiyuan/blog/214131
文章列表