springboot 通过 poi 导出 excel

本贴最后更新于 2076 天前,其中的信息可能已经沧海桑田

Maven 引入依赖


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

导出 excel

导出 excel 比较重要的 api 有以下几个,其他的并无难点

  • 创建一个 excel 文件工作薄;(HSSFWorkbook workbook = new HSSFWorkbook())
  • 创建一张表;HSSFSheet sheet = workbook.createSheet("统计表")
  • 创建一行;HSSFRow row = sheet.createRow(0)
  • 填充一列数据; row.createCell(0).setCellValue("数据")
  • 设置一个单元格样式;cell.setCellStyle(style)

注意!!! 如果文件没有提示下载 则不代表生成 EXCEL 失败 文件会在项目 根目录 中自动生成!!

    public HSSFWorkbook createExcel(SearchParams params) {
        // 第一步创建workbook
        HSSFWorkbook wb = new HSSFWorkbook();

        // 第二步创建sheet
        HSSFSheet sheet = wb.createSheet("列表");
        // 设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
        sheet.setColumnWidth(0, 256 * 20);
        sheet.setColumnWidth(1, 256 * 20);
        sheet.setColumnWidth(2, 256 * 20);
        sheet.setColumnWidth(3, 256 * 10);
        sheet.setColumnWidth(4, 256 * 20);
        sheet.setColumnWidth(5, 256 * 20);

        // 第三步创建行row:添加表头0行
        HSSFRow row = sheet.createRow(0);
        HSSFCellStyle style = wb.createCellStyle();

        // 设置为居中加粗
        // HSSFCellStyle style = workbook.createCellStyle();
        // HSSFFont font = workbook.createFont();
        // font.setBold(true);
        // style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // style.setFont(font);

        // 第四步创建单元格
        int cellColumn = 0;
        // 第一个单元格
        HSSFCell cell = row.createCell(cellColumn++);
        cell.setCellValue("ID");
        cell.setCellStyle(style);

        // 第二个单元格
        cell = row.createCell(cellColumn++);
        cell.setCellValue("用户");
        cell.setCellStyle(style);

        // 第三个单元格
        cell = row.createCell(cellColumn++);
        cell.setCellValue("时间");
        cell.setCellStyle(style);

        // 第四个单元格
        cell = row.createCell(cellColumn++);
        cell.setCellValue("符号");
        cell.setCellStyle(style);

        // 第五个单元格
        cell = row.createCell(cellColumn++);
        cell.setCellValue("数量");
        cell.setCellStyle(style);

        AtomicInteger index = new AtomicInteger();
        // 自增跳过表头
        index.incrementAndGet();
        fillData(params, index, sheet);

        return wb;
    }

     private void fillData(SearchParams params, AtomicInteger index, HSSFSheet sheet) {
        // 自定义分页查找数据
        PageInfo<SearchListForm> pageInfo = this.service.getDataBySearch(params);
        List<SearchListForm> searchList = pageInfo.getList(); 
        Optional.ofNullable(searchList).ifPresent(list -> list.stream().forEach(v -> {
            HSSFRow row = sheet.createRow(index.getAndIncrement());

            // 设置日期格式
            // HSSFCellStyle style = workbook.createCellStyle();
            // style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

            // HSSFCell cell = row.createCell(3);
            // cell.setCellValue(user.getCreate_time());
            // cell.setCellStyle(style);

            int cellColumn = 0;
            row.createCell(cellColumn++).setCellValue(v.getId());
            row.createCell(cellColumn++).setCellValue(v.getUsername());
            row.createCell(cellColumn++).setCellValue(DateFormatUtils.format(v.getCreatetime(), "MM/dd/yyyy HH:mm:ss"));
            row.createCell(cellColumn++).setCellValue(v.getSymbol());
            row.createCell(cellColumn++).setCellValue(v.getQuantity().setScale(8, RoundingMode.HALF_DOWN).stripTrailingZeros().toPlainString());
        }));

        // 循环获取数据
        if (pageInfo.isHasNextPage()) {
            params.setPage(pageInfo.getNextPage());
            fillData(params, index, sheet);
        }
    }


@GetMapping(value = "downloadExcel")
    public void (
            @RequestBody @ApiParam(required = false, name = "SearchParams", value = "参数") SearchParams params,
            HttpServletResponse response
    ) {
        params.setPage(1);
        params.setRows(1000);
        String fileName = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "_ExcelData" + ".xls";
        response.setContentType("application/octet-stream");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        OutputStream outputStream = null;
        HSSFWorkbook wb = null;
        try {
            outputStream = response.getOutputStream();
            // 刷新缓冲
            response.flushBuffer();
            wb = createExcel(params);
            wb.write(outputStream);
        } catch (IOException e) {
            logger.info("IOException {}", e);
        } finally {
            IOUtils.closeQuietly(wb);
            IOUtils.closeQuietly(outputStream);
        }
    }

    // 生成excel文件
    protected void buildExcelFile(String filename,HSSFWorkbook workbook) throws Exception{
        FileOutputStream fos = new FileOutputStream(filename);
        workbook.write(fos);
        fos.flush();
        fos.close();
    }

    // 浏览器下载excel
    protected void buildExcelDocument(String filename,HSSFWorkbook workbook,HttpServletResponse response) throws Exception{
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename, "utf-8"));
        OutputStream outputStream = response.getOutputStream();
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
    }

通过 swagger 直接下载可能会出现乱码

  • Excel
    31 引用 • 28 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    949 引用 • 1460 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • AWS
    11 引用 • 28 回帖 • 7 关注
  • OpenCV
    15 引用 • 36 回帖 • 6 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 749 回帖
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 7 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    96 引用 • 901 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    290 引用 • 4494 回帖 • 654 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    499 引用 • 1395 回帖 • 246 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 706 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 256 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 550 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    182 引用 • 408 回帖 • 489 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 391 关注
  • V2Ray
    1 引用 • 15 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 4 关注
  • OneNote
    1 引用 • 3 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 336 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 248 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    412 引用 • 3588 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 183 关注
  • 996
    13 引用 • 200 回帖 • 8 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 316 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 13 关注