SpringBoot将SQL查询出的数据导出CSV文件

导入依赖

 <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-collections4</artifactId>
     <version>4.4</version>
 </dependency>

工具类

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.collections4.CollectionUtils;
 ​
 public class CsvExportUtil {
 ​
     /**
      * CSV文件列分隔符
      */
     private static final String CSV_COLUMN_SEPARATOR = ",";
 ​
     /**
      * CSV文件行分隔符
      */
     private static final String CSV_ROW_SEPARATOR = "\r\n";
 ​
     /**
      * @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 response)
             throws UnsupportedEncodingException {
         // 设置文件后缀
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
         String fn = fileName + sdf.format(new Date()) + ".csv";
         // 读取字符编码
         String utf = "UTF-8";
 ​
         // 设置响应
         response.setContentType("application/ms-txt.numberformat:@");
         response.setCharacterEncoding(utf);
         response.setHeader("Pragma", "public");
         response.setHeader("Cache-Control", "max-age=30");
         response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fn, utf));
     }
 }

在Mybatis查询出List<Map<String,Object>>,只需要返回值类型为Map即可

    <select id="getBooks" resultType="map">
        select auth_name,
        book_create_time,
        book_name,
               book_id,
        book_price,
        publish_name,
        classify_name,
        book_count,
        book_sell
        from book_auth_publish
        where book_is_delete = 0;
    </select>

测试

 import com.lixianhe.dao.BookMapper;
 import com.lixianhe.utils.CsvExportUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 ​
 import javax.servlet.http.HttpServletResponse;
 import java.io.OutputStream;
 import java.util.List;
 import java.util.Map;
 ​
 @RestController
 @Slf4j
 public class TestController {
 ​
     @Autowired
     private BookMapper bookMapper;
 ​
     @GetMapping("/c/virtualMachine/export")
     public void export(HttpServletResponse response) {
         // 返回的数据必须是List<Map<String,Object>
         List<Map<String, Object>> books = bookMapper.getBooks();
         /*
          * 构造导出数据结构
          */
         String titles = "书编号,书名,出版社,价格,作者,分类,库存,创建时间,销量"; // 设置表头
         // 设置每列字段
         String keys = "book_id,book_name,publish_name,book_price,auth_name,classify_name,book_count,book_create,book_sell";
         // 设置导出文件前缀
         String fName = "bookstore_";
         // 文件导出
         try {
             OutputStream os = response.getOutputStream();
             CsvExportUtil.responseSetProperties(fName, response);
             CsvExportUtil.doExport(books, titles, keys, os);
             os.close();
 ​
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 }

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙域、白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值