• 【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间


    背景

    本文章可以将数据库中多个表数据导出到一个excel文件中,每个数据库表数据为一个sheet工作空间页,为了防止oom问题,文章导出采用了分页形式导出数据。

    如需转载,请附上本文章的链接,谢谢!

    作者:曹震

    目录

    一、excel导入篇

    二、依赖

    三、yml配置文件

    四、代码

    1.controller层

    2.service层

    3.导出效果


    一、excel导入篇

    【EasyExcel】第一篇:动态导入excel,生成对应数据库表_郭老师的小迷弟雅思莫了的博客-CSDN博客https://caozhen.blog.csdn.net/article/details/127785588?spm=1001.2014.3001.5502

    二、依赖

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>easyexcelartifactId>
    4. <version>3.0.5version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.github.pagehelpergroupId>
    8. <artifactId>pagehelper-spring-boot-starterartifactId>
    9. <version>1.4.5version>
    10. dependency>
    11. <dependency>
    12. <groupId>com.alibabagroupId>
    13. <artifactId>fastjsonartifactId>
    14. <version>1.2.70version>
    15. dependency>

    三、yml配置文件

    1. #mybatis 分页插件
    2. pagehelper:
    3. helperDialect: mysql
    4. reasonable: true
    5. supportMethodsArguments: true
    6. params: count=countSql

    四、代码

    1.controller层

    1. /**
    2. *

    3. * 前端控制器
    4. *

    5. *
    6. * @author 曹震
    7. * @since 2022-10-24
    8. */
    9. @Api(tags = "数据源集合")
    10. @RestController
    11. @RequestMapping("/hvit/dataSet/")
    12. public class SysDataDirectoryController {
    13. @Autowired
    14. private SysDataDirectoryDataService sysDataDirectoryDataService;
    15. @ApiOperation("导出文件")
    16. @GetMapping("/exportExcel")
    17. public void exportExcel(String id, HttpServletResponse response) {
    18. ResponseEntity.ok(sysDataDirectoryDataService.exportExcel(id, response));
    19. }
    20. }

    2.service层

    1. /***
    2. * 导出excel结果
    3. * 数据量适中(100W以内): 一个SHEET分批查询导出
    4. * @param id
    5. * @return
    6. */
    7. public R exportExcel(String id, HttpServletResponse response) {
    8. SysDataDirectory sysDataDirectory = sysDataDirectoryService.getById(id);
    9. if (sysDataDirectory == null) {
    10. return R.error("数据源不存在!");
    11. }
    12. String fileName = StringUtils.isNotEmpty(sysDataDirectory.getDataName()) ? sysDataDirectory.getDataName() : "新的文件";
    13. if (sysDataDirectory.getParentId().equals(Constant.PARENT_ID)) {
    14. return R.error("请选择数据源或数据集导出!");
    15. }
    16. List list = new ArrayList<>();
    17. List ids = getTreeNodesIds(id, list);
    18. //如果是最后一级目录,则将拿到的id数据填充进集合
    19. if (CollectionUtils.isEmpty(ids)) {
    20. ids.add(id);
    21. }
    22. QueryWrapper queryWrapper = new QueryWrapper<>();
    23. queryWrapper.lambda().in(SysDataDirectory::getId, ids);
    24. queryWrapper.lambda().orderByAsc(SysDataDirectory::getSort);
    25. List directoryList = sysDataDirectoryService.list(queryWrapper);
    26. exportSystemExcel(fileName, directoryList, response);
    27. return R.ok("导出成功!");
    28. }

    上面这一块业务代码比较多,直接看exportSystemExcel(fileName, directoryList, response);就行。

    下面代码是导出文件的代码!

    1. /***
    2. * 导出excel生成xlsx文件
    3. * @param directoryList
    4. * @param response
    5. */
    6. public void exportSystemExcel(String fileName, List directoryList, HttpServletResponse response) {
    7. OutputStream outputStream = null;
    8. try {
    9. long startTime = System.currentTimeMillis();
    10. log.info("导出开始时间:{}", startTime);
    11. outputStream = response.getOutputStream();
    12. WriteWorkbook writeWorkbook = new WriteWorkbook();
    13. writeWorkbook.setOutputStream(outputStream);
    14. writeWorkbook.setExcelType(ExcelTypeEnum.XLSX);
    15. ExcelWriter writer = new ExcelWriter(writeWorkbook);
    16. // 设置EXCEL名称
    17. String newFileName = new String((fileName).getBytes(), "UTF-8");
    18. //多条数据代表有多个sheet空间
    19. if (!CollectionUtils.isEmpty(directoryList)) {
    20. for (int i = 0; i < directoryList.size(); i++) {
    21. // 设置SHEET名称
    22. WriteSheet sheet = new WriteSheet();
    23. sheet.setSheetNo(i);
    24. sheet.setSheetName(directoryList.get(i).getDataName());
    25. // 设置表头标题
    26. WriteTable table = new WriteTable();
    27. List> titles = new ArrayList<>();
    28. List columns = sysDataDirectoryMapper.getColumnName(directoryList.get(i).getTableName());
    29. if (!CollectionUtils.isEmpty(columns)) {
    30. columns.forEach(x -> {
    31. titles.add(Collections.singletonList(x));
    32. });
    33. }
    34. table.setHead(titles);
    35. // 查询总数并 【封装相关变量 这块直接拷贝就行 不要改动】
    36. Integer totalRowCount = sysDataDirectoryMapper.getTableDataCount(directoryList.get(i).getTableName());
    37. Integer pageSize = Constant.PER_WRITE_ROW_COUNT;
    38. Integer writeCount = totalRowCount % pageSize == 0 ? (totalRowCount / pageSize) : (totalRowCount / pageSize + 1);
    39. for (int k = 0; k < writeCount; k++) {
    40. List> dataList = new ArrayList<>();
    41. PageHelper.startPage(k + 1, pageSize);
    42. List> tableData = sysDataDirectoryMapper.getTableData(directoryList.get(i).getTableName());
    43. if (!CollectionUtils.isEmpty(tableData)) {
    44. tableData.forEach(x -> {
    45. List mapData = new ArrayList<>();
    46. Set set = x.keySet();
    47. Iterator iterator = set.iterator();
    48. while (iterator.hasNext()) {
    49. Object next = iterator.next();
    50. mapData.add(x.get(next));
    51. }
    52. dataList.add(mapData);
    53. });
    54. }
    55. writer.write(dataList, sheet, table);
    56. }
    57. }
    58. }
    59. //下载Excel
    60. response.setHeader("Content-Disposition", "attachment;filename=" + new String(newFileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1") + ".xlsx");
    61. response.setContentType("application/vnd.ms-excel");
    62. response.setCharacterEncoding("utf-8");
    63. writer.finish();
    64. outputStream.flush();
    65. // 导出时间结束
    66. long endTime = System.currentTimeMillis();
    67. log.info("导出结束时间:{}", endTime + "ms");
    68. log.info("导出所用时间:{}", (endTime - startTime) / 1000 + "秒");
    69. } catch (Exception ex) {
    70. log.error("导出文件失败:{}", ex.getMessage());
    71. } finally {
    72. if (outputStream != null) {
    73. try {
    74. outputStream.close();
    75. } catch (Exception e) {
    76. e.printStackTrace();
    77. }
    78. }
    79. }
    80. }

    Integer pageSize = Constant.PER_WRITE_ROW_COUNT;这里是常量。可以自行建立 Constant类

    1. /**
    2. * 每次向EXCEL写入的记录数(查询每页数据大小) 20W
    3. */
    4. public static final Integer PER_WRITE_ROW_COUNT = 200000;

    好了到这里基本结束了

    3.导出效果

     有什么问题可以留言,看到会回复!

  • 相关阅读:
    【Hadoop】-Apache Hive使用语法与概念原理[15]
    有方N58 HTTP POST 请求连接 TDengine
    Linux 用户管理工具介绍
    Servlet快速筑基
    离散事件仿真原理DES
    力扣每日一题2022-09-07简单题:重新排列单词间的空格
    【MATLAB】 小波分解信号分解+FFT傅里叶频谱变换组合算法
    MySQL常见面试题
    Camera1 源码解析系列(二)—— Camera1 Open() 流程解析
    金仓数据库KingbaseES客户端应用参考手册--10. sys_config
  • 原文地址:https://blog.csdn.net/qq_23126581/article/details/127961425