java csv导出

public class CSVUtils  extends BaseController {

//    /** CSV文件列分隔符 */
//    private static final String CSV_COLUMN_SEPARATOR = ",";
//
//    /** CSV文件列分隔符 */
//    private static final String CSV_RN = "\r\n";

    @RequestMapping(value = "/test")
    public  void exportCsv(HttpServletResponse response , HttpServletRequest request){
        long startTime = System.currentTimeMillis();
        // 设置表格头
        Object[] head = {"uid","gindex","作者"};
        List<Object> headList = Arrays.asList(head);
        List<Map<String, Object>> dataList = getNovel();

        System.out.println(dataList);

        // 导出文件路径
        String downloadFilePath = request.getSession().getServletContext().getRealPath("");
        // 导出文件名称
        String  fileName = "download";
        // 导出CSV文件
        File csvFile = CSVUtils.createCSVFile(headList, dataList, downloadFilePath, fileName);

//########################################################################
        try {

            // 取得文件名。
            String filename = csvFile.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
            // 以流的形式下载文件。
//            InputStream fis = new FileInputStream(csvFile);
            FileInputStream fis = new FileInputStream(csvFile);
            // 设置response的Header

            String userAgent = request.getHeader("User-Agent");
//            // 针对IE或者以IE为内核的浏览器:
            if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                filename = java.net.URLEncoder.encode(filename, "UTF-8");
            } else {
                // 非IE浏览器的处理:
                filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
            }
//            filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
            response.setHeader("Content-disposition",String.format("attachment; filename=\"%s\"", filename));
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("UTF-8");


//            response.addHeader("Content-Disposition", "attachment;filename=大数据.csv" );
//            response.addHeader("Content-Length", "" + csvFile.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");


            int content = 0;
            while ((content = fis.read()) != -1) {
                toClient.write(content);
            }
            fis.close();
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

//#############################################################################

        long endTime = System.currentTimeMillis();
        System.out.println("整个CSV导出"+(endTime-startTime));
    }

    public List<Map<String, Object>> getNovel() {

        List<Map<String, Object>> dataList = gameService.testList();  //换成自己的数据
        return dataList;
    }


    /**
     * CSV文件生成方法
     * @param head
     * @param dataList
     * @param outPutPath
     * @param filename
     * @return
     */
    public static File createCSVFile(List<Object> head,List<Map<String, Object>> dataList,String outPutPath, String filename) {
        File csvFile = null;
        BufferedWriter csvWtriter = null;
        try {
            csvFile = new File(outPutPath + File.separator + filename + ".csv");
            File parent = csvFile.getParentFile();
            if (parent != null && !parent.exists()) {
                parent.mkdirs();
            }
            csvFile.createNewFile();

            // GB2312使正确读取分隔符","
            csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"), 1024);
            // 写入文件头部
            writeRow(head, csvWtriter);

            List<List<Object>> sList = new ArrayList<List<Object>>();
            List<Object> rowList = null;
            for(Map<String,Object> mp : dataList) {
                rowList = new ArrayList<Object>();
                Object[] row = new Object[3];
                row[0] = mp.get("uid");
                row[1] = mp.get("gindex");
                row[2] = mp.get("scan_status");
                for(int j=0;j<row.length;j++){
                    rowList.add(row[j]);
                }
                sList.add(rowList);
            }

            // 写入文件内容
            for (List<Object> row : sList) {
                writeRow(row, csvWtriter);
            }
            csvWtriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                csvWtriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return csvFile;
    }

    /**
     * 写一行数据方法
     * @param row
     * @param csvWriter
     * @throws IOException
     */
    private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {
        // 写入文件头部
        for (Object data : row) {
            StringBuffer buf = new StringBuffer();
            String rowStr =  buf.append("\"").append(data).append("\t\",").toString();
            csvWriter.write(rowStr);
        }
        csvWriter.newLine();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值