上篇文章中,我们实现了数据的导出为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简介及详情信息,请查看我博客里面的上篇文章!