Springboot Java使用HuTool导出Excel文件100W条数据只需16秒

4 篇文章 0 订阅

1、导入依赖

  <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.5</version>
  </dependency>

  <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
  </dependency>

2、工具类 参考 (Hutools实现excel导出 - 简书)

本人使用中发现有一个bug 具体请看代码为59行 (已经修复)

package com.qr.management.util;

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

/**
 * @author lianJiaYu
 * @date 2021/7/30 11:50
 */
public class ExcelByHuTools {

    //private static final Logger logger = LoggerFactory.getLogger(ExcelByHuTools.class);

    /**
     * 导出文件
     *
     * @param request
     * @param response
     * @param fileName  文件名
     * @param sheetName
     * @param headers   表头
     * @param data      数据
     * @param <T>
     */
    public static <T> void exportExcelByHuTools(HttpServletRequest request,
                                                HttpServletResponse response,
                                                String fileName,
                                                String sheetName,
                                                Map<String, String> headers,
                                                List<T> data) {
        long startTime = System.currentTimeMillis();
        //通过工具类创建writer
        try {
            //创建writer
            //ExcelWriter writer = ExcelUtil.getWriter();

            //数据量特别大时,使用BigExcelWriter对象,可以避免内存溢出
            ExcelWriter writer = ExcelUtil.getBigWriter();

            //设置sheet的名称
            writer.renameSheet(sheetName);
            //设置head的名称, 此时的顺寻就是导出的顺序, key就是RecordInfoDetailsDTO的属性名称, value就是别名
            headers.entrySet().forEach(entry -> {
                System.out.println(entry.getKey());
                System.out.println(entry.getValue());
                //这个添加顺序和导出顺序相同
                writer.addHeaderAlias(entry.getKey(), entry.getValue());
            });
            //设置宽度 0代表第一列 1代表第二列 以此类推
            writer.setColumnWidth(1,30);
            writer.setColumnWidth(4,30);
            /**
             * 设置是否只保留别名中的字段值,如果为true,则不设置alias的字段将不被输出,false表示原样输出
             * 这一行很重要 如果不设置只要实体中的属性值 大于 “自定义标题别名” 在Excel中就会多出一列ID字段
             */
            writer.setOnlyAlias(true);
            writer.write(data, true);
            response.reset();
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
            //中文名称需要特殊处理
            writer.flush(response.getOutputStream());
            writer.close();
            long endTime = System.currentTimeMillis();
            System.out.println("hutool 写入记录耗时 " + (endTime - startTime) / 1000 + "秒");
        } catch (Exception e) {
            //如果导出异常,则生成一个空的文件
            e.printStackTrace();
        }

    }
}

注释掉//writer.setOnlyAlias(true);的效果 会莫名其妙的多一行ID字段

3、数据库表和数据创建

CREATE TABLE `excel` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `gender` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3;

/*Data for the table `excel` */

insert  into `excel`(`id`,`name`,`age`,`gender`) values (1,'小米',10,'女'),(2,'小兰',12,'女'),(3,'小刚',13,'男');

4、sql编写

   <select id="queryExcel" resultType="com.xyz.rescuetycoon.shopping.entity.Excel" >
        SELECT * FROM excel
    </select>

5、实体类创建

package com.xyz.rescuetycoon.shopping.entity;

import lombok.Data;

@Data
public class Excel {

  private long id;
  private String name;
  private long age;
  private String gender;

}

6、Controller代码编写和调用

    @RequestMapping("exportExcel")
    public void exportExcel(HttpServletRequest request,
                            HttpServletResponse response) {
        Map<String, String> headers = new LinkedHashMap<>();
        headers.put("id", "id");
        headers.put("name", "姓名");
        headers.put("age", "年龄");
        headers.put("gender", "性别");
        List<Excel> excelList = menuMapper.queryExcel();
        ExcelByHuTools.exportExcelByHuTools(request, response, "人员信息表", "sheet1", headers, excelList);
    }

7、测试导出

测试四个字段100W条数据导出只需16秒

快速插入100W条数据可以参考以下文章

Mysql8.0使用存储过程 快速插入100W条数据_EvenBoy的博客-CSDN博客

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot使用EasyExcel导出动态数据Excel文件的代码如下: 1. 首先,我们要导入`easyexcel`的依赖。在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.3.0</version> </dependency> ``` 2. 创建一个Excel工具类,用于导出Excel文件。假设我们已经有一个名为`ExcelUtil`的工具类。 ```java import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.util.List; @Component public class ExcelUtil { public void export(HttpServletResponse response, List<Object> data) throws IOException { // 设置响应头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("导出文件", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 导出Excel文件 EasyExcel.write(response.getOutputStream(), Object.class).sheet("Sheet1").doWrite(data); } public void exportTemplate(HttpServletResponse response) throws IOException { // 设置响应头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("模板文件", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 导出模板文件 InputStream inputStream = getClass().getClassLoader().getResourceAsStream("template.xlsx"); EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).sheet().doWrite(null); } } ``` 3. 创建一个Controller类,用于处理导出Excel的请求。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/excel") public class ExcelController { @Autowired private ExcelUtil excelUtil; @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { // 模拟动态数据,实际场景中可以根据业务求获取数据 List<Object> data = new ArrayList<>(); data.add("数据1"); data.add("数据2"); data.add("数据3"); // 导出Excel文件 excelUtil.export(response, data); } @GetMapping("/template") public void exportTemplate(HttpServletResponse response) throws IOException { // 导出Excel模板文件 excelUtil.exportTemplate(response); } } ``` 以上代码演示了使用Spring Boot和EasyExcel导出动态数据Excel文件的过程。在Controller中,我们可以根据实际业务求获取数据,并调用`ExcelUtil`中的方法实现导出操作。同时,我们也提供了导出Excel模板文件的方法,以方便用户进行数据录入。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值