- csv工具类
CsvUtils
此处使用LinkedHashMap
链表哈希表,实现键值中值为空时仍存在数据以及保证顺序与sql顺序一致。
package com.xxx.xxx.utils;import lombok.val;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;public class CsvUtils {private static final String CSV_COLUMN_SEPARATOR = ",";private static final String CSV_ROW_SEPARATOR = "\r\n";public static void doExport(List<LinkedHashMap<String, String>> dataList, String titles, String keys, OutputStream os)throws Exception {StringBuffer buf = new StringBuffer();String[] titleArr = null;String[] keyArr = null;titleArr = titles.split(",");keyArr = keys.split(",");for (String title : titleArr) {buf.append(title).append(CSV_COLUMN_SEPARATOR);}buf.append(CSV_ROW_SEPARATOR);if (!CollectionUtils.isEmpty(dataList)) {for (Map<String, String> data : dataList) {for (String key : keyArr) {buf.append(CsvUtils.handleFormatValue(data.get(key))).append(CSV_COLUMN_SEPARATOR);}buf.append(CSV_ROW_SEPARATOR);}}os.write(buf.toString().getBytes("GBK"));os.flush();}public static void responseSetProperties(String fileName, HttpServletResponse response)throws UnsupportedEncodingException {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String fn = fileName + sdf.format(new Date()) + ".csv";String utf = "UTF-8";response.setContentType("application/ms-txt.numberformat:@");response.setCharacterEncoding(utf);response.setHeader("Pragma", "public");response.setHeader("Cache-Control", "max-age=30");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fn, utf));}private static String handleFormatValue(Object data) {if (data == null) {return "";}String val = data.toString();if (val.contains("\"") ){val=val.replace("\"", "\"\"");}if (val.contains(",")) {val = "\""+val+"\"";} else {val = "\t" + val;}return val;}
}
- 修改
yml
中mybatis
配置 根据实际情况修改call-setters-on-nulls
为true
即可
mybatis-plus:# 扫描mapper.xml文件mapper-locations: classpath:mapper*
controller
查询后导出
@RequestMapping("generateCSV")@CrossOriginpublic void generateHqmsCSV(HttpServletResponse response,@RequestBody Map<String,Object> data) throws Exception {ServletOutputStream outputStream = response.getOutputStream();String keys = "";List<LinkedHashMap<String, String>> dataList = xxxMapper.getxxx(data);for (Map.Entry<String, String> entry : dataList.get(0).entrySet()) {keys += entry.getKey()+",";}keys = removeTrailingComma(keys);CsvUtils.doExport(dataList,keys,keys,outputStream);}public static String removeTrailingComma(String str) {if (str.endsWith(",")) {return str.substring(0, str.length() - 1);}return str;}
- 前台调用(需要先跨域后使用,详见跨域问题解决(后端Java+前端Vue2))
- END