在运营后台开发场景中,经常会有导出数据的开发场景,而导出文件时一般都是使用cvs格式文件.虽然在大部分情况,我们都是使用公司封装好的方法直接进行调用,但是我们还是得知道如何进行文件的导出,如果进行文件的上传下载,不然有时无法解决一些特殊情况.下面是导出cvs文件的一个简单方法,如果想导出xls文件的话,那么下载相应的第三方jar依赖,然后使用相应的方法就行.
package com.gudt.example.controller;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
/**
* @Auther: lyf
* @Date: 2019-08-08 20:34
* @Description:
*/
@Controller
public class TestController {
/**
* 需求:url的文件资源是一个txt文件,当浏览器获取到这个文件流的时候,浏览器会自动解析显示在浏览器上
* 所以就无法进行文件的下载.但是如果将文件转换成cvs格式的话,那么浏览器就不会解析,就能进行文件的下载操作
* cvs格式和xls格式很像,在开发中很常用
* <p>
* 这里的txt文件内容是规则的,每一行的格式如:'abc abc',中间已字符串作为分隔符
*
* @param url
* @param response
*/
@RequestMapping("/transfer")
public void transfer(String url, HttpServletResponse response) {
try {
URL resource = new URL(url);
if (resource == null)
return;
try (BufferedReader in = new BufferedReader(new InputStreamReader(resource.openStream()));
PrintWriter out = response.getWriter()) {
String str;
while ((str = in.readLine()) != null) {
//将制表位替换成",",cvs格式文件会自动使用","来作为分隔符
str.replace("\t", ",");
//println会自动进行换行
out.println(str);
}
response.setCharacterEncoding("UTF-8");
//以二进制流的格式进行输出
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
//需要指定一下下载的文件名,否则格式无法识别
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("账号密码", "UTF-8") + System.currentTimeMillis() + ".csv");
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
/**
* 这样就能生成一个csv文件
*
* @param response
*/
@RequestMapping("/testCvs")
public void testCvs(HttpServletResponse response) {
StringBuilder sb = new StringBuilder();
sb.append("账号,密码\n");
sb.append("abc,123\n");
sb.append("abc,123\n");
sb.append("abc,123\n");
try {
response.setCharacterEncoding("UTF-8");
response.getWriter().write(sb.toString());
//以二进制流的格式进行输出
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
//需要指定一下下载的文件名,否则格式无法识别
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("账号密码", "UTF-8") + System.currentTimeMillis() + ".csv");
} catch (IOException e) {
e.printStackTrace();
}
}
}