介紹
POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。POI可以操作的文檔格式有excel,word,powerpoint等,POI進行跨行需要用到對象HSSFSheet對象,現在就當我們程序已經定義了一個HSSFSheet對象sheet。
跨第1行第1個到第2個單元格的操作為
1
|
sheet.addMergedRegion( new Region( 0 ,( short ) 0 , 0 ,( short ) 1 )); |
跨第1行第1個到第2行第1個單元格的操作為
1
|
sheet.addMergedRegion( new Region( 0 ,( short ) 0 , 1 ,( short ) 0 )); |
重點注意事項:
1.單元格CELL和ROW對象下標都是從0開始的。
2.單元格合并時Region(1,2,3,4)第1個值的行號必須要比3位置的行號小,如果大于3就不能正常合并單元格
3.合并單元格的時候要合并的單單元格必須先創建,這樣方便后面再次獲取這個單元格來填充數據,主要就是因為合并時不能由后向前進行合并引起的。
示例代碼
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
import java.io.IOException; 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 ExcelTest { /** * @param args */ public static void main(String[] args) throws IOException { try { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet( "new sheet" ); HSSFCellStyle style = wb.createCellStyle(); // 樣式對象 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平 HSSFRow row = sheet.createRow(( short ) 0 ); HSSFRow row2 = sheet.createRow(( short ) 1 ); sheet.addMergedRegion( new Region( 0 , ( short ) 0 , 1 , ( short ) 0 )); HSSFCell ce = row.createCell(( short ) 0 ); ce.setEncoding(HSSFCell.ENCODING_UTF_16); // 中文處理 ce.setCellValue( "項目\\日期" ); // 表格的第一行第一列顯示的數據 ce.setCellStyle(style); // 樣式,居中 int num = 0 ; for ( int i = 0 ; i < 9 ; i++) { // 循環9次,每一次都要跨單元格顯示 // 計算從那個單元格跨到那一格 int celln = 0 ; int celle = 0 ; if (i == 0 ) { celln = 0 ; celle = 1 ; } else { celln = (i * 2 ); celle = (i * 2 + 1 ); } // 單元格合并 // 四個參數分別是:起始行,起始列,結束行,結束列 sheet.addMergedRegion( new Region( 0 , ( short ) (celln + 1 ), 0 , ( short ) (celle + 1 ))); HSSFCell cell = row.createCell(( short ) (celln + 1 )); cell.setCellValue( "merging" + i); // 跨單元格顯示的數據 cell.setCellStyle(style); // 樣式 // 不跨單元格顯示的數據,如:分兩行,上一行分別兩格為一格,下一行就為兩格,“數量”,“金額” HSSFCell cell1 = row2.createCell(( short ) celle); HSSFCell cell2 = row2.createCell(( short ) (celle + 1 )); cell1.setEncoding(HSSFCell.ENCODING_UTF_16); cell1.setCellValue( "數量" ); cell1.setCellStyle(style); cell2.setEncoding(HSSFCell.ENCODING_UTF_16); cell2.setCellValue( "金額" ); cell2.setCellStyle(style); num++; } // 在后面加上合計百分比 // 合計 在最后加上,還要跨一個單元格 sheet.addMergedRegion( new Region( 0 , ( short ) ( 2 * num + 1 ), 0 , ( short ) ( 2 * num + 2 ))); HSSFCell cell = row.createCell(( short ) ( 2 * num + 1 )); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue( "合計" ); cell.setCellStyle(style); HSSFCell cell1 = row2.createCell(( short ) ( 2 * num + 1 )); HSSFCell cell2 = row2.createCell(( short ) ( 2 * num + 2 )); cell1.setEncoding(HSSFCell.ENCODING_UTF_16); cell1.setCellValue( "數量" ); cell1.setCellStyle(style); cell2.setEncoding(HSSFCell.ENCODING_UTF_16); cell2.setCellValue( "金額" ); cell2.setCellStyle(style); // 百分比 同上 sheet.addMergedRegion( new Region( 0 , ( short ) ( 2 * num + 3 ), 0 , ( short ) ( 2 * num + 4 ))); HSSFCell cellb = row.createCell(( short ) ( 2 * num + 3 )); cellb.setEncoding(HSSFCell.ENCODING_UTF_16); cellb.setCellValue( "百分比" ); cellb.setCellStyle(style); HSSFCell cellb1 = row2.createCell(( short ) ( 2 * num + 3 )); HSSFCell cellb2 = row2.createCell(( short ) ( 2 * num + 4 )); cellb1.setEncoding(HSSFCell.ENCODING_UTF_16); cellb1.setCellValue( "數量" ); cellb1.setCellStyle(style); cellb2.setEncoding(HSSFCell.ENCODING_UTF_16); cellb2.setCellValue( "金額" ); cellb2.setCellStyle(style); /***這里是問題的關鍵,將這個工作簿寫入到一個流中就可以輸出相應的名字,這里需要寫路徑就ok了。 FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); **/ /**第二種是輸出到也面中的excel名稱 * pName="欄目統計表"; response.reset(); response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition","attachment; filename="+new String(pName.getBytes("gb2312"),"ISO-8859-1")+".xls"); ServletOutputStream outStream=null; try{ outStream = response.getOutputStream(); wb.write(outStream); }catch(Exception e) { e.printStackTrace(); }finally{ outStream.close(); } * */ System.out.print( "OK" ); } catch (Exception ex) { ex.printStackTrace(); } } } |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。