Java导出csv文件

首先,文件导出不需要前端做操作,只需格式对上即可,建议前端请求采用form表单请求,

即:Content-Type=application/x-www-form-urlencoded

下面主要记录了使用CsvWriter工具类写csv文件,并且解决文件名乱码、文件内容乱码等问题,但是该方法是为了http请求设计,故不能通过运行验证。但是代码已通过验证,可以参考:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import com.csvreader.CsvWriter;

/**
 * csv导出
 * @author xiaowei 2018年5月15日 上午11:35:42
 */
public class CsvExport {

    public void exportCsv(HttpServletResponse response) {

        // 1、获取待写入信息
        // 获取csv第一行
        String[] headers = new String[] { "第一列", "第二列" };
        // 获取行记录list
        List<String[]> recordList = new ArrayList<>();

        try {
            // 2、设置HttpServletResponse相关信息
            // 文件名前缀
            String namePrefix = "csvExport测试";
            // 注意,response这些格式设置,必须在设置下面response流相关操作之前,否则会指定默认的格式编码。也就是说之后设置会无效
            // 设置自动下载及文件名等信息,URLEncoder是为了解决文件名中文乱码问题
            response.setContentType("application/csv;charset=utf-8");
            response.setHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.encode(namePrefix + ".csv", "UTF-8"));

            // 3、将记录写入临时csv文件
            // 创建临时文件,不关心文件路径
            File tempFile = File.createTempFile(namePrefix, ".csv");
            CsvWriter csvWriter = new CsvWriter(tempFile.getCanonicalPath(), ',',
                Charset.forName("UTF-8"));
            // 写表头,实际上就是写第一行
            csvWriter.writeRecord(headers);
            // 写正文内容
            for (String[] record : recordList) {
                csvWriter.writeRecord(record);
            }
            csvWriter.close();

            // 4、将文件写入response
            InputStream in = new FileInputStream(tempFile);
            OutputStream out = response.getOutputStream();
            int n = 0;
            byte[] buffer = new byte[1024];
            while ((n = in.read(buffer)) > 0) {
                // 加上BOM标识,否则会乱码,微软的锅[摊手][摊手]
                out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
                out.write(buffer, 0, n);
            }
            out.close();
            in.close();
        } catch (IOException e) {
            // FIXME 通常可以抛出系统业务异常等自定义操作
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值