文章出處

POI報表

--POIExcel交互

AURISOFT

第一章 POI簡介

--Jakata Poi HSSF:純javaExcel解決方案

在我們實際的開發中,表現層的解決方案雖然有多樣,但是IE瀏覽器已成為最多人使用的瀏覽器,因為大家都用Windows。在企業辦公系統中,常常有客戶這樣子要求:你要把我們的報表直接用Excel打開(電信系統、銀行系統)。或者是:我們已經習慣用Excel打印。

ApacheJakata項目的POI子項目,目前比較成熟的是HSSF接口,處理MSExcel對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。

首先,理解一下一個Excel的文件的組織形式,一個Excel文件對應于一個workbook(HSSFWorkbook),一個workbook可以有多個sheetHSSFSheet)組成,一個sheet是由多個rowHSSFRow)組成,一個row是由多個cellHSSFCell)組成。

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文件。    

1
2
3
4
5
6
7
8
9
10
11
12
13
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文件(不是空文件)。在此基礎上,我們可以進一步看其它的例子。    

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
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是一個仍然在完善中的公開代碼的項目,所以有些功能正在不斷的擴充。

感覺上面的操作比較的繁瑣,然后就自己寫了一個方法。這個方法不需要事先創建rowcell,直接進行cteateCell就可以了,在程序中會自動進行判斷,如果不存在的話會創建。    

1
2
3
4
5
6
7
8
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 應該是你單元格里面要添加的值;

具體的調用如下:    

1
2
HSSFRow row = sheet.createRow((short)1);
cteateCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER_SELECTION,"SampleID");

 

在上邊的例子里我們看到了要設置一個單元格里面信息的格式(例如,要將信息居中)設置的操作如下:    

1
2
3
HSSFCellStyle cellstyle = wb.createCellStyle();
cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
cell.setCellStyle(cellstyle);

 

還有我們我們經常會用到的合并單元格,在這里我們也有這樣的操作,代碼如下:    

sheet.addMergedRegion(new Region(1,(short)1,2,(short)4));

clip_image002

這里面我們還要介紹一個經常會遇到的問題,就是怎么來凍結一個窗口。poi也為我們集成了這樣的事情了。代碼如下:    

1
sheet.createFreezePane(1,2);

 

l 在這里我們需要注意的是

一、 該方法是在一個具體的sheet里面來進行操作。

二、 方法createFreezepane;2個參數。前一個參數代表列;后一個參數代表行。

上邊的代碼對應的excel文件如下:

clip_image004

我么在畫面上看到了明顯的兩條黑線,這就是凍結的窗口。

然后我們來看一個完整的小例子,在這個例子里面我們要做的事情是要把數據庫里面的一張表,把他里面的數據導出到一個具體的Excel文件當中。首先,我們來做一個數據庫連接的bean    

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
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class AA
{
public static void main(String[] args)
{
String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=master";
//為了方便測試,我連接的數據庫是master
Connection con = null;
Statement sta = null;
ResultSet res=null
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = DriverManager.getConnection(url, "sa""");
sta = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY); 
res=sta.executeQuery("select * from spt_values"); 
//查詢的是master面的一張表 
catch (Exception e) {
e.printStackTrace();
try
{
FixationExcel fe=new FixationExcel();
fe.createFixationSheet(res);
// createFixationSheet()方法要接收一個ResultSet類型的參數
fe.writeExcel("FirstExcel"); 
//此處的FirstExcel是你要生成的excel文件的名字 
}
catch(Exception e)
{
System.out.println("AAAAAAAAAA");
e.printStackTrace();
System.out.println("");
}
}

 

然后就是我們具體的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

相關:Java生成和操作Excel文件


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()