csv生成临时文件,供前端下载,解决windows打开utf-8的csv乱码问题

@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

猜你喜欢

转载自blog.csdn.net/qq_23367963/article/details/82911863
今日推荐