导出文件:使用Hutool导出数据为Excel文件

背景

日常工作中,曾遇到过导出数据为 Excel 的需求,这里做个简单总结。

相对于导出文件为 PDF 或者 Word ,导出 Excel 相对更常用。

在实际中,遇到有的项目中使用前端插件导出 Excel 的方式,当数据量比较大时,对客户端要求比较高,导出很慢,影响用户体验。另外一种是今天这里介绍的后端直接查询、封装、导出为 Excel 文件。

涉及的技术有: SpringBootMyBatishutool ,使用 hutool 工具导出数据为 Excel

依赖

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

<!--Export as Excel-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.1</version>
</dependency>

核心导出接口

/**
 * @Author Heartsuit
 * @Date 2021-08-09
 */
@RestController
@RequestMapping("employee")
public class EmployeeController {
    private final EmployeeService employeeService;

    public EmployeeController(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    /**
     * 导出全量数据,实际一般为条件检索后导出
     * @param response
     * @throws IOException
     */
    @GetMapping("export-xls")
    public void exportExcel(HttpServletResponse response) throws IOException, ClassNotFoundException {
        ExcelWriter writer = ExcelUtil.getWriter();
        List<Employee> employees = employeeService.findAll();

        List<Map<String, Object>> rows = employees.stream().map(item -> {
            Map<String, Object> maps = new HashMap<>();
            maps.put("id", item.getId().toString());
            maps.put("name", item.getName());
            maps.put("age", item.getAge());
            maps.put("phone", item.getPhone());
            maps.put("createTime", item.getCreateTime().toString());
            return maps;
        }).collect(Collectors.toList());

        // Title
        int columns = Class.forName("com.heartsuit.springbootmybatis.oa.entity.Employee").getDeclaredFields().length;
        writer.merge(columns - 1, "员工信息");

        // Header
        writer.addHeaderAlias("id", "ID");
        writer.addHeaderAlias("name", "姓名");
        writer.addHeaderAlias("age", "年龄");
        writer.addHeaderAlias("phone", "电话");
        writer.addHeaderAlias("createTime", "时间");

        // Body
        writer.setColumnWidth(0, 30);
        writer.setColumnWidth(1, 30);
        writer.setColumnWidth(2, 30);
        writer.setColumnWidth(3, 30);
        writer.setColumnWidth(4, 30);
        writer.write(rows, true);

        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("员工信息表-" + DateUtil.today() + ".xls", "utf-8"));

        ServletOutputStream out = response.getOutputStream();
        writer.flush(out, true);
        writer.close();
        IoUtil.close(out);
    }
}

测试接口:全量导出

GET http://localhost:8000/employee/export-xls

Note: 这里使用 GET 方式,方便测试,实际建议 POST

测试1万条数据导出效率

  • 批量向数据表插入数万条数据,再次测试导出效率;
  • 其实,导出时间取决于查效率以及查出的总数据量(涉及写入Excel以及Excel传输两部分时间);

批量写入数据接口:

@Test
void insertBatch() {
    SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();

    //可以执行批量操作的sqlSession, try...with...
    try (SqlSession openSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
        long start = System.currentTimeMillis();
        EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
        for (int i = 0; i < 10000; i++) {
            Employee employee = new Employee();
            employee.setName(UUID.randomUUID().toString().substring(0, 6));
            employee.setAge(new Random().nextInt(100));
            employee.setPhone(MobileNumber.generate(0));
            mapper.save(employee);
        }
        openSession.commit();
        long end = System.currentTimeMillis();
        System.out.println("执行时长" + (end - start));
    }
}

从数万条记录中导出1万条数据,秒级。

导出效果

2022-01-03-ExportExcel.jpg

Source Code

完整源码见 GitHubhttps://github.com/heartsuit/demo-spring-boot/tree/master/springboot-mybatis


If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
你可以使用Hutool工具库来导出Excel文件。下面是一个简单的示例代码: ```java import cn.hutool.core.date.DateUtil; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import java.util.ArrayList; import java.util.Date; import java.util.List; public class ExcelExportExample { public static void main(String[] args) { // 创建ExcelWriter对象 ExcelWriter writer = ExcelUtil.getWriter("D:/example.xlsx"); // 设置表头 writer.addHeaderAlias("id", "ID"); writer.addHeaderAlias("name", "姓名"); writer.addHeaderAlias("age", "年龄"); writer.addHeaderAlias("birthday", "生日"); // 设置内容 List<Person> personList = createTestData(); writer.write(personList, true); // 关闭writer,完成写入 writer.close(); } // 创建测试数据 private static List<Person> createTestData() { List<Person> personList = new ArrayList<>(); personList.add(new Person(1, "张三", 20, DateUtil.parse("2000-01-01"))); personList.add(new Person(2, "李四", 22, DateUtil.parse("1998-05-10"))); personList.add(new Person(3, "王五", 25, DateUtil.parse("1995-12-20"))); return personList; } // 定义Person类 static class Person { private Integer id; private String name; private Integer age; private Date birthday; // 省略构造方法、getter和setter } } ``` 上述代码通过HutoolExcelWriter类来创建一个ExcelWriter对象,并指定要导出文件路径。然后,使用addHeaderAlias方法设置表头别名,以及write方法将数据写入Excel文件中。最后,调用close方法关闭writer对象,完成写入操作。 请注意,需要先在项目中引入Hutool的依赖,例如: ```xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.3.10</version> </dependency> ``` 这样就可以使用Hutool导出Excel文件了。希望对你有所帮助!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Heartsuit

别说什么鼓励,这就是互联网乞讨

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

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

打赏作者

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

抵扣说明:

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

余额充值