介绍
POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI可以操作的文档格式有excel,word,powerpoint等,POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet。
跨第1行第1个到第2个单元格的操作为
java" id="highlighter_539954">
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();
}
}
}
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。