java实现将获取到的json数据写入excel后实现下载
前端代码
<div id="comm_down" class="btn margin" style="padding-top:5px;margin-top:0px;">下载</div>
$(function(){
//下载点击事件
$("#comm_down").click(function () {
alert("正在下载,请稍后");
$.ajax({
type: "POST",
url: "/download",
//传给后端的参数
data:{
express:pl,
page:encodeURIComponent(page),
pageRow:encodeURIComponent(pageRow)
},
success: function (data) {
// alert(data);
//将后端返回的地址直接打开
window.location.href = data;
alert("下载成功");
},
error:function () {
alert("生成失败");
}
})
})
});
后端代码
@WebServlet("/DownServlet")
public class DownServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取前端传来的参数
//根据参数获取json数据
//以上省略...
//获取当前时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String timeStamp = simpleDateFormat.format(new Date());
//获取当前根目录,拼接下载后想要存放的路径以及文件名
//本次以时间戳命名xls文件
String path = request.getSession().getServletContext().getRealPath("/") + "\\" + "uploads" + "\\" + timeStamp + ".xls";
String path2 = "\\" + "uploads" + "\\" + timeStamp + ".xls";
//创建excel
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个工作表sheet
HSSFSheet sheet = workbook.createSheet();
//创建第一行
HSSFRow row = sheet.createRow(0);
//表头信息
HSSFCell cell = row.createCell(0);
cell.setCellValue("..1");
cell = row.createCell(1);
cell.setCellValue("..2");
//....上面根据需要写入所需的列的表头
//遍历数据,将获取到的数据参数插入单元格
for (int i = 0; i < array.size(); i++) {
HSSFRow row1 = sheet.createRow(i + 1);
//创建单元格设值
JSONObject pidObj = (JSONObject) array.get(i);
row1.createCell(0).setCellValue(pidObj.getString("数据参数1"));
row1.createCell(1).setCellValue(pidObj.getString("数据参数2"));
//等等
}
//根据路径创建文件
String filename1 = path;
File file = new File(filename1);
//判断下载文件所处的文件夹是否存在,不存在则创建
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
//根据文件名判断文件是否存在,存在则删除上一个
if (file.exists()) {
file.delete();
}
}
//将文件保存到指定的位置
FileOutputStream os = null;
try {
//用流的形式将文件写入文件夹下
os = new FileOutputStream(file);
file.createNewFile();
//将数据写入
workbook.write(os);
log.debug("写入成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
//关流
os.close();
workbook.close();
}
//将路径写入response中,返回给前端
PrintWriter out = response.getWriter();
out.write(path2);
//防止文件夹下文件太多
//每次下载删除24小时之外的文件
String path3 = request.getSession().getServletContext().getRealPath("/") + "\\" + "uploads" + "\\";
File dir = new File(path3);
File[] lst = dir.listFiles();
for (File f : lst) {
if (new Date().getTime() - f.lastModified() > 24*60*60*1000 ) {
f.delete();
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
web.xml配置
<servlet>
<servlet-name>downDemo1</servlet-name>
<servlet-class>所在包下.DownServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downDemo1</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
总结: ajax不可以用流传输,所以不能直接用response输出
由此,可用window.location.href = “” 直接打开文件则下载 或用form表单提交形式传输response流
本次window.location.href无反应,前端报错。显示因为将文件写入本地文件夹下,浏览器默认保护不打开本地文件夹