springboot 通过 poi 导出 excel

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

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 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2040 回帖
  • 京东

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

    14 引用 • 102 回帖 • 311 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1127 回帖 • 110 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖 • 2 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 615 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 679 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 239 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 246 回帖
  • 架构

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

    142 引用 • 442 回帖 • 4 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 1 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 90 关注
  • 思源笔记

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

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

    26242 引用 • 109059 回帖
  • Flutter

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

    39 引用 • 92 回帖 • 10 关注
  • RESTful

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

    30 引用 • 114 回帖 • 5 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 9 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 564 关注
  • 游戏

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

    187 引用 • 831 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 407 关注
  • 安全

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

    199 引用 • 818 回帖 • 1 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 535 关注
  • 服务器

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

    125 引用 • 585 回帖