您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Web开发 >> (jsp)实现excel导出 ajax的post请求将json数据发给servlet后无法下载excel文件

(jsp)实现excel导出 ajax的post请求将json数据发给servlet后无法下载excel文件

来源:网络整理     时间:2016/5/31 11:41:55     关键词:

关于网友提出的“(jsp)实现excel导出 ajax的post请求将json数据发给servlet后无法下载excel文件”问题疑问,本网通过在网上对“(jsp)实现excel导出 ajax的post请求将json数据发给servlet后无法下载excel文件”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题:(jsp)实现excel导出 ajax的post请求将json数据发给servlet后无法下载excel文件
描述:

本帖最后由 u012671982 于 2016-02-03 21:27:43 编辑

servletajaxexceljson

小白一只,做的javaweb项目,要求是把一个json数据发到服务端,生成一个excel文件来让客户端下载。
在网上找到了一个例子改了改,例子是用submit请求servlet的url,点击按钮后直接出现了下载文件,excel的内容是后台写好的。
我改成了先解析json数据,再生成对应excel,用的是poi,但是生成出来后没有出现下载提示,反而在浏览器控制台回调了ajax的
error函数,输出“请求失败”提示,已经改了两天没有什么眉目,分不多,还请大家帮忙。
js代码:

        rowsObj.rows=rows;
/*rowsObj.rows里面是两个人的数据:[{"realname":"张三","phone":"1571310000","partner":"暂无","regtime":"2015-12-29 08:54:30","school":"暂无"},{"realname":"李四","phone":"1571310001","partner":"暂无","regtime":"2015-12-29 08:54:31","school":"暂无"}]*/
$.ajax({
type : "post",
url : "/file/excel",
data : JSON.stringify(rowsObj),
contentType : "application/json",
dataType : "json",
success : console.log("传输成功"),
error : function() {
console.log("请求失败");
}
});

servlet代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@WebServlet("/file/excel")
public class excel extends HttpServlet {
    
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");  
    String acceptjson = ""; 
    
  BufferedReader br = new BufferedReader(new InputStreamReader( (ServletInputStream) request.getInputStream(), "utf-8"));  
      StringBuffer sb = new StringBuffer("");  
      String temp;  
      while ((temp = br.readLine()) != null) {  
          sb.append(temp);  
      }  
      br.close();  
      acceptjson = sb.toString();  
      if (acceptjson != "") {  
          JSONObject jsondata = JSONObject.parseObject(acceptjson);  
          JSONArray rows = jsondata.getJSONArray("rows");  
          ArrayList dataList = new ArrayList();
          
          for (int i = 0; i < rows.size(); i++) {
          JSONObject tempjson = (JSONObject) rows.get(i);
          ArrayList templist = new ArrayList(); 
          
         String phone = tempjson.getString("phone");
         templist.add(phone);
        
         String realname = tempjson.getString("realname");
         templist.add(realname);
        
         String regtime = tempjson.getString("regtime");
         templist.add(regtime);
        
         String school = tempjson.getString("school");
         templist.add(school);
        
         String partner = tempjson.getString("partner");
         templist.add(partner);
        
         dataList.add(templist);
          }
    //初始化fieldName,fieldDate
    ArrayList fieldName=getFieldName();    //excel标题数据集
    ArrayList fieldData=dataList;    //excel数据内容
    String myexcel="Info";
    response.reset();
    response.setContentType("application/vnd.ms-excel;charset=utf-8");   
    response.setHeader("Content-Disposition", "attachment;filename=" + myexcel);
    response.setCharacterEncoding("utf-8");    
    OutputStream ouputStream = response.getOutputStream();   
    ExcelFileGenerator efg=new ExcelFileGenerator(fieldName, fieldData);//调用另一个类的方法,详见下
    try {
     HSSFWorkbook mybook = efg.expordExcel();//调用另一个类的方法,详见下
     mybook.write(ouputStream);//写入到输出流
} catch (Exception e) {
e.printStackTrace();
}
      ouputStream.flush();   
      ouputStream.close();   
    }        
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
       this.doGet(request, response);
  }
  //模拟提供excel中的标题数据集
  public ArrayList getFieldName(){
    String str[]={"电话","姓名","注册时间","学校","伙伴"};//设置excel的第一行作为标题
    ArrayList list=new ArrayList();
    for(int i=0;i<>
      list.add(str[i]);
    }
    return list;
  }
}

另一个核心类代码,用来生成excel各行数据和设置样式:

/**
 * 系统数据导出Excel 生成器
 * @version 1.0
 */
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import javax.servlet.ServletOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
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;
public class ExcelFileGenerator {
  private final int SPLIT_COUNT = 1500; //Excel每个工作簿的行数
  private ArrayList fieldName = null; //excel标题数据集
  private ArrayList fieldData = null; //excel数据内容
  private HSSFWorkbook workBook = null;
  /**
   * 构造器
   * @param fieldName 结果集的字段名
   * @param data
   */
  public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) {
    this.fieldName = fieldName;
    this.fieldData = fieldData;
  }
  /**
   * 创建HSSFWorkbook对象
   * @return HSSFWorkbook
   */
  public HSSFWorkbook createWorkbook() {
    workBook = new HSSFWorkbook();
    int rows = fieldData.size();
    int sheetNum = 0;
    if (rows % SPLIT_COUNT == 0) {
      sheetNum = rows / SPLIT_COUNT;
    } else {
      sheetNum = rows / SPLIT_COUNT + 1;
    }
    for (int i = 1; i <= sheetNum; i++) {
      HSSFSheet sheet = workBook.createSheet("Page " + i);
      HSSFRow headRow = sheet.createRow((short) 0); 
      for (int j = 0; j < fieldName.size(); j++) {
        HSSFCell cell = headRow.createCell((short) j);
        //添加样式
        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
//        cell.setEncoding(HSSFCell.ENCODING_UTF_16);//这句话会报错,注释后无明显问题
        //添加样式
        //设置所有单元格的宽度
        sheet.setColumnWidth((short)j, (short)6000);
        //创建样式(使用工作本的对象创建)
        HSSFCellStyle cellStyle = workBook.createCellStyle();
        //创建字体的对象
        HSSFFont font = workBook.createFont();
        //将字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        //设置字体的颜色
        short color = HSSFColor.RED.index;
        font.setColor(color);
        //将新设置的字体属性放置到样式中
        cellStyle.setFont(font);
        if(fieldName.get(j) != null){
          cell.setCellStyle(cellStyle);
          cell.setCellValue((String) fieldName.get(j));
        }else{
          cell.setCellStyle(cellStyle);
          cell.setCellValue("-");
        }
      }
      for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) {
        HSSFRow row = sheet.createRow((short) (k + 1));
        //将数据内容放入excel单元格
        ArrayList rowList = (ArrayList) fieldData.get((i - 1)* SPLIT_COUNT + k);
        for (int n = 0; n < rowList.size(); n++) {
          HSSFCell cell = row.createCell((short) n);
//          cell.setEncoding(HSSFCell.ENCODING_UTF_16);//这句话会报错,注释后无明显问题
          if(rowList.get(n) != null){
            cell.setCellValue((String) rowList.get(n).toString());
          }else{
            cell.setCellValue("");
          }
        }
      }
    }
    return workBook;
  }
  public HSSFWorkbook expordExcel() throws Exception {
  try{
 workBook = createWorkbook();
 return workBook;
    }catch(Exception e){
     e.printStackTrace();
     return null;
    }
  }
}

运行结果:
(jsp)实现excel导出   ajax的post请求将json数据发给servlet后无法下载excel文件
解决方案1:

var url="purchaseorderexcel";
var datas='g=["订单查询列表","'+url+'","'+names+'","'+keys+'",'+data+']';
        $.ajax({
url:"downloadExcel",
data:datas,
type:"post",
async:"true",
contentType: "application/x-www-form-urlencoded; charset=utf-8", 
success:function(responseText){
window.open(url);
        },
error:function(){
$.ligerDialog.closeWaitting();
alert("无法生成excel");
}
});

解决方案2:

改成表单提交方式,不要用ajax


以上介绍了“(jsp)实现excel导出 ajax的post请求将json数据发给servlet后无法下载excel文件”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1432755.html

相关图片

相关文章