@LogRecord(operateName = "导出操作日志", eventCategory = LogEventCat.USER, requestType = LogRequestType.QUERY, targetType = LogTargetType.USER, riskLevel = LogRiskLevel.LOW) @RequiresRoles(value = { "safeadmin", "safeauditor" }, logical = Logical.OR) @RequestMapping(value = "/exportCsv", method = RequestMethod.GET) public void exportCsv(HttpServletRequest request, HttpServletResponse response, LogCriteria logCriteria) { String realPath = request.getRealPath("/"); // 表格头 Object[] head = { "日志编号", "请求类型", "操作名称", "目标类型", "操作状态", "操作人", "操作人IP", "操作时间", "事件种类", "风险等级", "行为类别" }; List<Object> headList = Arrays.asList(head); User u = (User) SecurityUtils.getSubject().getPrincipal(); if (u != null) { Role role = u.getRoles().get(0); logCriteria.setRoleCode(role.getRoleCode()); } Map<String, Object> dataMap = new HashMap<String, Object>(); dataMap.put("roleCode", logCriteria.getRoleCode()); if (StringUtils.isNotEmpty(logCriteria.getName())) { dataMap.put("name", logCriteria.getName()); } if (StringUtils.isNotEmpty(logCriteria.getOperateStatus())) { dataMap.put("operateStatus", logCriteria.getOperateStatus()); } if (StringUtils.isNotEmpty(logCriteria.getEventCategory())) { dataMap.put("eventCategory", logCriteria.getEventCategory()); } if (StringUtils.isNotEmpty(logCriteria.getRiskLevel())) { dataMap.put("riskLevel", logCriteria.getRiskLevel()); } if (StringUtils.isNotEmpty(logCriteria.getActionType())) { dataMap.put("actionType", logCriteria.getActionType()); } if (StringUtils.isNotEmpty(logCriteria.getTargetType())) { dataMap.put("targetType", logCriteria.getTargetType()); } if (StringUtils.isNotEmpty(logCriteria.getStartTimeStr())) { dataMap.put("startTimeStr", logCriteria.getStartTimeStr()); } if (StringUtils.isNotEmpty(logCriteria.getEndTimeStr())) { dataMap.put("endTimeStr", logCriteria.getEndTimeStr()); } if (StringUtils.isNotEmpty(logCriteria.getRoleCode())) { dataMap.put("roleCode", logCriteria.getRoleCode()); } if (StringUtils.isNotEmpty(logCriteria.getDatacenterName())) { dataMap.put("datacenterName", logCriteria.getDatacenterName()); } String result = ApiHelper.doPost(logUrl + "/rest/logRest/list", dataMap); List<Log> data = JSONArray.parseArray(result, Log.class); // 数据 List<List<Object>> dataList = new ArrayList<List<Object>>(); List<Object> rowList = null; if (data != null) { for (int i = 0; i < data.size(); i++) { Log log = data.get(i); rowList = new ArrayList<Object>(); rowList.add(log.getId()); rowList.add(log.getRequestType()); rowList.add(log.getOperateName()); rowList.add(log.getTargetType()); rowList.add(log.getOperateStatus()); rowList.add(log.getOperaterName()); rowList.add(log.getOperaterIp()); rowList.add(log.getOperateTimeStr()); rowList.add(log.getEventCategory()); rowList.add(log.getRiskLevel()); rowList.add(log.getActionType()); dataList.add(rowList); } } String fileName = "操作记录.csv";// 文件名称 File csvFile = null; BufferedWriter csvWtriter = null; try { csvFile = File.createTempFile("操作记录", ".csv"); File parent = csvFile.getParentFile(); if (parent != null && !parent.exists()) { parent.mkdirs(); } csvFile.createNewFile(); // csvWtriter = new BufferedWriter(new OutputStreamWriter(new // FileOutputStream(csvFile), "GB2312"), 1024); response.setContentType("application/csv;charset=utf-8"); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8")); ServletOutputStream out = response.getOutputStream(); byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};//windows的excel只能打开有BOM的utf-8 out.write(uft8bom); csvWtriter = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"/**不写的话,windows默认GB2312,linux默认utf-8*/), 1024); int num = headList.size() / 2; StringBuffer buffer = new StringBuffer(); for (int i = 0; i < num; i++) { buffer.append(" ,"); } // 本地下载文件 csvWtriter.write(buffer.toString() + fileName // +buffer.toString()); // csvWtriter.newLine(); // csvWtriter.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF })); // 写入文件头部 writeRow(headList, csvWtriter); // 写入文件内容 for (List<Object> row : dataList) { writeRow(row, csvWtriter); } csvWtriter.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { csvWtriter.close(); } catch (IOException e) { e.printStackTrace(); } } }
private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {
for (Object data : row) {
StringBuffer sb = new StringBuffer();
String rowStr = sb.append("\"").append(data).append("\",").toString();
csvWriter.write(rowStr);
}
csvWriter.newLine();
}
参考博客:https://www.cnblogs.com/always-online/p/4801015.html