1.项目组负责人让我实现这个接口,因为以前做过类似的,中间并没有遇到什么太困难的事情。其他不说,先上代码:

 package com.tydic.eshop.action.feedback;

 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;

 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import org.apache.struts2.ServletActionContext;

 import com.tydic.eshop.dto.feedback.vo.FeedBackVO;
 import com.tydic.eshop.model.feedback.FeedBack;
 import com.tydic.eshop.service.feedback.FeedBackService;
 import com.tydic.eshop.util.feedback.ExportExcelUtils;
 import com.tydic.framework.base.dataobject.Pagination;
 import com.tydic.framework.base.dataobject.ResultDto;
 import com.tydic.framework.base.exception.ServiceException;
 import com.tydic.framework.base.web.struts.BaseSupportAction;

 /**
  * @ClassName: FeedBackAction
  * @Description: ECP后台增加意见日志导出功能
  * @author liuren
  * @date 2016年3月25日
  *
  */
 public class FeedBackAction extends BaseSupportAction{

     private static final long serialVersionUID = 5684835836631112914L;
     @Resource(name = "feedBackService")
     private FeedBackService feedbackService;

     private FeedBack feedback;
     private FeedBackVO feedbackVO;

     private List<FeedBack> feedbackList;

     private String feedbackId;

     private ResultDto<FeedBack> feedbackPage;

     private InputStream excelStream;  //输出流变量
     private String excelFileName; //下载文件名
     /**
      * 总页数
      */
     private int totalPage;
     private FileInputStream stream;

     public String execute() throws Exception {
         //这里可加入权限控制
         return "downloadsuccess";
     }
     /**
      * 意见反馈查询
      * @return
      * @throws Exception
      */
     public String queryFeedBackList() throws ServiceException{
         if(feedbackVO == null){
             feedbackVO = new FeedBackVO();
         }
         HttpServletRequest request = ServletActionContext.getRequest();
         String currentPage = request.getParameter("index");
         int currentPagei=0;
         if(currentPage!=null){
             currentPagei = Integer.parseInt(currentPage);
         }
         Pagination pagination = new Pagination(currentPagei);
         String pagesize = request.getParameter("pageSize");
         if(pagesize==null){
             pagesize="10";
         }
         pagination.setPageSize(Integer.parseInt(pagesize));

         feedbackVO.setPagination(pagination);
         try {
             feedbackPage = feedbackService.findFeedBackPage(feedbackVO);
             totalPage = feedbackPage.getPagination().getTotalPage();
         } catch (Exception e) {
             throw new ServiceException("数据分页查询失败"+e.getMessage());
         }
         return "toFeedBackListPage";
     }

     /**
      * @throws IOException
      * @throws
      * @Title: exportExecl
      * @Description: 报表导出并下载
      * @param @return
      * @param @throws ServiceException    参数
      * @return String    返回类型
      * @throws
      */
     public String exportExecl() throws ServiceException, IOException{
         ExportExcelUtils<FeedBack> ex = new ExportExcelUtils<FeedBack>();
         Date fileDate = new Date();
         System.out.println(fileDate);
         SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
         String ds = sdf.format(fileDate);
         String fileName = "意见反馈报表"+ds+".xls"; //生成的文件名称
         System.out.println(fileName);
         String exportPath = request.getSession().getServletContext().getRealPath("/WEB-INF/download/"+fileName);
         String[] headers = { "序号", "渠道标示", "手机号码", "终端机型", "反馈信息内容", "创建时间", "图片地址", "版本号", "状态" };
         if (exportPath==null||exportPath==""||exportPath==" ") {
             throw new ServiceException("请选择导出目录");
         }
         try {
             feedbackList = feedbackService.findFeedBackList(feedbackVO);
         } catch (Exception e) {
             e.printStackTrace();
             throw new ServiceException("数据查询失败"+e.getMessage());
         }

             ByteArrayOutputStream out = new ByteArrayOutputStream();
             ByteArrayOutputStream os = ex.exportExcel("海航通信意见反馈报表",headers, feedbackList, out,"yyyy/MM/dd HH:mm:ss");

             byte[] fileContent = os.toByteArray();
             ByteArrayInputStream is = new ByteArrayInputStream(fileContent);  

             excelStream = is;             //文件流
             excelFileName = new String(fileName.getBytes(), "ISO8859-1");  //设置下载的文件名
             System.out.println(excelFileName);

         return "successdownload";
     }
     /**
      * @Title: queryFeedBackById
      * @Description: 根据意见反馈Id查询意见反馈详情
      * @param @return
      * @param @throws ServiceException    参数
      * @return String    返回类型
      * @throws
      */
     public String queryFeedBackById() throws ServiceException{
         feedback = feedbackService.queryFeedBackById(feedbackId);
         return "toFeedBackDetailPage";
     }

     public FeedBackVO getFeedbackVO() {
         return feedbackVO;
     }
     public void setFeedbackVO(FeedBackVO feedbackVO) {
         this.feedbackVO = feedbackVO;
     }
     public List<FeedBack> getFeedbackList() {
         return feedbackList;
     }
     public void setFeedbackList(List<FeedBack> feedbackList) {
         this.feedbackList = feedbackList;
     }
     public String getFeedbackId() {
         return feedbackId;
     }
     public void setFeedbackId(String feedbackId) {
         this.feedbackId = feedbackId;
     }

     public ResultDto<FeedBack> getFeedbackPage() {
         return feedbackPage;
     }
     public void setFeedbackPage(ResultDto<FeedBack> feedbackPage) {
         this.feedbackPage = feedbackPage;
     }
     public int getTotalPage() {
         return totalPage;
     }
     public void setTotalPage(int totalPage) {
         this.totalPage = totalPage;
     }
     public FeedBack getFeedback() {
         return feedback;
     }
     public void setFeedback(FeedBack feedback) {
         this.feedback = feedback;
     }
     public InputStream getExcelStream() {
         return excelStream;
     }
     public void setExcelStream(InputStream excelStream) {
         this.excelStream = excelStream;
     }
     public String getExcelFileName() {
         return excelFileName;
     }
     public void setExcelFileName(String excelFileName) {
         this.excelFileName = excelFileName;
     }
     public FileInputStream getStream() {
         return stream;
     }
     public void setStream(FileInputStream stream) {
         this.stream = stream;
     }

 }

FeedBackAction

2.然后是struts的配置文件 struts.xml中action的配置

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     "http://struts.apache.org/dtds/struts-2.0.dtd">

 <struts>
     <package name="feedback" extends="default" namespace="/feedback">

         <action name="feedBackAction" class="feedBackAction" method="initFeedBack">
             <result name="success" type="redirect">feedBackAction!queryFeedBackList.do</result>
             <result name="toFeedBackDetailPage">/jsp/feedback/feedBackDetail.jsp</result>
             <result name="toFeedBackListPage">/jsp/feedback/feedBackList.jsp</result>
             <result name="successdownload" type="stream">
                 <!-- 下载文件的类型,如果你不知道是什么格式,可以去 tomcat\conf\web.xml下找 -->
                 <param name="contentType">application/vnd.ms-excel</param>
                 <!-- 返回流 excelStream为action中的流变量名称 -->
                 <param name="inputName">excelStream</param>
                 <!-- attachment 这个位置的参数挺特殊的,可以设置成下载时,是否出现个下载提示框,或者直接下载之类的。
                 fileName指定生成的文件名字(适合动态生成文件名,比如做报表时,一般都要说是几月的统计数据之类)为action中变量-->
                 <param name="contentDisposition">
                     attachment;filename=${excelFileName}
                 </param>
                 <param name="bufferSize">1024</param>
             </result>
         </action>
     </package>

 </struts>

struts.xml

3.然后是导出报表的工具类

 package com.tydic.eshop.util.feedback;

 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;

 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
 import org.apache.poi.hssf.usermodel.HSSFComment;
 import org.apache.poi.hssf.usermodel.HSSFFont;
 import org.apache.poi.hssf.usermodel.HSSFPatriarch;
 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;

 /**
  * @ClassName: ExportExcel
  * @Description: 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
  * @author liuren
  * @date 2016年3月28日
  *
  * @param <T>
  * 应用泛型,代表任意一个符合javabean风格的类
  * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
  * byte[]表jpg格式的图片数据
  */
 public class ExportExcelUtils<T> {

     public void exportExcel(Collection<T> dataset, ByteArrayOutputStream out) {
         this.exportExcel("意见反馈报表", null, dataset, out, "yyyy-MM-dd");
     }

     public void exportExcel(String[] headers, Collection<T> dataset, ByteArrayOutputStream out) {
         this.exportExcel("意见反馈报表", headers, dataset, out, "yyyy-MM-dd");
     }

     public void exportExcel(String[] headers, Collection<T> dataset, ByteArrayOutputStream out, String pattern) {
         this.exportExcel("意见反馈报表", headers, dataset, out, pattern);
     }
         /**
          * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
          *
          * @param title
          *            表格标题名
          * @param headers
          *            表格属性列名数组
          * @param dataset
          *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
          *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
          * @param out
          *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
          * @param pattern
          *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
          */
     public ByteArrayOutputStream  exportExcel(String title, String[] headers, Collection<T> dataset, ByteArrayOutputStream out, String pattern) {
         // 声明一个工作薄
         HSSFWorkbook workbook = new HSSFWorkbook();
         // 生成一个表格
         HSSFSheet sheet = workbook.createSheet(title);
         // 设置表格默认列宽度为15个字节
         sheet.setDefaultColumnWidth(15);
         // 生成一个样式
         HSSFCellStyle style = workbook.createCellStyle();
         // 设置这些样式
         style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
         style.setBorderRight(HSSFCellStyle.BORDER_THIN);
         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
         // 生成一个字体
         HSSFFont font = workbook.createFont();
         font.setColor(HSSFColor.VIOLET.index);
         font.setFontHeightInPoints((short) 12);
         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
         // 把字体应用到当前的样式
         style.setFont(font);
         // 生成并设置另一个样式
         HSSFCellStyle style2 = workbook.createCellStyle();
         style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
         style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
         style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
         style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
         style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
         style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
         style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
         style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
         // 生成另一个字体
         HSSFFont font2 = workbook.createFont();
         font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
         // 把字体应用到当前的样式
         style2.setFont(font2);

         // 声明一个画图的顶级管理器
         HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
         // 定义注释的大小和位置,详见文档
         HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
         // 设置注释内容
 //        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
         // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
         comment.setAuthor("海航通信");

         // 产生表格标题行
         HSSFRow row = sheet.createRow(0);
         for (int i = 0; i < headers.length; i++) {
             HSSFCell cell = row.createCell(i);
             cell.setCellStyle(style);
             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
             cell.setCellValue(text);
         }

         // 遍历集合数据,产生数据行
         Iterator<T> it = dataset.iterator();
         int index = 0;
         while (it.hasNext()) {
             index++;
             row = sheet.createRow(index);
             T t = (T) it.next();
             // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
             Field[] fields = t.getClass().getDeclaredFields();
             for (int i = 0; i < fields.length; i++) {
                 HSSFCell cell = row.createCell(i);
                 cell.setCellStyle(style2);
                 Field field = fields[i];
                 String fieldName = field.getName();
                 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                 try {
                     Class tCls = t.getClass();
                     Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
                     Object value = getMethod.invoke(t, new Object[] {});
                     // 判断值的类型后进行强制类型转换
                     String textValue = null;
                     if (value==null) {
                         value="";
                     }
                     if (value instanceof Boolean) {
                         boolean bValue = (Boolean) value;
                         textValue = "男";
                         if (!bValue) {
                             textValue = "女";
                         }
                     } else if (value instanceof Date) {
                         Date date = (Date) value;
                         SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                         textValue = sdf.format(date);
                     } else if (value instanceof byte[]) {
                         // 有图片时,设置行高为60px;
                         row.setHeightInPoints(60);
                         // 设置图片所在列宽度为80px,注意这里单位的一个换算
                         sheet.setColumnWidth(i, (short) (35.7 * 80));
                         // sheet.autoSizeColumn(i);
                         byte[] bsValue = (byte[]) value;
                         HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6,
                                 index);
                         anchor.setAnchorType(2);
                         patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
                     } else {
                         // 其它数据类型都当作字符串简单处理
                         textValue = value.toString();
                     }
                     // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
                     if (textValue != null) {
                         Pattern p = Pattern.compile("^\\d+(\\.\\d+)?$");
                         Matcher matcher = p.matcher(textValue);
                         if (matcher.matches()) {
                             // 是数字当作double处理
                             cell.setCellValue(Double.parseDouble(textValue));
                         } else {
                             HSSFRichTextString richString = new HSSFRichTextString(textValue);
                             HSSFFont font3 = workbook.createFont();
                             font3.setColor(HSSFColor.BLUE.index);
                             richString.applyFont(font3);
                             cell.setCellValue(richString);
                         }
                     }
                 } catch (SecurityException e) {
                     e.printStackTrace();
                 } catch (NoSuchMethodException e) {
                     e.printStackTrace();
                 } catch (IllegalArgumentException e) {
                     e.printStackTrace();
                 } catch (IllegalAccessException e) {
                     e.printStackTrace();
                 } catch (InvocationTargetException e) {
                     e.printStackTrace();
                 } finally {
                     // 清理资源
                 }
             }

         }
         try {
             workbook.write(out);
         } catch (IOException e) {
             e.printStackTrace();
         }
         return out;
     }
 }

ExportExcelUtils

4.然后是需要导入的poi架包,本人是用Maven做的项目,导入POI的包,只需要导入下面这一个包就行了。

 <!-- 导入poi包 -->
 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>3.9</version>
 </dependency>    

pom.xml

5.然后就是效果图两张

导出的excel的内容:

struts2中利用POI导出Excel文档并下载的更多相关文章

  1. Java之Poi导出Excel文档

    一.Poi简介 在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持. 二.Workbook/HSSFWorkbook/XSSFWorkbook 1 ...

  2. 使用struts2和poi导出excel文档

    poi眼下应该是比較流行的操作excel的工具了.这几天做了个struts2和poi结合使用来实现导出excel的功能.个人认为还是比較有用的.代码阅读起来也非常easy.下来就来分享下我的心得 1  ...

  3. POI导出Excel文档通用工具方法

    import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; imp ...

  4. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  5. 转:ASP.NET MVC 将IList&lt;T&gt;导出Excel文档的泛型类

    /// <summary> /// 提供将泛型集合数据导出Excel文档. /// </summary> /// <typeparam name="T" ...

  6. asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

    一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...

  7. 在MyEclipse中使用javadoc导出API文档详解

    本篇文档介绍如何在MyEclipse中导出javadoc(API)帮助文档,并且使用htmlhelp.exe和jd2chm.exe生成chm文档. 具体步骤如下: 打开MyEclipse,选中想要制作 ...

  8. ASP.Net MVC中数据库数据导出Excel,供HTTP下载(转)

    转自http://www.cnblogs.com/hipo/archive/2012/03/13/2394019.html 一.关于下载 一般对下载权限有没有限制,或安全性要求不高的情况下,基于web ...

  9. ASP.Net MVC中数据库数据导出Excel,供HTTP下载

    本文来自:http://www.cnblogs.com/hipo/archive/2012/03/13/2394019.html 一.关于下载 一般对下载权限有没有限制,或安全性要求不高的情况下,基于 ...

随机推荐

  1. 一些有用的SAP技术TCODE

    Background Processing RZ01 Job Scheduling Monitor SM36 Schedule Background Job SM36WIZ Job definitio ...

  2. 【笔记】jquery js获取浏览器滑动条距离顶部距离的写法

    jq写法 $(window).scroll(function(){ var $top = $(document).scrollTop(); }); /*注:$(window).scroll(funct ...

  3. 2015/9/9 js继续学习

    var book={                 //对象是由花括号括起来的 topic:“JavaScript”://属性“topic”的值是“JavaScript” fat:true:     ...

  4. Illegal mix of collations (big5_chinese_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation &#39;like&#39;

    解释: 非法的混合排序规则(big5_chinese_ci)和(utf8_general_ci)操作“like”. 原本是单个字段查询数据的,现在是把所有的字段用一个搜索框来查询. 主要出问题是下列这 ...

  5. php新浪微博登录接口用法实例

    本文实例讲述了php新浪微博登录接口用法.分享给大家供大家参考.具体分析如下: 在做微博登陆之前是需要申请到APP KEY 和App Secret,这个的申请方式请去 open.weibo.com 申 ...

  6. 关于我们 HerlMax(赫马克斯),奢侈品顶级服装高级定制品牌!

    关于我们 HerlMax(赫马克斯),奢侈品顶级服装高级定制品牌! HerlMax品牌拥有着纯正悠远的意大利高级定制文化,带着对神秘东方的向往,荣耀登入中国市场.

  7. Java ConcurrentHashmap 解析

    总体描述: concurrentHashmap是为了高并发而实现,内部采用分离锁的设计,有效地避开了热点访问.而对于每个分段,ConcurrentHashmap采用final和内存可见修饰符Volat ...

  8. 【数位DP】 HDU 4734 F(x)

    原题直通车:HDU 4734 F(x) 题意:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1, 求0.....B中F[x]<=F[A ...

  9. CentOS用gparted实现无损调整磁盘分区大小

    作者: sheldon 测试服务器硬盘挂载在/usr下的分区大小只有10G,随着必须软件都安装在这个目录下,这个分区已经满额,给分区扩容刻不容缓,window下有PQ分区工具,Linux下也有gpar ...

  10. 当tomcat有两个链接数据库的应用同时运行可能冲突

    -Xms512M   -Xmx1024M -XX:MaxPermSize=256M