工具类
package robot.util;
import org.apache.commons.collections4.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* csv 导出工具类
* @author gdd
*/
public class CsvExportUtil {
/**
* CSV文件列分隔符
*/
private static final String CSV_COLUMN_SEPARATOR = ",";
/**
* CSV文件行分隔符
*/
private static final String CSV_ROW_SEPARATOR = System.lineSeparator();
/**
* @param dataList 集合数据
* @param titles 表头部数据
* @param keys 表内容的键值
* @param os 输出流
*/
public static void doExport(List<Map<String, Object>> 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.isNotEmpty(dataList)) {
for (Map<String, Object> data : dataList) {
for (String key : keyArr) {
buf.append(data.get(key)).append(CSV_COLUMN_SEPARATOR);
}
buf.append(CSV_ROW_SEPARATOR);
}
}
// 写出响应
os.write(buf.toString().getBytes("UTF-8"));
os.flush();
}
/**
* 设置Header
*
* @param fileName
* @param response
* @throws UnsupportedEncodingException
*/
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=" + fn);
}
}
controller
@ApiOperation("csv 导出")
@RequestMapping(value = "export")
public void exportCsv(HttpServletResponse response, @RequestParam(value = "gameroom", required = false) String gameroom,
@RequestParam(value = "gamecode", required = false) String gamecode,
@RequestParam(value = "currency", required = false) String currency
) {
// 构造导出数据结构
// 设置表头
String titles = "currency,game,room,triggerTime,percentage";
// 设置每列字段
String keys = "currency,game,room,triggerTime,percentage";
// 构造导出数据
List<Map<String, Object>> datas = new ArrayList<>();
Map<String, Object> mapInfo;
RobotOffline task = new RobotOffline();
logger.info("offline gameroom:{}", new Object[]{gameroom});
logger.info("offline gamecode:{}", new Object[]{gamecode});
logger.info("offline currency:{}", new Object[]{currency});
task.setGamecode(gamecode);
task.setCurrency(currency);
task.setGameroom(gameroom);
try {
List<RobotOffline> taskList = offlineService.queryList(task);
logger.info("offline taskList:{}", new Object[]{JackSonUtil.toJSon(taskList)});
if (!CollectionUtils.isEmpty(taskList)) {
for (RobotOffline offline : taskList) {
logger.info("offline game:{},romm:{}currenct:{} ", new Object[]{offline.getGamecode(), offline.getGameroom(), offline.getCurrency()});
mapInfo = new HashMap<>(8);
mapInfo.put("currency", offline.getCurrency());
mapInfo.put("game", offline.getGamecode());
mapInfo.put("room", offline.getGameroom());
mapInfo.put("triggerTime", offline.getTriggerTime());
mapInfo.put("percentage", offline.getPercentage());
datas.add(mapInfo);
}
}
// 设置导出文件前缀
String fName = "robotOfflineSetting_";
// 文件导出
OutputStream os = response.getOutputStream();
CsvExportUtil.responseSetProperties(fName, response);
CsvExportUtil.doExport(datas, titles, keys, os);
} catch (Exception e) {
logger.error("导出失败" + e.getMessage(), e);
}
}
html 页面
<button id="export" class="btn float-right btn-info"
data-toggle="tooltip" title="导出" type="button">
<i class="fas fa-cloud-download-alt"></i>
</button>
function download() {
let sc = $("#q_currency option:selected").text();
let gc = $("#q_gameCode").val();
let gm = $("#q_gameRoom").val();
let urlString=window.location.href;
urlString=urlString.substring(0, urlString.indexOf("/page")).trim();
var url = urlString+"/offline/export?currency=" + sc + "&gamecode=" + gc + "&gameroom=" + gm;
window.open(url);
}