spring boot/spring 后台生成csv

csv格式行中每个字段之间以",“隔开,行与行以”\n"作为分隔符.

通过流的方式去生成文件弊端:前端无法得知后台下载是否成功,后台生成流异常时,前端也无法得知,因为得到的依然是200.即使Controller有返回方法也是一样,至于详细原因跟内容我就不说了.
如果想让前端知道是否成功下载了文件,可以通过后台生成文件保存本地,再通过文件下载器的方式下载.(后面有时间我会做这个方式)
controller

    @ApiOperation(value="获取csv下载",notes = "")
    @GetMapping(value="/getcsvfile")
    public void getCSVFile(HttpServletResponse response){
        try {
           service.getCSVFile(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

service

public void getCSVFile( HttpServletResponse response) throws Exception {
				StringBuffer sb = new StringBuffer();
		//获取表头数据 
		ArrayList<String> headList = xxx.xxx;
		String headStr = new String();
		for (int i = 0; i < headList .size(); i++) {
			headStr+=","+headList.get(i);
		}
		//比如: "姓名,学号,分数\n"这就是csv中的一行数据
		sb.append(headStr.substring(1));
		//通过dao获取数据
		ArrayList<ArrayList<String>> dataList = xxx.xxx;
		for (int i = 0; i < dataList.size(); i++) {
			ArrayList<String> list = dataList.get(i);
			String dataStr = new String();
			for (int j = 0; j < list .size(); j++) {
				dataStr +=","+list.get(i);
			}
			sb.append(dataStr.substring(1));
		}
		//上述中把数据拼接成类似于:姓名,学号,分数\n张三,01,100\n李四,02,80....的数据格式
		//把拼接的字符串输出到浏览器
		createCSV(sb,response);
	}

public void createCSV(StringBuffer sb, HttpServletResponse response) throws Exception {
        PrintWriter os =null;
        try {
            //解决文件名中文乱码问题
            String fileName = "文件下载_"+System.currentTimeMillis() + ".csv";
        	String userAgent = request.getHeader("User-Agent");
                    if(userAgent.contains("MSIE")||userAgent.contains("Trident")) {
                      //ie浏览器
                        fileName=URLEncoder.encode(fileName,"UTF-8");
                    }else {
                        //其他浏览器
                        fileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
                    }
            //告诉浏览器要下载内容
            response.setContentType("application/octet-stream;charset=utf-8");
            response.setCharacterEncoding("UTF-8");
            //浏览器会把输入流写入文件
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            OutputStream outputStream = response.getOutputStream();
            outputStream.write(new   byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });
            os = new PrintWriter(new OutputStreamWriter(outputStream,"UTF-8"));
            os.print(sb);
            os.flush();
        }finally{
            try {
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值