上篇文章中,我们实现了数据的导出为excel,但是在测试的时候发现,访问action的时候在地址栏中输入会出现相应的结果,但在a标签中,就不能使用了,会出现如下界面:
获取不到相应的文件,原因是上篇文章中把数据返回给用户的时候是通过response带出去的,这可能与我们的请求方式或者struts框架有关系,修订版本,在struts中进行相应的配置,然后在action中InputStream返回输出,这就和我们的struts框架很好的结合起来了,连接方式:<a href=http://localhost:8080/min/excelAction.do>数据导出</a>
1、struts配置
<action name="excelAction" class="excelAction"> <result name="success" type="stream"> <param name="contentType">application/vnd.ms-excel</param> <param name="contentDisposition">attachment;fileName="${fileName}"</param> <param name="inputName">excelFile</param> </result> </action>
2、Action代码
package com.repair.query.action; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletResponseAware; import com.opensymphony.xwork2.ActionSupport; import com.repair.common.pojo.DatePlanPri; import com.repair.common.pojo.JCZXFixRec; import com.repair.common.util.Contains; import com.repair.query.service.QueryService; /** * 处理Excel文件导入和导出 * * @author Administrator * */ public class ExcelAction extends ActionSupport{ /** * */ private static final long serialVersionUID = 4959349087464306283L; @Resource(name = "queryService") private QueryService queryService; private String fileName; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } /** * 导出excel * * @return */ public String execute() { return "success"; } /** * 文件导出 * @param os * @param map */ public InputStream getExcelFile() { HttpServletRequest request = ServletActionContext.getRequest(); Integer rjhmId = Integer.parseInt(request.getParameter("rjhmId")); DatePlanPri datePlan = queryService.findDatePlanPriById(rjhmId); //将数据从数据库中查询出来,并且自己封装成为一个map对象 Map<String, List<JCZXFixRec>> map = this.mapJCZXFixRec(rjhmId); fileName = datePlan.getJcType() + "-" + datePlan.getFixFreque() + "-" + datePlan.getJcnum() +"-"+dealDateString(datePlan.getKcsj())+".xls"; // 创建一个excel文件 HSSFWorkbook wb = new HSSFWorkbook(); for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext();) { String key = iterator.next(); // 创建一个sheet对象 HSSFSheet sheet = wb.createSheet(key); //设置单元格宽度 sheet.setColumnWidth(1, 6300); sheet.setColumnWidth(4, 5000); // 创建第一行 HSSFRow row = sheet.createRow(0); // 设置单元格 cteateCell(wb,row,0,"部件"); cteateCell(wb,row,1,"检修项目"); cteateCell(wb,row,2,"所处节点"); cteateCell(wb,row,3,"检修情况"); cteateCell(wb,row,4,"配件编号"); cteateCell(wb,row,5,"检修人"); cteateCell(wb,row,6,"工长"); cteateCell(wb,row,7,"质检员"); cteateCell(wb,row,8,"技术员"); cteateCell(wb,row,9,"交车工长"); cteateCell(wb,row,10,"验收员"); List<JCZXFixRec> jcZxFixRecs = map.get(key); for (int i = 1; i <= jcZxFixRecs.size(); i++) { JCZXFixRec jcZxFixRec = jcZxFixRecs.get(i - 1); row = sheet.createRow(i); cteateCell(wb,row,0,jcZxFixRec.getUnitName()); cteateCell(wb,row,1,jcZxFixRec.getItemName()); if (jcZxFixRec.getNodeId().intValue() == Contains.ZX_FG_NODEID.intValue()) { cteateCell(wb,row,2,"机车分解"); } else { cteateCell(wb,row,2,"车上组装"); } if (jcZxFixRec.getUnit() != null && !"".equals(jcZxFixRec.getUnit())) { cteateCell(wb,row,3,jcZxFixRec.getFixSituation() + jcZxFixRec.getUnit()); } else { cteateCell(wb,row,3,jcZxFixRec.getFixSituation()); } if (jcZxFixRec.getNodeId().intValue() == Contains.ZX_FG_NODEID.intValue()) { //创建单元格,并且给单元格设置值 row.createCell(4).setCellValue("/"); } else { if(jcZxFixRec.getUpPjNum()==null){ row.createCell(4).setCellValue(""); }else{ cteateCell(wb,row,4,jcZxFixRec.getUpPjNum()); } } if(jcZxFixRec.getFixEmp()!=null){ row.createCell(5).setCellValue(jcZxFixRec.getFixEmp().substring(1, jcZxFixRec.getFixEmp().length() - 1) + " " + jcZxFixRec.getFixEmpTime().substring(5,16)); }else{ row.createCell(5).setCellValue(""); } if(jcZxFixRec.getLead()!=null){ row.createCell(6).setCellValue(jcZxFixRec.getLead()+" "+jcZxFixRec.getLdAffirmTime().substring(5,16)); }else{ row.createCell(6).setCellValue(""); } if(jcZxFixRec.getQi()==null&&jcZxFixRec.getItemCtrlQi()==1){ row.createCell(7).setCellValue(""); }else if(jcZxFixRec.getQi()==null&&jcZxFixRec.getItemCtrlQi()==0){ row.createCell(7).setCellValue("/"); }else{ row.createCell(7).setCellValue(jcZxFixRec.getQi()+" "+jcZxFixRec.getQiAffiTime().substring(5,16)); } if(jcZxFixRec.getTeachName()==null&&jcZxFixRec.getItemCtrlTech()==1){ row.createCell(8).setCellValue(""); }else if(jcZxFixRec.getTeachName()==null&&jcZxFixRec.getItemCtrlTech()==0){ row.createCell(8).setCellValue("/"); }else{ row.createCell(8).setCellValue(jcZxFixRec.getTeachName()+" "+jcZxFixRec.getTeachAffiTime().substring(5,16)); } if(jcZxFixRec.getCommitLead()==null&&jcZxFixRec.getItemCtrlComld()==1){ row.createCell(9).setCellValue(""); }else if(jcZxFixRec.getCommitLead()==null&&jcZxFixRec.getItemCtrlComld()==0){ row.createCell(9).setCellValue("/"); }else{ row.createCell(9).setCellValue(jcZxFixRec.getCommitLead()+" "+jcZxFixRec.getComLdAffiTime().substring(5,16)); } if(jcZxFixRec.getAcceptEr()==null&&jcZxFixRec.getItemCtrlAcce()==1){ row.createCell(10).setCellValue(""); }else if(jcZxFixRec.getAcceptEr()==null&&jcZxFixRec.getItemCtrlAcce()==0){ row.createCell(10).setCellValue("/"); }else{ row.createCell(10).setCellValue(jcZxFixRec.getAcceptEr()+" "+jcZxFixRec.getAcceAffiTime().substring(5,16)); } } sheet.autoSizeColumn(5);//调整第六列的宽度 sheet.autoSizeColumn(6);//调整第七列的宽度 sheet.autoSizeColumn(7);//调整第八列的宽度 sheet.autoSizeColumn(8);//调整第九列的宽度 sheet.autoSizeColumn(9);//调整第十列的宽度 sheet.autoSizeColumn(10);//调整第11列的宽度 } ByteArrayOutputStream baos=new ByteArrayOutputStream(); try { wb.write(baos); } catch (IOException e1) { e1.printStackTrace(); } byte[] buf=baos.toByteArray(); //转换为InputStream InputStream is=new ByteArrayInputStream(buf); return is; } /** * 将检修记录封装为一个map对象 * * @param rjhmId * @return */ private Map<String, List<JCZXFixRec>> mapJCZXFixRec(Integer rjhmId) { List<JCZXFixRec> jcZxFixRecs = queryService.findJCZXFixRec(rjhmId); Map<String, List<JCZXFixRec>> map = new HashMap<String, List<JCZXFixRec>>(); for (JCZXFixRec jcZxFixRec : jcZxFixRecs) { String unitName = jcZxFixRec.getUnitName(); if (map.get(unitName) == null) { map.put(unitName, new ArrayList<JCZXFixRec>()); } map.get(unitName).add(jcZxFixRec); } return map; } /** * 创建带有样式的表格 * @param wb * @param row * @param col * @param val */ private void cteateCell(HSSFWorkbook wb,HSSFRow row,int col,String val) { //创建一个celll单元格 HSSFCell cell=row.createCell(col); cell.setCellValue(val); //创建样式 HSSFCellStyle cellstyle=wb.createCellStyle(); cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);//居中对齐 cellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直方向居中对齐 // cellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//带边框 cellstyle.setWrapText(true);//设置自动换行 cell.setCellStyle(cellstyle);//给单元格设置样式 } /** * 格式数据 * @param str * @return */ @SuppressWarnings("unused") private String format(String str) { if (str != null && !"".equals(str)) { return str; } return ""; } /** * 处理日期字符串 * @param date * @return */ private String dealDateString(String date){ if(date!=null&&!"".equals(date)){ String[] str=date.split("-"); return str[1]+str[2].substring(0,2); }else{ return ""; } } }
这样我们就可以下载文件了,会得到我们想要的结果,大家可以试一试吧,poi简介及详情信息,请查看我博客里面的上篇文章!
转载于:https://blog.51cto.com/8786457/1389927