首页 > 代码库 > 用jxl导出excel报表

用jxl导出excel报表

1.在项目中加入jxl.jar包

2.页面是一个from表单,也可以是一个a标签...,示例如下

 1 <s:form action="claimVoucherStatistics_createDetailExcel.action" name="queryForm">
 2       <label for="time">年份:</label>
 3       <s:property value="http://www.mamicode.com/year"/>
 4       <label for="end-time">月份:</label>
 5       <s:property value="http://www.mamicode.com/selectMonth"/>
 6      <s:hidden name="year" value="http://www.mamicode.com/%{year}"/>
 7      <s:hidden name="selectMonth" value="http://www.mamicode.com/%{selectMonth}"/>
 8      <s:hidden name="departmentId" value="http://www.mamicode.com/%{departmentId}"/>
 9      <input type="submit" class="submit_01" value="http://www.mamicode.com/导出报表"/>
10 </s:form>

3.后台代码,示例如下

 1     /**
 2      * 
 3      */
 4     private static final long serialVersionUID = 1L;
 5     
 6     //claimVoucherStatistics_getDeptStatisticsByMonth.action
 7     private PageInfo pageInfo;
 8     private BizClaimVoucherStatisticsService voucherStatisticsService;
 9     private Short year;//
10     private Short startMonth;//开始月份
11     private Short endMonth;//结束月份
12     private Integer pageIndex;//当前页码
13     
14     private Short selectMonth ;//选择查询的月份
15     private Long departmentId;//选择查询的部门编号
16     private List<Detail> detailList;//详情集合 
17     private Double detailCount=0.0;
18     
19     private JFreeChart chart;//图形工具
20     private String fileName; //导出报表时显示的文件名
21     /**
22      * 导出报表
23      * @return
24      * @throws Exception
25      */
26     public String createDetailExcel() throws Exception {
27         //fileName=year+"年"+selectMonth+"月"+detailList.get(0).getDeptName()+"月度报销统计表";
28         return "detailExcel";
29     }
30     public InputStream getInputStream() {
31         //查询到的list集合数据
32         detailList=voucherStatisticsService.getDeptVoucherDetailByMonth(year,selectMonth,departmentId);
33         Object[][] objectArray=new Object[detailList.size()][];
34     
35         //把集合循环在次封装到一个二维数组
36         for(int i=0;i<detailList.size();i++){
37             Object ob[]={detailList.get(i).getName(),detailList.get(i).getTotalAccount(),detailList.get(i).getYear()
38                     ,detailList.get(i).getMonth(),detailList.get(i).getDeptName()};
39             objectArray[i]=ob;
40             ob=null;
41         }
42         String headTitle=year+"年"+selectMonth+"月"+detailList.get(0).getDeptName()+"月度报销统计表";
43         fileName=headTitle;
44         String []titles={"报销人","报销总额","年份","月份","部门"};
45         ByteArrayOutputStream out = new ByteArrayOutputStream();
46         //调用工具类
47         new ToExcelUtil().printToExcel(objectArray, out, headTitle, titles);
48         return new ByteArrayInputStream(out.toByteArray());
49     }
50 
51     public String getFileName() throws Exception {
52         //return fileName;
53         /**
54          * 解决中文乱码
55          */
56         return java.net.URLEncoder.encode(fileName, "UTF-8");//??????????????????
57     }
58 
59 
60     public void setFileName(String fileName) {
61         this.fileName = fileName;
62     }

 

4.工具类,示例如下

 1 package cn.bd.jboa.util;
 2 
 3 import java.io.OutputStream;
 4 import jxl.Workbook;
 5 import jxl.write.Label;
 6 import jxl.write.WritableCellFormat;
 7 import jxl.write.WritableSheet;
 8 import jxl.write.WritableWorkbook;
 9 
10 
11 public class ToExcelUtil {
12 
13     /**
14      * 
15      * @param objectArray 二维数组
16      * @param os 输出流
17      * @param headTitle 头部标题
18      * @param titles 标题
19      */
20     
21     // 输出集合信息到Excel中
22         public void printToExcel(Object[][] objectArray,OutputStream os,String headTitle,String[] titles) {
23             try {
24                 // 打开Excel文件
25                 WritableWorkbook workBook = Workbook.createWorkbook(os);
26                 // 生成名为“图书信息汇总”的工作表,参数0表示这是第一页
27                 //WritableSheet sheet = workBook.createSheet("图书信息借阅汇总",0);
28                 WritableSheet sheet = workBook.createSheet(headTitle,0);
29                 /*String[] titles = { "图书编号", "图书分类", "图书名称", "作者", "出版社", "借阅状态","" };*/
30                 // 填充标题信息
31                 
32                 
33                 //*******************************合并单元格 **********************************//
34                 //sheet.mergeCells(int m,int n,int p,int q); 
35                 //作用是从 (m,n)到(p,q)的单元格全部合并,比如: 
36                 
37                 //合并第一列第一行到第五列第一行的所有单元格 
38                 sheet.mergeCells(0,0,4,0); 
39                 //给合并后(第0列第0行)的单元格赋值
40                 Label label3 = new Label(0, 0, headTitle);
41                 //单元格居中
42                 WritableCellFormat cellFormat = new WritableCellFormat();  
43                 cellFormat.setAlignment(jxl.format.Alignment.CENTRE);  
44                 label3.setCellFormat(cellFormat); 
45                 //将定义好的单元格添加到工作表中
46                 sheet.addCell(label3);
47                 //合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。
48                 //**************************** 合并单元格 ********************************//
49                   
50                  
51                 
52                 
53                 for (int i = 0; i < titles.length; i++) {
54                     // 在Label对象的构造子中指名单元格位置是第i列第0行(i,1),单元格内容为titles[i]
55                     Label label = new Label(i, 1, titles[i]);
56                     // 将定义好的单元格添加到工作表中
57                     sheet.addCell(label);
58                 }
59                 //准备填充单元格的数据源
60                 for (int j = 0; j < objectArray.length; j++) {
61                     Object[] cellContents = objectArray[j];
62                     
63                     //将数据填充到单元中
64                     for (int i = 0; i < cellContents.length; i++) {
65                         Object content = cellContents[i];
66                             // 在Label对象的构造子中指名单元格位置是第i列第0行(i,0),单元格内容为titles[i]
67                             Label label = new Label(i, j + 2, cellContents[i].toString());///
68                             // 将定义好的单元格添加到工作表中
69                             sheet.addCell(label);
70                     }
71                 }
72                 // 写入数据并关闭文件
73                 workBook.write();
74                 workBook.close();
75 
76             } catch (Exception e) {
77                 e.printStackTrace();
78                 System.out.println(e);
79             }
80         }
81 }

 

5.struts.xml的配置文件

 1         <!-- 月度报销单 -->
 2         <action name="claimVoucherStatistics_*" class="VoucherStatisticsAction" method="{1}">
13             <result name="detailExcel" type="stream">
14                 <param name="contentType">
15                     application/vnd.ms-excel
16                 </param>
17                 <param name="inputStream">inputStream</param>
18                 <param name="contentDisposition">
19                     filename="${fileName}.xls"
20                 </param>
21                 <param name="bufferSize">1024</param>
22             </result>
26         </action>

6.导出的excel文件如图

技术分享

用jxl导出excel报表