struts2中利用POI导出Excel文档并下载

Posted 魔流剑●风之痕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2中利用POI导出Excel文档并下载相关的知识,希望对你有一定的参考价值。

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

 

技术分享
  1 package com.tydic.eshop.action.feedback;
  2 
  3 import java.io.ByteArrayInputStream;
  4 import java.io.ByteArrayOutputStream;
  5 import java.io.FileInputStream;
  6 import java.io.IOException;
  7 import java.io.InputStream;
  8 import java.text.SimpleDateFormat;
  9 import java.util.Date;
 10 import java.util.List;
 11 
 12 import javax.annotation.Resource;
 13 import javax.servlet.http.HttpServletRequest;
 14 import org.apache.struts2.ServletActionContext;
 15 
 16 import com.tydic.eshop.dto.feedback.vo.FeedBackVO;
 17 import com.tydic.eshop.model.feedback.FeedBack;
 18 import com.tydic.eshop.service.feedback.FeedBackService;
 19 import com.tydic.eshop.util.feedback.ExportExcelUtils;
 20 import com.tydic.framework.base.dataobject.Pagination;
 21 import com.tydic.framework.base.dataobject.ResultDto;
 22 import com.tydic.framework.base.exception.ServiceException;
 23 import com.tydic.framework.base.web.struts.BaseSupportAction;
 24 
 25 /**
 26  * @ClassName: FeedBackAction
 27  * @Description: ECP后台增加意见日志导出功能
 28  * @author liuren
 29  * @date 2016年3月25日
 30  *
 31  */
 32 public class FeedBackAction extends BaseSupportAction{
 33 
 34     private static final long serialVersionUID = 5684835836631112914L;
 35     @Resource(name = "feedBackService")
 36     private FeedBackService feedbackService;
 37     
 38     private FeedBack feedback;
 39     private FeedBackVO feedbackVO;
 40     
 41     private List<FeedBack> feedbackList;
 42     
 43     private String feedbackId;
 44     
 45     private ResultDto<FeedBack> feedbackPage;
 46     
 47     private InputStream excelStream;  //输出流变量  
 48     private String excelFileName; //下载文件名  
 49     /**
 50      * 总页数
 51      */
 52     private int totalPage;
 53     private FileInputStream stream;
 54     
 55     public String execute() throws Exception {       
 56         //这里可加入权限控制       
 57         return "downloadsuccess";       
 58     }       
 59     /**
 60      * 意见反馈查询
 61      * @return
 62      * @throws Exception 
 63      */
 64     public String queryFeedBackList() throws ServiceException{
 65         if(feedbackVO == null){
 66             feedbackVO = new FeedBackVO();
 67         }
 68         HttpServletRequest request = ServletActionContext.getRequest();
 69         String currentPage = request.getParameter("index");
 70         int currentPagei=0;
 71         if(currentPage!=null){
 72             currentPagei = Integer.parseInt(currentPage);
 73         }
 74         Pagination pagination = new Pagination(currentPagei);
 75         String pagesize = request.getParameter("pageSize");
 76         if(pagesize==null){
 77             pagesize="10";
 78         }
 79         pagination.setPageSize(Integer.parseInt(pagesize));
 80         
 81         feedbackVO.setPagination(pagination);
 82         try {
 83             feedbackPage = feedbackService.findFeedBackPage(feedbackVO);
 84             totalPage = feedbackPage.getPagination().getTotalPage();
 85         } catch (Exception e) {
 86             throw new ServiceException("数据分页查询失败"+e.getMessage());
 87         }
 88         return "toFeedBackListPage";
 89     }
 90     
 91     /**
 92      * @throws IOException 
 93      * @throws  
 94      * @Title: exportExecl
 95      * @Description: 报表导出并下载
 96      * @param @return
 97      * @param @throws ServiceException    参数
 98      * @return String    返回类型
 99      * @throws
100      */
101     public String exportExecl() throws ServiceException, IOException{
102         ExportExcelUtils<FeedBack> ex = new ExportExcelUtils<FeedBack>();
103         Date fileDate = new Date();
104         System.out.println(fileDate);
105         SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
106         String ds = sdf.format(fileDate);
107         String fileName = "意见反馈报表"+ds+".xls"; //生成的文件名称
108         System.out.println(fileName);
109         String exportPath = request.getSession().getServletContext().getRealPath("/WEB-INF/download/"+fileName);
110         String[] headers = { "序号", "渠道标示", "手机号码", "终端机型", "反馈信息内容", "创建时间", "图片地址", "版本号", "状态" };
111         if (exportPath==null||exportPath==""||exportPath==" ") {
112             throw new ServiceException("请选择导出目录");
113         }
114         try {
115             feedbackList = feedbackService.findFeedBackList(feedbackVO);
116         } catch (Exception e) {
117             e.printStackTrace();
118             throw new ServiceException("数据查询失败"+e.getMessage());
119         }
120             
121             ByteArrayOutputStream out = new ByteArrayOutputStream();  
122             ByteArrayOutputStream os = ex.exportExcel("海航通信意见反馈报表",headers, feedbackList, out,"yyyy/MM/dd HH:mm:ss");
123               
124             byte[] fileContent = os.toByteArray();  
125             ByteArrayInputStream is = new ByteArrayInputStream(fileContent);  
126   
127             excelStream = is;             //文件流 
128             excelFileName = new String(fileName.getBytes(), "ISO8859-1");  //设置下载的文件名
129             System.out.println(excelFileName);
130 
131         return "successdownload";
132     }
133     /**
134      * @Title: queryFeedBackById
135      * @Description: 根据意见反馈Id查询意见反馈详情
136      * @param @return
137      * @param @throws ServiceException    参数
138      * @return String    返回类型
139      * @throws
140      */
141     public String queryFeedBackById() throws ServiceException{
142         feedback = feedbackService.queryFeedBackById(feedbackId);
143         return "toFeedBackDetailPage";
144     }
145     
146     public FeedBackVO getFeedbackVO() {
147         return feedbackVO;
148     }
149     public void setFeedbackVO(FeedBackVO feedbackVO) {
150         this.feedbackVO = feedbackVO;
151     }
152     public List<FeedBack> getFeedbackList() {
153         return feedbackList;
154     }
155     public void setFeedbackList(List<FeedBack> feedbackList) {
156         this.feedbackList = feedbackList;
157     }
158     public String getFeedbackId() {
159         return feedbackId;
160     }
161     public void setFeedbackId(String feedbackId) {
162         this.feedbackId = feedbackId;
163     }
164 
165     public ResultDto<FeedBack> getFeedbackPage() {
166         return feedbackPage;
167     }
168     public void setFeedbackPage(ResultDto<FeedBack> feedbackPage) {
169         this.feedbackPage = feedbackPage;
170     }
171     public int getTotalPage() {
172         return totalPage;
173     }
174     public void setTotalPage(int totalPage) {
175         this.totalPage = totalPage;
176     }
177     public FeedBack getFeedback() {
178         return feedback;
179     }
180     public void setFeedback(FeedBack feedback) {
181         this.feedback = feedback;
182     }
183     public InputStream getExcelStream() {
184         return excelStream;
185     }
186     public void setExcelStream(InputStream excelStream) {
187         this.excelStream = excelStream;
188     }
189     public String getExcelFileName() {
190         return excelFileName;
191     }
192     public void setExcelFileName(String excelFileName) {
193         this.excelFileName = excelFileName;
194     }
195     public FileInputStream getStream() {
196         return stream;
197     }
198     public void setStream(FileInputStream stream) {
199         this.stream = stream;
200     }
201     
202     
203 }
FeedBackAction

 

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

技术分享
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 
 6 <struts>
 7     <package name="feedback" extends="default" namespace="/feedback">
 8         
 9         <action name="feedBackAction" class="feedBackAction" method="initFeedBack">
10             <result name="success" type="redirect">feedBackAction!queryFeedBackList.do</result>
11             <result name="toFeedBackDetailPage">/jsp/feedback/feedBackDetail.jsp</result>
12             <result name="toFeedBackListPage">/jsp/feedback/feedBackList.jsp</result>
13             <result name="successdownload" type="stream">  
14                 <!-- 下载文件的类型,如果你不知道是什么格式,可以去 tomcat\conf\web.xml下找 -->  
15                 <param name="contentType">application/vnd.ms-excel</param>  
16                 <!-- 返回流 excelStream为action中的流变量名称 -->  
17                 <param name="inputName">excelStream</param>  
18                 <!-- attachment 这个位置的参数挺特殊的,可以设置成下载时,是否出现个下载提示框,或者直接下载之类的。  
19                 fileName指定生成的文件名字(适合动态生成文件名,比如做报表时,一般都要说是几月的统计数据之类)为action中变量-->  
20                 <param name="contentDisposition">  
21                     attachment;filename=${excelFileName}  
22                 </param>  
23                 <param name="bufferSize">1024</param>  
24             </result>  
25         </action>
26     </package>
27         
28 </struts>
struts.xml

 

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

技术分享
  1 package com.tydic.eshop.util.feedback;
  2 
  3 import java.io.ByteArrayOutputStream;
  4 import java.io.IOException;
  5 import java.io.OutputStream;
  6 import java.lang.reflect.Field;
  7 import java.lang.reflect.InvocationTargetException;
  8 import java.lang.reflect.Method;
  9 import java.text.SimpleDateFormat;
 10 import java.util.Collection;
 11 import java.util.Date;
 12 import java.util.Iterator;
 13 import java.util.regex.Matcher;
 14 import java.util.regex.Pattern;
 15 
 16 import org.apache.poi.hssf.usermodel.HSSFCell;
 17 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 18 import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
 19 import org.apache.poi.hssf.usermodel.HSSFComment;
 20 import org.apache.poi.hssf.usermodel.HSSFFont;
 21 import org.apache.poi.hssf.usermodel.HSSFPatriarch;
 22 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
 23 import org.apache.poi.hssf.usermodel.HSSFRow;
 24 import org.apache.poi.hssf.usermodel.HSSFSheet;
 25 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 26 import org.apache.poi.hssf.util.HSSFColor;
 27 
 28 /**
 29  * @ClassName: ExportExcel
 30  * @Description: 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
 31  * @author liuren
 32  * @date 2016年3月28日
 33  *
 34  * @param <T>
 35  * 应用泛型,代表任意一个符合javabean风格的类
 36  * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
 37  * byte[]表jpg格式的图片数据
 38  */
 39 public class ExportExcelUtils<T> {
 40 
 41     public void exportExcel(Collection<T> dataset, ByteArrayOutputStream out) {
 42         this.exportExcel("意见反馈报表", null, dataset, out, "yyyy-MM-dd");
 43     }
 44 
 45     public void exportExcel(String[] headers, Collection<T> dataset, ByteArrayOutputStream out) {
 46         this.exportExcel("意见反馈报表", headers, dataset, out, "yyyy-MM-dd");
 47     }
 48 
 49     public void exportExcel(String[] headers, Collection<T> dataset, ByteArrayOutputStream out, String pattern) {
 50         this.exportExcel("意见反馈报表", headers, dataset, out, pattern);
 51     }
 52         /**
 53          * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
 54          *
 55          * @param title
 56          *            表格标题名
 57          * @param headers
 58          *            表格属性列名数组
 59          * @param dataset
 60          *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
 61          *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
 62          * @param out
 63          *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
 64          * @param pattern
 65          *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
 66          */
 67     public ByteArrayOutputStream  exportExcel(String title, String[] headers, Collection<T> dataset, ByteArrayOutputStream out, String pattern) {
 68         // 声明一个工作薄
 69         HSSFWorkbook workbook = new HSSFWorkbook();
 70         // 生成一个表格
 71         HSSFSheet sheet = workbook.createSheet(title);
 72         // 设置表格默认列宽度为15个字节
 73         sheet.setDefaultColumnWidth(15);
 74         // 生成一个样式
 75         HSSFCellStyle style = workbook.createCellStyle();
 76         // 设置这些样式
 77         style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
 78         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
 79         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
 80         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
 81         style.setBorderRight(HSSFCellStyle.BORDER_THIN);
 82         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
 83         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
 84         // 生成一个字体
 85         HSSFFont font = workbook.createFont();
 86         font.setColor(HSSFColor.VIOLET.index);
 87         font.setFontHeightInPoints((short) 12);
 88         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
 89         // 把字体应用到当前的样式
 90         style.setFont(font);
 91         // 生成并设置另一个样式
 92         HSSFCellStyle style2 = workbook.createCellStyle();
 93         style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
 94         style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
 95         style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
 96         style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
 97         style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
 98         style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
 99         style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
100         style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
101         // 生成另一个字体
102         HSSFFont font2 = workbook.createFont();
103         font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
104         // 把字体应用到当前的样式
105         style2.setFont(font2);
106 
107         // 声明一个画图的顶级管理器
108         HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
109         // 定义注释的大小和位置,详见文档
110         HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
111         // 设置注释内容
112 //        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
113         // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
114         comment.setAuthor("海航通信");
115 
116         // 产生表格标题行
117         HSSFRow row = sheet.createRow(0);
118         for (int i = 0; i < headers.length; i++) {
119             HSSFCell cell = row.createCell(i);
120             cell.setCellStyle(style);
121             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
122             cell.setCellValue(text);
123         }
124 
125         // 遍历集合数据,产生数据行
126         Iterator<T> it = dataset.iterator();
127         int index = 0;
128         while (it.hasNext()) {
129             index++;
130             row = sheet.createRow(index);
131             T t = (T) it.next();
132             // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
133             Field[] fields = t.getClass().getDeclaredFields();
134             for (int i = 0; i < fields.length; i++) {
135                 HSSFCell cell = row.createCell(i);
136                 cell.setCellStyle(style2);
137                 Field field = fields[i];
138                 String fieldName = field.getName();
139                 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
140                 try {
141                     Class tCls = t.getClass();
142                     Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
143                     Object value = getMethod.invoke(t, new Object[] {});
144                     // 判断值的类型后进行强制类型转换
145                     String textValue = null;
146                     if (value==null) {
147                         value="";
148                     }
149                     if (value instanceof Boolean) {
150                         boolean bValue = (Boolean) value;
151                         textValue = "男";
152                         if (!bValue) {
153                             textValue = "女";
154                         }
155                     } else if (value instanceof Date) {
156                         Date date = (Date) value;
157                         SimpleDateFormat sdf = new SimpleDateFormat(pattern);
158                         textValue = sdf.format(date);
159                     } else if (value instanceof byte[]) {
160                         // 有图片时,设置行高为60px;
161                         row.setHeightInPoints(60);
162                         // 设置图片所在列宽度为80px,注意这里单位的一个换算
163                         sheet.setColumnWidth(i, (short) (35.7 * 80));
164                         // sheet.autoSizeColumn(i);
165                         byte[] bsValue = (byte[]) value;
166                         HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6,
167                                 index);
168                         anchor.setAnchorType(2);
169                         patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
170                     } else {
171                         // 其它数据类型都当作字符串简单处理
172                         textValue = value.toString();
173                     }
174                     // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
175                     if (textValue != null) {
176                         Pattern p = Pattern.compile("^\\d+(\\.\\d+)?$");
177                         Matcher matcher = p.matcher(textValue);
178                         if (matcher.matches()) {
179                             // 是数字当作double处理
180                             cell.setCellValue(Double.parseDouble(textValue));
181                         } else {
182                             HSSFRichTextString richString = new HSSFRichTextString(textValue);
183                             HSSFFont font3 = workbook.createFont();
184                             font3.setColor(HSSFColor.BLUE.index);
185                             richString.applyFont(font3);
186                             cell.setCellValue(richString);
187                         }
188                     }
189                 } catch (SecurityException e) {
190                     e.printStackTrace();
191                 } catch

以上是关于struts2中利用POI导出Excel文档并下载的主要内容,如果未能解决你的问题,请参考以下文章

Springboot利用poi导出excel下载

spring+struts2+mybatis中poi导出excel数据

poi 架包导出excel,并下载

如何让java利用POI导出excel表,并在Excel表中根据表格的数据生成柱形图。要求柱形图是动态的。

利用POI进行Excel的导出

Springboot导出Excel并下载