10、借助POI实现Java生成并打印excel报表(1)

时间:2021-01-04 19:14:59

10.1、了解 Apache POI

实际开发中,用到最多的是把数据库中数据导出生成报表,尤其是在生产管理或者财务系统中用的非常普遍。生成报表格式一般是EXCEL或者PDF 。利用Apache  POI实现数据库中数据导出生成excel报表。在java众多数据导出excel报表的第三方jar包中POI相对来说比较好用。

       

      Apache POI 是用Java编写的免费开源的跨平台 API,给Java提供对Microsoft Office格式档案读和写的功能,创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE2复合文档格式(OLE2)。借助POI,Java可以读取、创建和修改MS Excel文件、MS Word文件及MSPowerPoint文件,其中office2003、2010均可以。下面是Apache POI 中提供的几大部分的作用:

HSSF - 提供读写Microsoft Excel XLS格式档案的功能。

HSSF - 提供读写Microsoft Excel XLS格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。

HWPF - 提供读写Microsoft Word DOC格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读Microsoft Visio格式档案的功能。

HPBF - 提供读Microsoft Publisher格式档案的功能。

HSMF - 提供读Microsoft Outlook格式档案的功能。

创建一个excel报表步骤:

1. 创建新的Excel工作薄

HSSFWorkbook workbook = new HSSFWorkbook();

在Excel工作簿中建一工作表,其名为缺省值。POI中还提供了其他的一些workbook 构造方法。

2.创建一个工作表。新建一名为"工资表"的工作表:  

HSSFSheet sheet = workbook.createSheet("工资表");

3.创建行。在索引0的位置创建行(最顶端的行):  

HSSFRow row = sheet.createRow(0);

4.创建单元格。在索引0的位置创建单元格(左上端):  

HSSFCell cell = row.createCell((short) 0);

定义单元格为字符串类型(也可在创建单元格里面设置):

cell.setCellType(HSSFCell.CELL_TYPE_STRING);

在单元格中输入一些内容: 

cell.setCellValue("增加值");

5.新建一输出文件流,把相应的Excel工作簿输出到本地

FileOutputStream fOut = new FileOutputStream(outputFile);

workbook.write(fOut);

fOut.flush();

操作结束,关闭文件

fOut.close();

在给单元格设置下从数据库中读取的数据。这样就可以把数据库里面的内容导入到excel了。

10.2、常用方法列举:

对象种类:

HSSFWorkbook excell的文档对象

HSSFSheet excell的表单

HSSFRow excell的行

HSSFCell excell的格子单元

HSSFFont excell字体

HSSFName 名称

HSSFDataFormat 日期格式

常用方法:

1.合并单元格

sheet.addMergedRegion(new Region(beginRowIndex , (short) beginColumnIndex , endRowIndex , (short) endColumnIndex ));

即从A行的B列,合并到C行的D列。可以理解为一块面积。

2.设置页脚

HSSFFooter foot = sheet.getFooter();

foot.setLeft("左边文字:");

foot.setCenter("中间文字:");

foot.setRight(HSSFFooter.page()+"/"+HSSFFooter.numPages());//显示的为:当前页/总页数。如:1/3

3.生成Excel的思想

灵活应用java提供的数据结构(List,Map,Set)。通常习惯把每个sheet定义为一个Map元素.即:

Map<sheet名,数据集合>.  至于数据集合,则可根据实际情况组成相应的数据结构。总之,灵活应用数据结构: 生成Excel的逻辑可扩展性相当好,而且扩展起来甚是方便,并可以在一定程序上实现Excel的动态化。

样式示例:(整数型、浮点型、布尔型、字符串型、日期格式、中西文结合式)

 import org.apache.poi.hssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
publicclass CreateCells
{
publicstaticvoid main(String[] args)
throws IOException
{
HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象
HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short)0);//建立新行
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short)0);//建立新cell
cell.setCellValue(1);//设置cell的整数类型的值
// Or do it on one line.
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.getFormat("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
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
}
}

10.3、程序模块

在表格中间插入创建行:

1  public void createNewRow(){
2 //下移行的条件有2个:当前行非初始行,且当前行没有超过最后一行
3 if(this.currRowIndex!=this.initRowIndex && this.lastRowIndex>this.currRowIndex){
4 //将指定的几行进行下移一行
5 sheet.shiftRows(this.currRowIndex, this.lastRowIndex, 1, true, true);
6 //既然下移了那么最后一行下标就也要增大了
7 this.lastRowIndex++;
8 }
9 //在指定的行上创建一个空行(如果此行原本有单元格和数据,那么也会被空行覆盖,且创建出来的空行是没有单元格的)
10 this.currRow = sheet.createRow(this.currRowIndex);
11 this.currRow.setHeightInPoints(this.defaultRowHeight);
12 this.currRowIndex++;
13 this.currColIndex = this.initColIndex;
14 }

单元格前(背)景色、(顶底左右)边框及颜色、位置样式设置:

 /**
* 样式设置
*/
public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook){
// *生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
// 前景色
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
// 背景色
style.setFillBackgroundColor(HSSFColor.GREEN.index);
// 填充样式
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 设置底边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
// 设置底边框颜色
style.setBottomBorderColor(HSSFColor.BLACK.index);
// 设置左边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
// 设置左边框颜色
style.setLeftBorderColor(HSSFColor.BLACK.index);
// 设置右边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
// 设置右边框颜色
style.setRightBorderColor(HSSFColor.BLACK.index);
// 设置顶边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
// 设置顶边框颜色
style.setTopBorderColor(HSSFColor.BLACK.index);
// 设置自动换行
style.setWrapText(false);
// 设置水平对齐的样式为居中对齐
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 设置垂直对齐的样式为居中对齐
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// HSSFFont font = createCellFont(workbook);
// // 把字体应用到当前的样式
// style.setFont(font);
return style;
}

单元格字体样式设置:

 /**
* 字体设置
*/
public static HSSFFont createCellFont(HSSFWorkbook workbook){
// *生成一个字体
HSSFFont font = workbook.createFont();
// 字体颜色
font.setColor(HSSFColor.VIOLET.index);
// 字体大小
font.setFontHeightInPoints((short) 12);
// 字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 是否使用斜体
font.setItalic( true );
// 是否使用划线
//font.setStrikeout(true);
// 字体名字
font.setFontName( " 黑体 " );
return font;
}

保留小数位数样式设置:

 /**
* 保留2位小数
*/
4 HSSFCellStyle cellStyle = workbook.createCellStyle();
Short doubleFormat = workbook.createDataFormat().getFormat("0.00");
cellStyle.setDataFormat(doubleFormat);
cellStyle.setDataFormat(doubleFormat);

注释设置:

 /**
* 注释设置
*/
public static HSSFComment createCellComment(HSSFPatriarch patriarch, String commentText, String commentName){
// *添加单元格注释
// 定义注释的大小和位置,详见文档
HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 2, 2));
// 设置注释内容
comment.setString(new HSSFRichTextString(commentText));
// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor(commentName);
return comment;
}

图片插入设置:

 /**
* 图片插入
*/
public static void createCellPicture(HSSFWorkbook workbook, HSSFPatriarch patriarch, String url, int col, int row) throws Exception{
//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
BufferedImage bufferImg =null;
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
bufferImg = ImageIO.read(new File( url ));
ImageIO.write(bufferImg,"jpg",byteArrayOut);
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,1023, 255, (short) col, row, (short) col, row);
anchor.setAnchorType(3);
//插入图片
patriarch.createPicture(anchor , workbook.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
byteArrayOut.flush();
byteArrayOut.close();
}

10.4、实例:

报表生成类:ComplexExportExcelClient.java

1 package com.bzu.search.action;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.apache.poi.hssf.usermodel.HSSFCell;
7 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
8 import org.apache.poi.hssf.usermodel.HSSFFont;
9 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
10 import org.apache.poi.hssf.usermodel.HSSFRow;
11 import org.apache.poi.hssf.usermodel.HSSFSheet;
12 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
13 import org.apache.poi.hssf.util.Region;
14
15 /**
16 * 拒绝件报表生成类.
17 *
18 * @author caoyb
19 * @version $Revision:$
20 */
21 public class ComplexExportExcelClient {
22
23 private static HSSFWorkbook wb = new HSSFWorkbook();
24
25 private static HSSFSheet sheet = wb.createSheet();
26
27 @SuppressWarnings({ "unchecked", "deprecation" })
28 public static void main(String[] args) {
29
30 ExportExcel exportExcel = new ExportExcel(wb, sheet);
31
32 // 创建列标头LIST
33 List fialList = new ArrayList();
34
35 fialList.add("申请人未提供任何联系方式");
36 fialList.add("无工作单位信息且未提供收入来源信息");
37 fialList.add("有工作单位但未提供单位地址或电话");
38 fialList.add("家庭地址缺失");
39 fialList.add("客户身份证明资料缺");
40 fialList.add("签名缺失或签名不符合要求");
41 fialList.add("其它");
42
43 List errorList = new ArrayList();
44
45 errorList.add("客户主动取消");
46 errorList.add("个人征信不良");
47 errorList.add("欺诈申请");
48 errorList.add("申请人基本条件不符");
49 errorList.add("申请材料不合规");
50 errorList.add("无法正常完成征信");
51 errorList.add("重复申请");
52 errorList.add("其他");
53
54 // 计算该报表的列数
55 int number = 2 + fialList.size() * 2 + errorList.size() * 2;
56
57 // 给工作表列定义列宽(实际应用自己更改列数)
58 for (int i = 0; i < number; i++) {
59 sheet.setColumnWidth(i, 3000);
60 }
61
62 // 创建单元格样式
63 HSSFCellStyle cellStyle = wb.createCellStyle();
64
65 // 指定单元格居中对齐
66 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
67
68 // 指定单元格垂直居中对齐
69 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
70
71 // 指定当单元格内容显示不下时自动换行
72 cellStyle.setWrapText(true);
73
74 // 设置单元格字体
75 HSSFFont font = wb.createFont();
76 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
77 font.setFontName("宋体");
78 font.setFontHeight((short) 200);
79 cellStyle.setFont(font);
80
81 // 创建报表头部
82 exportExcel.createNormalHead("南京地区申请资料拒件分析统计", number);
83
84 // 设置第二行
85 String[] params = new String[] { " 年 月 日", " 年 月 日" };
86 exportExcel.createNormalTwoRow(params, number);
87
88 // 设置列头
89 HSSFRow row2 = sheet.createRow(2);
90
91 HSSFCell cell0 = row2.createCell(0);
92 cell0.setCellStyle(cellStyle);
93 cell0.setCellValue(new HSSFRichTextString("机构代码"));
94
95 HSSFCell cell1 = row2.createCell(1);
96 cell1.setCellStyle(cellStyle);
97 cell1.setCellValue(new HSSFRichTextString("支行名称"));
98
99 HSSFCell cell2 = row2.createCell(2);
100 cell2.setCellStyle(cellStyle);
101 cell2.setCellValue(new HSSFRichTextString("无效件"));
102
103 HSSFCell cell3 = row2.createCell(2 * fialList.size() + 2);
104 cell3.setCellStyle(cellStyle);
105 cell3.setCellValue(new HSSFRichTextString("拒绝件"));
106
107 HSSFRow row3 = sheet.createRow(3);
108
109 // 设置行高
110 row3.setHeight((short) 800);
111
112 HSSFCell row3Cell = null;
113 int m = 0;
114 int n = 0;
115
116 // 创建不同的LIST的列标题
117 for (int i = 2; i < number; i = i + 2) {
118
119 if (i < 2 * fialList.size() + 2) {
120 row3Cell = row3.createCell(i);
121 row3Cell.setCellStyle(cellStyle);
122 row3Cell.setCellValue(new HSSFRichTextString(fialList.get(m)
123 .toString()));
124 m++;
125 } else {
126 row3Cell = row3.createCell(i);
127 row3Cell.setCellStyle(cellStyle);
128 row3Cell.setCellValue(new HSSFRichTextString(errorList.get(n)
129 .toString()));
130 n++;
131 }
132
133 }
134
135 // 创建最后一列的合计列
136 row3Cell = row3.createCell(number);
137 row3Cell.setCellStyle(cellStyle);
138 row3Cell.setCellValue(new HSSFRichTextString("合计"));
139
140 // 合并单元格
141 HSSFRow row4 = sheet.createRow(4);
142
143 // 合并第一列的 第三行到第五行
144 sheet.addMergedRegion(new Region(2, (short) 0, 4, (short) 0));
145
146 // 合并第二行的 第三行到第五行
147 sheet.addMergedRegion(new Region(2, (short) 1, 4, (short) 1));
148
149 // 合并第三行的 第三列到第AA指定的列
150 int aa = 2 * fialList.size() + 1;
151 sheet.addMergedRegion(new Region(2, (short) 2, 2, (short) aa));
152
153 int start = aa + 1;
154
155 sheet.addMergedRegion(new Region(2, (short) start, 2,
156 (short) (number - 1)));
157
158 // 循环合并第四行的行,并且是每2列合并成一列
159 for (int i = 2; i < number; i = i + 2) {
160 sheet.addMergedRegion(new Region(3, (short) i, 3, (short) (i + 1)));
161
162 }
163
164 // 根据列数奇偶数的不同创建不同的列标题
165 for (int i = 2; i < number; i++) {
166 if (i < 2 * fialList.size() + 2) {
167
168 if (i % 2 == 0) {
169 HSSFCell cell = row4.createCell(i);
170 cell.setCellStyle(cellStyle);
171 cell.setCellValue(new HSSFRichTextString("无效量"));
172 } else {
173 HSSFCell cell = row4.createCell(i);
174 cell.setCellStyle(cellStyle);
175 cell.setCellValue(new HSSFRichTextString("占比"));
176 }
177 } else {
178 if (i % 2 == 0) {
179 HSSFCell cell = row4.createCell(i);
180 cell.setCellStyle(cellStyle);
181 cell.setCellValue(new HSSFRichTextString("拒绝量"));
182 } else {
183 HSSFCell cell = row4.createCell(i);
184 cell.setCellStyle(cellStyle);
185 cell.setCellValue(new HSSFRichTextString("占比"));
186 }
187 }
188
189 }
190
191 // 循环创建中间的单元格的各项的值
192 for (int i = 5; i < number; i++) {
193 HSSFRow row = sheet.createRow((short) i);
194 for (int j = 0; j <= number; j++) {
195 exportExcel
196 .cteateCell(wb, row, (short) j,
197 HSSFCellStyle.ALIGN_CENTER_SELECTION, String
198 .valueOf(j));
199 }
200
201 }
202
203 // 创建最后一行的合计行
204 String[] cellValue = new String[number - 1];
205 for (int i = 0; i < number - 1; i++) {
206 cellValue[i] = String.valueOf(i);
207
208 }
209 exportExcel.createLastSumRow(1, cellValue);
210
211 exportExcel.outputExcel("c:\\拒绝件统计.xls");
212
213 }
214 }

EXCEL报表工具类:ExportExcel.java

 package com.bzu.search.action;  

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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;
import org.apache.poi.hssf.util.Region; /**
* EXCEL报表工具类.
*
* @author caoyb
* @version $Revision:$
*/
public class ExportExcel { private HSSFWorkbook wb = null; private HSSFSheet sheet = null; /**
* @param wb
* @param sheet
*/
public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) {
super();
this.wb = wb;
this.sheet = sheet;
} /**
* @return the sheet
*/
public HSSFSheet getSheet() {
return sheet;
} /**
* @param sheet
* the sheet to set
*/
public void setSheet(HSSFSheet sheet) {
this.sheet = sheet;
} /**
* @return the wb
*/
public HSSFWorkbook getWb() {
return wb;
} /**
* @param wb
* the wb to set
*/
public void setWb(HSSFWorkbook wb) {
this.wb = wb;
} /**
* 创建通用EXCEL头部
*
* @param headString
* 头部显示的字符
* @param colSum
* 该报表的列数
*/
public void createNormalHead(String headString, int colSum) { HSSFRow row = sheet.createRow(0); // 设置第一行
HSSFCell cell = row.createCell(0);
row.setHeight((short) 400); // 定义单元格为字符串类型
cell.setCellType(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(new HSSFRichTextString("南京城区各网点进件统计报表")); // 指定合并区域
sheet.addMergedRegion(new Region(0, (short) 0, 0, (short) colSum)); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
cellStyle.setWrapText(true);// 指定单元格自动换行 // 设置单元格字体
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeight((short) 300);
cellStyle.setFont(font); cell.setCellStyle(cellStyle);
} /**
* 创建通用报表第二行
*
* @param params
* 统计条件数组
* @param colSum
* 需要合并到的列索引
*/
public void createNormalTwoRow(String[] params, int colSum) {
HSSFRow row1 = sheet.createRow(1);
row1.setHeight((short) 300); HSSFCell cell2 = row1.createCell(0); cell2.setCellType(HSSFCell.ENCODING_UTF_16);
cell2.setCellValue(new HSSFRichTextString("统计时间:" + params[0] + "至"
+ params[1])); // 指定合并区域
sheet.addMergedRegion(new Region(1, (short) 0, 1, (short) colSum)); HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
cellStyle.setWrapText(true);// 指定单元格自动换行 // 设置单元格字体
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeight((short) 250);
cellStyle.setFont(font); cell2.setCellStyle(cellStyle); } /**
* 设置报表标题
*
* @param columHeader
* 标题字符串数组
*/
public void createColumHeader(String[] columHeader) { // 设置列头
HSSFRow row2 = sheet.createRow(2); // 指定行高
row2.setHeight((short) 600); HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
cellStyle.setWrapText(true);// 指定单元格自动换行 // 单元格字体
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeight((short) 250);
cellStyle.setFont(font); /*
* cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单无格的边框为粗体
* cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色.
* cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
* cellStyle.setLeftBorderColor(HSSFColor.BLACK.index);
* cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
* cellStyle.setRightBorderColor(HSSFColor.BLACK.index);
* cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
* cellStyle.setTopBorderColor(HSSFColor.BLACK.index);
*/ // 设置单元格背景色
cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFCell cell3 = null; for (int i = 0; i < columHeader.length; i++) {
cell3 = row2.createCell(i);
cell3.setCellType(HSSFCell.ENCODING_UTF_16);
cell3.setCellStyle(cellStyle);
cell3.setCellValue(new HSSFRichTextString(columHeader[i]));
} } /**
* 创建内容单元格
*
* @param wb
* HSSFWorkbook
* @param row
* HSSFRow
* @param col
* short型的列索引
* @param align
* 对齐方式
* @param val
* 列值
*/
public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align,
String val) {
HSSFCell cell = row.createCell(col);
cell.setCellType(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(new HSSFRichTextString(val));
HSSFCellStyle cellstyle = wb.createCellStyle();
cellstyle.setAlignment(align);
cell.setCellStyle(cellstyle);
} /**
* 创建合计行
*
* @param colSum
* 需要合并到的列索引
* @param cellValue
*/
public void createLastSumRow(int colSum, String[] cellValue) { HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
cellStyle.setWrapText(true);// 指定单元格自动换行 // 单元格字体
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeight((short) 250);
cellStyle.setFont(font); HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));
HSSFCell sumCell = lastRow.createCell(0); sumCell.setCellValue(new HSSFRichTextString("合计"));
sumCell.setCellStyle(cellStyle);
sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0,
sheet.getLastRowNum(), (short) colSum));// 指定合并区域 for (int i = 2; i < (cellValue.length + 2); i++) {
sumCell = lastRow.createCell(i);
sumCell.setCellStyle(cellStyle);
sumCell.setCellValue(new HSSFRichTextString(cellValue[i - 2])); } } /**
* 输入EXCEL文件
*
* @param fileName
* 文件名
*/
public void outputExcel(String fileName) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(fileName));
wb.write(fos);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

运行上述两段代码你就会在c盘的根目录下看到一个拒绝件统计.xls文件