java实现将数据写入excel后实现下载

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无反应,前端报错。显示因为将文件写入本地文件夹下,浏览器默认保护不打开本地文件夹

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值