Springboot集成univocity-parsers下载csv文件

说明

springboot下载csv参考:https://blog.csdn.net/sndayYU/article/details/119410446
下面工程以上面的为基础

代码

pom.xml和entity、mapper定义

<!-- csv工具 -->
        <dependency>
            <groupId>com.univocity</groupId>
            <artifactId>univocity-parsers</artifactId>
            <version>2.8.4</version>
        </dependency>
@Data
public class DownloadVo {
    @Parsed(field = "文章id")
    private Long id;
    @Parsed(field = "文章标题")
    private String title;
    @Parsed(field = "内容类型")
    private String contentType;
}
@Mapper
public interface DownloadMapper {
    @ResultType(DownloadVo.class)
    @Select("select id, title, content_type contentType " +
            " from dev_download with(nolock) ")
    void getAllDownloadVos(ResultHandler<DownloadVo> resultHandler);
}

service

@Component
public class CsvService {
    @Autowired
    private DownloadMapper downloadMapper;

    private void setHeader(HttpServletResponse response, String filename) throws Exception {
        response.setContentType("application/csv;charset=gb18030");
        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename + ".csv", "UTF-8"));
    }

    /************************* 使用mybatis的ResultHandler进行下载 *****************************/
    public void utilResultHandlerToCsv(HttpServletResponse response) throws Exception {
        // header
        response.setContentType("application/csv;charset=gb18030");
        response.setHeader("Content-Disposition", "attachment; filename="
                + URLEncoder.encode("utilResultHandlerToCsv" + ".csv", "UTF-8"));
        // csvWriter
        CsvWriterSettings settings = new CsvWriterSettings();
        settings.setRowWriterProcessor(new BeanWriterProcessor<>(DownloadVo.class));
        CsvWriter csvWriter = new CsvWriter(response.getWriter(), settings);
        // header
        csvWriter.writeHeaders();
        // data
        DownloadResultHandler handler = new DownloadResultHandler(csvWriter);
        downloadMapper.getAllDownloadVos(handler);

        // 刷新缓存
        csvWriter.flush();
    }
    public static class DownloadResultHandler implements ResultHandler<DownloadVo> {
        private CsvWriter writer;

        public DownloadResultHandler(CsvWriter writer) {
            this.writer = writer;
        }

        @Override
        public void handleResult(ResultContext<? extends DownloadVo> resultContext) {
            writer.processRecord(resultContext.getResultObject());
        }
    }
}

controller

@RestController
public class CsvController {
    @Autowired
    private CsvService csvService;
    @GetMapping("/csv/download1")
    public void download1(HttpServletResponse response) throws Exception {
        long time = System.currentTimeMillis();
        csvService.utilResultHandlerToCsv(response);
        System.out.println("utilResultHandlerToCsv time = " + (System.currentTimeMillis() - time));
    }
}

试验

访问http://localhost:8080/csv/download1,可正常下载csv

其它

可整理为一个工具类

public class CsvUtils {

    public static void writeToResponse(HttpServletResponse response, String filename, List data) throws IOException {
        if (CollectionUtils.isEmpty(data)) {
            return;
        }
        // header
        response.setContentType("application/csv;charset=gb18030");
        response.setHeader("Content-Disposition", "attachment; filename="
                + URLEncoder.encode(filename + ".csv", "UTF-8"));
        // csvWriter
        CsvWriterSettings settings = new CsvWriterSettings();
        settings.setRowWriterProcessor(new BeanWriterProcessor<>(data.get(0).getClass()));
        CsvWriter csvWriter = new CsvWriter(response.getWriter(), settings);
        // header
        csvWriter.writeHeaders();
        // data
        csvWriter.writeRecords(data);
        csvWriter.flush();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值