springboot 通过 poi 导出 excel

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

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
    30 引用 • 28 回帖
  • Spring

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

    941 引用 • 1458 回帖 • 151 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 131 关注
  • 京东

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

    14 引用 • 102 回帖 • 405 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 42 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    169 引用 • 799 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 7 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 89 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖 • 1 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 228 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 439 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18715 引用 • 69876 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 175 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • 笔记

    好记性不如烂笔头。

    304 引用 • 777 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    275 引用 • 682 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖 • 1 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 741 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 697 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖