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