csv导出百万级数据(2),使用浏览器下载导出的csv文件

1:测试数据200多万,项目使用,问题:打开csv文件后发现,文字乱码,暂时没解决,这里提供一个思路

2:csv工具类

package com.wptx.comm.config;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.CollectionUtils;

public class CsvExportUtil {

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

    /**
     * CSV文件行分隔符
     */
    private static final String CSV_ROW_SEPARATOR = "\r\n";
    
    private final static byte commonCsvHead[] = { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF };

    /**
     * @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("gbk"));
        os.flush();
    }

    /**
              * 设置Header
     *
     * @param fileName
     * @param response
     * @throws UnsupportedEncodingException
     */
    public static void responseSetProperties(String fileName, HttpServletResponse res) throws UnsupportedEncodingException {
        // 设置文件后缀
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String fn = fileName + sdf.format(new Date()) + ".csv";
        // 读取字符编码
        String utf = "UTF-8";

        // 设置响应
        res.setContentType("application/csv;charset=UTF-8");//application/ms-txt.numberformat:@   ||  application/csv;charset=UTF-8
        res.setCharacterEncoding(utf);
        res.setHeader("Pragma", "public");
        res.setHeader("Cache-Control", "max-age=30");
        res.setHeader("Content-Disposition:attachment", "filename=" + URLEncoder.encode(fn, utf));
    }
    
    
    
    

}

3:业务层

// 查询需要导出的数据
		List<TaskStoreItemDTO> dataList = mapper.export(taskId);
        // 构造导出数据结构
		// 设置表头
        String titles = "组号,组名,时间"; 
        // 设置每列字段和实体类字段一致
        String keys = "tabNbr,regionName,smallRegionName";  
        
        // 构造导出数据
        List<Map<String, Object>> datas = new ArrayList<>();
        Map<String, Object> map = null;
        for (TaskStoreItemDTO data : dataList) {
            map = new HashMap<>();
            map.put("tabNbr", data.getTabNbr());
            map.put("regionName", data.getRegionName());
            map.put("smallRegionName", data.getSmallRegionName());
            datas.add(map);
        }
        // 设置导出文件前缀
        String fName = "data_";
        // 文件导出
        try {
            OutputStream os = res.getOutputStream();
            CsvExportUtil.responseSetProperties(fName, res);
            CsvExportUtil.doExport(datas, titles, keys, os);
            os.close();
        } catch (Exception e) {
            log.error("导出失败", e.getMessage());
            return ResultVOUtil.error(ErrorEnum.EXPORT_GOODS_TABNBR_ISNULL);
        }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值