springboot 通过 poi 导出 excel

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

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 回帖 • 1 关注
  • Spring

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

    946 引用 • 1460 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 3 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 571 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 297 关注
  • JRebel

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

    26 引用 • 78 回帖 • 679 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 665 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 516 回帖
  • Openfire

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

    6 引用 • 7 回帖 • 101 关注
  • 旅游

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

    93 引用 • 901 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 163 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 543 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 639 关注
  • webpack

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

    41 引用 • 130 回帖 • 250 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 675 回帖
  • 区块链

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

    92 引用 • 752 回帖 • 2 关注
  • Pipe

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

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

    132 引用 • 1115 回帖 • 119 关注
  • IPFS

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

    21 引用 • 245 回帖 • 230 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • OnlyOffice
    4 引用 • 22 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • OpenCV
    15 引用 • 36 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 58 关注
  • CloudFoundry

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

    5 引用 • 18 回帖 • 176 关注
  • Java

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

    3195 引用 • 8215 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖