需要的jar包
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.5.2</version>
</dependency>
api
export: (data) => {
return axios({
url: '/export',
method: 'post',
data,
responseType: 'blob'
})
}
处理响应
handleExport: () => {
api.export(param).then((res) => {
const link = document.createElement('a')
let blob = new Blob([res.data], {type: 'text/csv'})
link.style.display = 'none'
link.href = URL.createObjectURL(blob)
let fileName = res.headers['finename']
link.setAttribute('download', decodeURI(fileName))
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
})
}
Controller
@Slf4j
@RestController
@RequestMapping(value = "/demo", produces = "application/json;charset=utf-8")
public class DemoController{
@Autowired
DemoService demoService;
@RequestMapping(value = "/export")
public void export(@RequestBody JSONObject param, HttpServletResponse response) {
log.info("导出CSV /demo/export 接收参数:" + JSONObject.toJSONString(param));
demoService.export(param, response);
}
@RequestMapping(value = "/export")
public void export(@RequestBody JSONObject param, HttpServletResponse response) {
log.info("导出CSV /demo/export 接收参数:" + JSONObject.toJSONString(param));
demoService.export(param, response);
}
}
Service
public void export(JSONObject param, HttpServletResponse response) {
String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String fileName = "导出" + date + ".csv";
List<JSONObject> data = demoMapper.export(param);
String[] titles = {"姓名", "性别", "身高"};
String[] columns = {"name", "sex", "height"};
try (OutputStream out = response.getOutputStream();
CSVParserWriter writer = new CSVParserWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8), new RFC4180ParserBuilder().build(), "\n")) {
response.setHeader("Content-Disposition", "attachment");
response.setHeader("filename", URLEncoder.encode(fileName, "UTF8"));
response.setContentType("text/csv");
writer.writeNext(titles);
for (JSONObject task : data) {
List<String> row1 = new ArrayList<>();
for (String column: columns) {
row1.add(String.valueOf(task.get(column)));
}
String[] row2 = row1.toArray(new String[0]);
writer.writeNext(row2);
}
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}
}