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

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的动态化。

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

 1 import org.apache.poi.hssf.usermodel.*;  
 2 import java.io.FileOutputStream;  
 3 import java.io.IOException;  
 4 publicclass CreateCells  
 5 {  
 6 publicstaticvoid main(String[] args)  
 7 throws IOException  
 8 {  
 9 HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象
10 HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象
11 // Create a row and put some cells in it. Rows are 0 based.
12 HSSFRow row = sheet.createRow((short)0);//建立新行
13 // Create a cell and put a value in it.
14 HSSFCell cell = row.createCell((short)0);//建立新cell
15 cell.setCellValue(1);//设置cell的整数类型的值
16 // Or do it on one line.
17 row.createCell((short)1).setCellValue(1.2);//设置cell浮点类型的值
18 row.createCell((short)2).setCellValue("test");//设置cell字符类型的值
19 row.createCell((short)3).setCellValue(true);//设置cell布尔类型的值
20 HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式
21 cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//设置cell样式为定制的日期格式
22 HSSFCell dCell =row.createCell((short)4);  
23 dCell.setCellValue(new Date());//设置cell为日期类型的值
24 dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式
25 HSSFCell csCell =row.createCell((short)5);  
26 csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断
27 csCell.setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串
28 row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立错误cell
29 // Write the output to a file
30 FileOutputStream fileOut = new FileOutputStream("workbook.xls");  
31 wb.write(fileOut);  
32 fileOut.close();  
33 }  
34 } 

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     }

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

 1 /**
 2      * 样式设置
 3      */
 4     public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook){
 5         // *生成一个样式
 6         HSSFCellStyle style = workbook.createCellStyle();
 7         // 设置这些样式
 8         // 前景色
 9         style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
10         // 背景色
11         style.setFillBackgroundColor(HSSFColor.GREEN.index);
12         // 填充样式
13         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
14         // 设置底边框
15         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
16         // 设置底边框颜色
17         style.setBottomBorderColor(HSSFColor.BLACK.index);
18         // 设置左边框
19         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
20         // 设置左边框颜色
21             style.setLeftBorderColor(HSSFColor.BLACK.index);
22         // 设置右边框
23         style.setBorderRight(HSSFCellStyle.BORDER_THIN);
24         // 设置右边框颜色
25             style.setRightBorderColor(HSSFColor.BLACK.index);
26         // 设置顶边框
27         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
28         // 设置顶边框颜色  
29             style.setTopBorderColor(HSSFColor.BLACK.index);
30             // 设置自动换行
31             style.setWrapText(false);
32             // 设置水平对齐的样式为居中对齐
33             style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
34             // 设置垂直对齐的样式为居中对齐
35             style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
36 //        HSSFFont font = createCellFont(workbook);
37 //        // 把字体应用到当前的样式
38 //        style.setFont(font);
39         return style;
40     }

单元格字体样式设置:

 1 /**
 2      * 字体设置
 3      */
 4     public static HSSFFont createCellFont(HSSFWorkbook workbook){
 5         // *生成一个字体
 6         HSSFFont font = workbook.createFont();
 7         // 字体颜色
 8         font.setColor(HSSFColor.VIOLET.index);
 9         // 字体大小
10         font.setFontHeightInPoints((short) 12);
11         // 字体加粗
12         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
13         // 是否使用斜体
14         font.setItalic( true );
15         // 是否使用划线
16         //font.setStrikeout(true);
17         // 字体名字
18         font.setFontName( " 黑体 " );
19         return font;
20     }

保留小数位数样式设置:

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

注释设置:

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

图片插入设置:

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

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

  1 package com.bzu.search.action;  
  2  
  3 import java.io.File;  
  4 import java.io.FileNotFoundException;  
  5 import java.io.FileOutputStream;  
  6 import java.io.IOException;  
  7  
  8 import org.apache.poi.hssf.usermodel.HSSFCell;  
  9 import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
 10 import org.apache.poi.hssf.usermodel.HSSFFont;  
 11 import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
 12 import org.apache.poi.hssf.usermodel.HSSFRow;  
 13 import org.apache.poi.hssf.usermodel.HSSFSheet;  
 14 import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
 15 import org.apache.poi.hssf.util.HSSFColor;  
 16 import org.apache.poi.hssf.util.Region;  
 17  
 18 /**  
 19  * EXCEL报表工具类.  
 20  *   
 21  * @author caoyb  
 22  * @version $Revision:$  
 23  */ 
 24 public class ExportExcel {  
 25  
 26     private HSSFWorkbook wb = null;  
 27  
 28     private HSSFSheet sheet = null;  
 29  
 30     /**  
 31      * @param wb  
 32      * @param sheet  
 33      */ 
 34     public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) {  
 35         super();  
 36         this.wb = wb;  
 37         this.sheet = sheet;  
 38     }  
 39  
 40     /**  
 41      * @return the sheet  
 42      */ 
 43     public HSSFSheet getSheet() {  
 44         return sheet;  
 45     }  
 46  
 47     /**  
 48      * @param sheet  
 49      *            the sheet to set  
 50      */ 
 51     public void setSheet(HSSFSheet sheet) {  
 52         this.sheet = sheet;  
 53     }  
 54  
 55     /**  
 56      * @return the wb  
 57      */ 
 58     public HSSFWorkbook getWb() {  
 59         return wb;  
 60     }  
 61  
 62     /**  
 63      * @param wb  
 64      *            the wb to set  
 65      */ 
 66     public void setWb(HSSFWorkbook wb) {  
 67         this.wb = wb;  
 68     }  
 69  
 70     /**  
 71      * 创建通用EXCEL头部  
 72      *   
 73      * @param headString  
 74      *            头部显示的字符  
 75      * @param colSum  
 76      *            该报表的列数  
 77      */ 
 78     public void createNormalHead(String headString, int colSum) {  
 79  
 80         HSSFRow row = sheet.createRow(0);  
 81  
 82         // 设置第一行  
 83         HSSFCell cell = row.createCell(0);  
 84         row.setHeight((short) 400);  
 85  
 86         // 定义单元格为字符串类型  
 87         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
 88         cell.setCellValue(new HSSFRichTextString("南京城区各网点进件统计报表"));  
 89  
 90         // 指定合并区域  
 91         sheet.addMergedRegion(new Region(0, (short) 0, 0, (short) colSum));  
 92  
 93         HSSFCellStyle cellStyle = wb.createCellStyle();  
 94  
 95         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
 96         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
 97         cellStyle.setWrapText(true);// 指定单元格自动换行  
 98  
 99         // 设置单元格字体  
100         HSSFFont font = wb.createFont();  
101         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
102         font.setFontName("宋体");  
103         font.setFontHeight((short) 300);  
104         cellStyle.setFont(font);  
105  
106         cell.setCellStyle(cellStyle);  
107     }  
108  
109     /**  
110      * 创建通用报表第二行  
111      *   
112      * @param params  
113      *            统计条件数组  
114      * @param colSum  
115      *            需要合并到的列索引  
116      */ 
117     public void createNormalTwoRow(String[] params, int colSum) {  
118         HSSFRow row1 = sheet.createRow(1);  
119         row1.setHeight((short) 300);  
120  
121         HSSFCell cell2 = row1.createCell(0);  
122  
123         cell2.setCellType(HSSFCell.ENCODING_UTF_16);  
124         cell2.setCellValue(new HSSFRichTextString("统计时间:" + params[0] + "至" 
125                 + params[1]));  
126  
127         // 指定合并区域  
128         sheet.addMergedRegion(new Region(1, (short) 0, 1, (short) colSum));  
129  
130         HSSFCellStyle cellStyle = wb.createCellStyle();  
131         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
132         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
133         cellStyle.setWrapText(true);// 指定单元格自动换行  
134  
135         // 设置单元格字体  
136         HSSFFont font = wb.createFont();  
137         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
138         font.setFontName("宋体");  
139         font.setFontHeight((short) 250);  
140         cellStyle.setFont(font);  
141  
142         cell2.setCellStyle(cellStyle);  
143  
144     }  
145  
146     /**  
147      * 设置报表标题  
148      *   
149      * @param columHeader  
150      *            标题字符串数组  
151      */ 
152     public void createColumHeader(String[] columHeader) {  
153  
154         // 设置列头  
155         HSSFRow row2 = sheet.createRow(2);  
156  
157         // 指定行高  
158         row2.setHeight((short) 600);  
159  
160         HSSFCellStyle cellStyle = wb.createCellStyle();  
161         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
162         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
163         cellStyle.setWrapText(true);// 指定单元格自动换行  
164  
165         // 单元格字体  
166         HSSFFont font = wb.createFont();  
167         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
168         font.setFontName("宋体");  
169         font.setFontHeight((short) 250);  
170         cellStyle.setFont(font);  
171  
172         /*  
173          * cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单无格的边框为粗体  
174          * cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色.  
175          * cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
176          * cellStyle.setLeftBorderColor(HSSFColor.BLACK.index);  
177          * cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);  
178          * cellStyle.setRightBorderColor(HSSFColor.BLACK.index);  
179          * cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);  
180          * cellStyle.setTopBorderColor(HSSFColor.BLACK.index);  
181          */ 
182  
183         // 设置单元格背景色  
184         cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);  
185         cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
186  
187         HSSFCell cell3 = null;  
188  
189         for (int i = 0; i < columHeader.length; i++) {  
190             cell3 = row2.createCell(i);  
191             cell3.setCellType(HSSFCell.ENCODING_UTF_16);  
192             cell3.setCellStyle(cellStyle);  
193             cell3.setCellValue(new HSSFRichTextString(columHeader[i]));  
194         }  
195  
196     }  
197  
198     /**  
199      * 创建内容单元格  
200      *   
201      * @param wb  
202      *            HSSFWorkbook  
203      * @param row  
204      *            HSSFRow  
205      * @param col  
206      *            short型的列索引  
207      * @param align  
208      *            对齐方式  
209      * @param val  
210      *            列值  
211      */ 
212     public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align,  
213             String val) {  
214         HSSFCell cell = row.createCell(col);  
215         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
216         cell.setCellValue(new HSSFRichTextString(val));  
217         HSSFCellStyle cellstyle = wb.createCellStyle();  
218         cellstyle.setAlignment(align);  
219         cell.setCellStyle(cellstyle);  
220     }  
221  
222     /**  
223      * 创建合计行  
224      *   
225      * @param colSum  
226      *            需要合并到的列索引  
227      * @param cellValue  
228      */ 
229     public void createLastSumRow(int colSum, String[] cellValue) {  
230  
231         HSSFCellStyle cellStyle = wb.createCellStyle();  
232         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
233         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
234         cellStyle.setWrapText(true);// 指定单元格自动换行  
235  
236         // 单元格字体  
237         HSSFFont font = wb.createFont();  
238         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
239         font.setFontName("宋体");  
240         font.setFontHeight((short) 250);  
241         cellStyle.setFont(font);  
242  
243         HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));  
244         HSSFCell sumCell = lastRow.createCell(0);  
245  
246         sumCell.setCellValue(new HSSFRichTextString("合计"));  
247         sumCell.setCellStyle(cellStyle);  
248         sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0,  
249                 sheet.getLastRowNum(), (short) colSum));// 指定合并区域  
250  
251         for (int i = 2; i < (cellValue.length + 2); i++) {  
252             sumCell = lastRow.createCell(i);  
253             sumCell.setCellStyle(cellStyle);  
254             sumCell.setCellValue(new HSSFRichTextString(cellValue[i - 2]));  
255  
256         }  
257  
258     }  
259  
260     /**  
261      * 输入EXCEL文件  
262      *   
263      * @param fileName  
264      *            文件名  
265      */ 
266     public void outputExcel(String fileName) {  
267         FileOutputStream fos = null;  
268         try {  
269             fos = new FileOutputStream(new File(fileName));  
270             wb.write(fos);  
271             fos.close();  
272         } catch (FileNotFoundException e) {  
273             e.printStackTrace();  
274         } catch (IOException e) {  
275             e.printStackTrace();  
276         }  
277     }  
278 } 

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

原文地址:https://www.cnblogs.com/hthuang/p/3476147.html