关于网友提出的“(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;
}
}
}
运行结果:

解决方案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