当前位置: 首页 > news >正文

Apache POI(使用Java读写Excel表格数据)

1.Apache POI简介

Apache POI是一个开源的Java库,用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能,包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API,使得Java开发者能够轻松地在Java应用程序中处理Office文件。

Apache POI的主要特点包括:

  1. 功能丰富:Apache POI提供了广泛的操作,如创建、修改、读取和写入Office文件。

  2. 跨平台:由于它是用Java编写的,因此可以在任何支持Java的平台上运行,包括Windows、Linux和macOS。

  3. 支持多种文件格式:Apache POI支持旧的Office文件格式(如.xls、.doc)和新的Office Open XML格式(如.xlsx、.docx)。

  4. 社区支持:作为一个开源项目,Apache POI有一个活跃的社区,不断更新和改进库。

  5. 易于集成:Apache POI可以轻松地集成到Java应用程序中,无论是桌面应用程序还是Web应用程序。

  6. 灵活的API:Apache POI提供了多种API,以适应不同的操作需求,从简单的文本操作到复杂的样式和格式处理。

Apache POI包含几个主要的组件,每个组件负责处理不同类型的Office文件:

  • POIFS(Poor Obfuscation Implementation File System):用于处理Microsoft Office旧版本的文件格式,如HSSF(Horrible SpreadSheet Format)和HWPF(Horrible Word Processor Format)。
  • XSSF(XML SpreadSheet Format):用于处理Excel 2007及以后版本的XML文件格式(.xlsx)。
  • HSSF(Horrible SpreadSheet Format):用于处理Excel 97-2003版本的文件格式(.xls)。
  • HWPF(Horrible Word Processor Format):用于处理Word 97-2003版本的文件格式(.doc)。
  • XWPF(XML Word Processor Format):用于处理Word 2007及以后版本的XML文件格式(.docx)。
  • HSLF(Horrible Slide Layout Format)和XSLF(XML Slide Layout Format):用于处理PowerPoint演示文稿。
  • HDGF(Horrible Diagram Graphics Format)和XDGF(XML Diagram Graphics Format):用于处理Visio文件。
  • HSMF(Horrible Sticky Note Format):用于处理Outlook电子邮件文件。

Apache POI是Java开发者处理Office文件的首选库,因为它提供了强大的功能和灵活性,同时还得到了广泛的应用和社区支持。

2.引入依赖: 

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

3. 读写Excel表格 入门示例

3.1 写Excel表格:(如果不存在就创建新的Excel表格,如果已经存在则覆盖Excel表格的内容)

代码:

void write() throws IOException {// 创建一个新的Excel工作簿对象XSSFWorkbook excel = new XSSFWorkbook();// 在工作簿中创建一个名为"info"的工作表XSSFSheet sheet = excel.createSheet("info");// 创建第一行(表头)XSSFRow row = sheet.createRow(0);// 在第一行创建单元格并设置内容为"姓名"row.createCell(0).setCellValue("姓名");// 在第一行创建单元格并设置内容为"年龄"row.createCell(1).setCellValue("年龄");// 在第一行创建单元格并设置内容为"班级"row.createCell(2).setCellValue("班级");// 创建第二行(数据)row = sheet.createRow(1);// 在第二行创建单元格并设置内容为"张三"row.createCell(0).setCellValue("张三");// 在第二行创建单元格并设置内容为"17"row.createCell(1).setCellValue("17");// 在第二行创建单元格并设置内容为"1班"row.createCell(2).setCellValue("1班");// 创建第三行(数据)row = sheet.createRow(2);// 在第三行创建单元格并设置内容为"李四"row.createCell(0).setCellValue("李四");// 在第三行创建单元格并设置内容为"18"row.createCell(1).setCellValue("18");// 在第三行创建单元格并设置内容为"2班"row.createCell(2).setCellValue("2班");// 创建一个文件输出流,指定要写入的文件路径FileOutputStream out = new FileOutputStream(new File("D:\\info.xlsx"));// 将Excel工作簿写入文件输出流excel.write(out);// 关闭文件输出流out.close();// 关闭Excel工作簿,释放资源excel.close();
}

生成的Excel表格如下所示: 

 3.2 读Excel表格:

void read() throws IOException {// 创建一个文件输入流,用于读取指定路径的Excel文件FileInputStream in = new FileInputStream(new File("D:\\info.xlsx"));// 使用文件输入流创建一个XSSFWorkbook对象,该对象代表整个Excel工作簿XSSFWorkbook excel = new XSSFWorkbook(in);// 从工作簿中获取第一个工作表,索引为0XSSFSheet sheet = excel.getSheetAt(0);// 获取工作表中最后一行的编号int lastRowNum = sheet.getLastRowNum();// 遍历工作表中的所有行,包括空行和有数据的行for(int i = 0; i <= lastRowNum; i++) {// 获取指定编号的行XSSFRow row = sheet.getRow(i);// 如果行不为空,则读取第一个和第二个单元格的数据if(row != null) {// 获取第一个单元格的数据,并转换为字符串String cellValue1 = row.getCell(0).getStringCellValue();// 获取第二个单元格的数据,并转换为字符串String cellValue2 = row.getCell(1).getStringCellValue();// 打印单元格的数据System.out.println(cellValue1 + " " + cellValue2);}}// 关闭文件输入流,释放资源in.close();// 关闭XSSFWorkbook对象,释放资源excel.close();
}

4.导出Excel表格数据

4.1 设计Excel模版文件

4.2 根据该模版表格创建实体BusinessDataVO 

/*** 数据概览*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BusinessDataVO implements Serializable {private Double turnover;//营业额private Integer validOrderCount;//有效订单数private Double orderCompletionRate;//订单完成率private Double unitPrice;//平均客单价private Integer newUsers;//新增用户数}

4.3 Controller:

    @GetMapping("/export")@ApiOperation("导出运营数据报表")public void export(HttpServletResponse response){reportService.exportBusinessData(response);}

4.4 ServiceImple:(实现exportBusinessData方法)

    /*** 导出运营数据报表* @param response*/public void exportBusinessData(HttpServletResponse response) {//1. 查询数据库,获取营业数据---查询最近30天的运营数据LocalDate dateBegin = LocalDate.now().minusDays(30);LocalDate dateEnd = LocalDate.now().minusDays(1);//查询概览数据BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX));//2. 通过POI将数据写入到Excel文件中InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");try {//基于模板文件创建一个新的Excel文件XSSFWorkbook excel = new XSSFWorkbook(in);//获取表格文件的Sheet页XSSFSheet sheet = excel.getSheet("Sheet1");//填充数据--时间sheet.getRow(1).getCell(1).setCellValue("时间:" + dateBegin + "至" + dateEnd);//获得第4行XSSFRow row = sheet.getRow(3);row.getCell(2).setCellValue(businessDataVO.getTurnover());row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());row.getCell(6).setCellValue(businessDataVO.getNewUsers());//获得第5行row = sheet.getRow(4);row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());row.getCell(4).setCellValue(businessDataVO.getUnitPrice());//填充明细数据for (int i = 0; i < 30; i++) {LocalDate date = dateBegin.plusDays(i);//查询某一天的营业数据BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));//获得某一行row = sheet.getRow(7 + i);row.getCell(1).setCellValue(date.toString());row.getCell(2).setCellValue(businessData.getTurnover());row.getCell(3).setCellValue(businessData.getValidOrderCount());row.getCell(4).setCellValue(businessData.getOrderCompletionRate());row.getCell(5).setCellValue(businessData.getUnitPrice());row.getCell(6).setCellValue(businessData.getNewUsers());}// 设置内容类型为Excel文件response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");// 设置内容处置为附件,并指定文件名response.setHeader("Content-Disposition", "attachment; filename=\"business_data.xlsx\"");//3. 通过输出流将Excel文件下载到客户端浏览器ServletOutputStream out = response.getOutputStream();excel.write(out);//关闭资源out.close();excel.close();} catch (IOException e) {e.printStackTrace();}}

说明:其中 workspaceService.getBusinessData(LocalDateTime begin, LocalDateTime end)方法是获取时间段统计营业数据即根据时间段获取BusinessDataVO的相应数据

    /*** 根据时间段统计营业数据* @param begin* @param end* @return*/public BusinessDataVO getBusinessData(LocalDateTime begin, LocalDateTime end) {/*** 营业额:当日已完成订单的总金额* 有效订单:当日已完成订单的数量* 订单完成率:有效订单数 / 总订单数* 平均客单价:营业额 / 有效订单数* 新增用户:当日新增用户的数量*/Map map = new HashMap();map.put("begin",begin);map.put("end",end);//查询总订单数Integer totalOrderCount = orderMapper.countByMap(map);map.put("status", Orders.COMPLETED);//营业额Double turnover = orderMapper.sumByMap(map);turnover = turnover == null? 0.0 : turnover;//有效订单数Integer validOrderCount = orderMapper.countByMap(map);Double unitPrice = 0.0;Double orderCompletionRate = 0.0;if(totalOrderCount != 0 && validOrderCount != 0){//订单完成率orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;//平均客单价unitPrice = turnover / validOrderCount;}//新增用户数Integer newUsers = userMapper.countByMap(map);return BusinessDataVO.builder().turnover(turnover).validOrderCount(validOrderCount).orderCompletionRate(orderCompletionRate).unitPrice(unitPrice).newUsers(newUsers).build();}

相关文章:

Apache POI(使用Java读写Excel表格数据)

1.Apache POI简介 Apache POI是一个开源的Java库&#xff0c;用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能&#xff0c;包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API&#xff0c;使得Java开发者能够…...

golang中只用定义不用初始化的类型规律总结

在go语言的开发中&#xff0c;有很多的内置类型是我们只需要定义而不需要初始化的&#xff0c; 如上文中提到的bytes.Buffer&#xff0c; strings.Builder。 其实在go语言中官方给我们定义的很多的类型都只需要定义&#xff0c;不需要初始化。 他们都有2个共同的规律&#xff…...

数据库之PostgreSQL详解

一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议&#xff0c;这个协议基本和MIT开源协议一样&#xff0c;说人话&#xff0c;就是你可以对PostgreSQL进行一些封装&a…...

找出链表倒数第k个元素-链表题

LCR 140. 训练计划 II - 力扣&#xff08;LeetCode&#xff09; 快慢指针。快指针臂慢指针快cnt个元素到最后&#xff1b; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …...

ssm629基于SSM的二手交易平台设计与开发+jsp【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…...

【Unity】资源管理与热更 YooAsset+HybridCLR

1 前言 Unity资源管理与热更新该用什么方法&#xff1f;当然是YooAssetHybridCLR了&#xff0c;YooAsset负责资源管理与热更&#xff0c;HybridCLR负责支持代码热更。 但这里我就不自己讲了&#xff0c;我会提供相关学习链接&#xff08;前人栽树我躺平&#xff09;。 2 学习链…...

PDF批量加水印 与 去除水印实践

本文主要目标是尝试去除水印&#xff0c;但是为了准备测试数据&#xff0c;我们需要先准备好有水印的pdf测试文件。 注意&#xff1a;本文的去水印只针对文字悬浮图片悬浮两种特殊情况&#xff0c;即使是这两种情况也不代表一定都可以去除水印。 文章目录 批量添加透明图片水印…...

【MySQL】服务器配置和管理

本文使用的MySQL版本是8.0 MySQL服务器介绍 MySQL服务器通常说的是mysqld程序。 mysqld 是 MySQL 数据库服务器的核心程序&#xff0c;负责处理客户端的请求、管理数据库和执行数据库操作。管理员可以通过配置文件和各种工具来管理和监控 mysqld 服务器的运行 官方文档&…...

限流定义、算法、实施方案

限流定义 1、 时间 &#xff0c; 基于某段时间或某个时间点&#xff0c;即&#xff1a;时间窗口 2、资源&#xff1a; 对可用资源进行限制&#xff1a; QPS/连接数/传输速率/黑白名单等 分布式环境下&#xff0c;主流限流方案&#xff1a; 网关层限流&#xff1a;流量入口Ngi…...

[312. 戳气球] 动态规划寻找转移函数

Problem: 312. 戳气球 文章目录 思路Code 思路 这个哥们写的思路真的很牛逼&#xff0c;转载一下他。 戳气球题解 Code class Solution { public:int maxCoins(vector<int>& nums) {nums.insert(nums.begin(), 1);nums.push_back(1);int n nums.size();vector<v…...

以操作系统和Java的视角看“中断“

引言 fucking-java-concurrency主要解读了在开发过程中常常会遇到的Java并发问题&#xff0c;本文主要总结Java的中断原理和应用。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 操作系统的中断 什么是中断&#xff1…...

【运维】如何在Ubuntu 22上使用Python 3.8的虚拟环境

在Ubuntu 22上使用Python 3.8的虚拟环境安装Ryu是相对简单的。以下是一步一步的指南&#xff1a; https://qq742971636.blog.csdn.net/article/details/139566151 安装Python 3.8&#xff1a; 在Ubuntu 22上&#xff0c;Python 3.8可能不是默认安装的版本。你可以使用以下命令…...

门面模式Api网关(SpringCloudGateway)

1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题&#xff0c;使用Spring Cloud LoadBalance解决了负载均衡的需求&#xff0c;同时借助OpenFeign实现了远程调用。然而&#xff0c;现有的微服务接口都直接对外暴露&#xff0c;容易被外部访问。为保障对外服务的安全…...

玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…...

手撸一个java网关框架

手写一个简易的Java网关框架涉及到很多方面&#xff0c;但我会提供一个基本的框架概念和代码示例&#xff0c;帮助你理解网关的基本构建。以下是一个简单的Java网关框架的实现&#xff1a; 定义路由&#xff1a;需要一个路由表来映射请求的URL到对应的处理器。 请求处理&#x…...

亮数据代理IP助力高效数据采集

文章目录 &#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤&#xff1a; 五、数据集5.1 免费样本5.2 定制数据集 &#x1f324;️个人小结 &#x1f…...

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib&#xff0c;lib调用DLL2 问题1&#xff1a;为什么在dll1中需要引入dll2的.lib文件 当你有一个工程&#xff08;dll1&#xff09;调用静态库&#xff08;lib&#xff09;&#xff0c;而静态库&#xff08;lib&#xff09;又调用另一个DLL&#xff08;dll2&#xf…...

Unity Mirror VR联机开发 房间篇

一、需求 在联机时通常有加入房间这个步骤&#xff0c;在mirror示例中也有相应的案例&#xff0c;但是那个比较复杂&#xff0c;我们做教育科普类不需要如此复杂&#xff0c;傻瓜式操作基本就可以了&#xff0c;所以我简化了步骤&#xff0c;省略了点击准备按钮这一步骤&#…...

二叉树—leetcode

前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇&#xff1a;数据结构-二叉树-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &…...

shell编程(二)——字符串与数组

本文为shell 编程的第二篇&#xff0c;介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’&#xff0c;也可以用双引号 “”&#xff0c;也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号&#xff08;使用转义符…...

【数据结构】二叉树专题

前言 本篇博客我们来看一些二叉树的经典题型&#xff0c;也是对上篇博客的补充 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.单值二叉树 …...

开源模型应用落地-LangChain高阶-LCEL-表达式语言(四)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…...

Python第二语言(九、Python第一阶段实操)

目录 1. json数据格式 2. Python与json之间的数据转换 3. pyecharts模块官网 4. pyecharts快速入门&#xff08;折线图&#xff09; 5. pyecharts全局配置选项 5.1 set_global_ops使用 5.1.1. title_opts 5.1.2 legend_opts 5.1.3 toolbox_opts 5.1.4 visualmap_opts…...

Java异常机制

1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的&#xff0c;不正常的情况。 若异常产生后没有正确的处理&#xff0c;会导致程序的中断&#xff0c;程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…...

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本&#xff1a;20.10.25 k8s版本&#xff08;kubeadm&#xff0c;kubelet和kubectl&#xff09;&#xff1a;1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …...

python 比较 mysql 表结构差异

最近在做项目的时候&#xff0c;需要比对两个数据库的表结构差异&#xff0c;由于表数量比较多&#xff0c;人工比对的话需要大量时间&#xff0c;且不可复用&#xff0c;于是想到用 python 写一个脚本来达到诉求&#xff0c;下次有相同诉求的时候只需改 sql 文件名即可。 com…...

【RAG入门教程01】Langchian框架 v0.2介绍

LangChain 是一个开源框架&#xff0c;旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…...

python 做成Excel并设置打印区域

记录首次用python处理Excel表格的过程。 参考文章&#xff1a;https://www.jianshu.com/p/5e00dc2c9f4c 程序要做的事情&#xff1a; 1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名 2. 从 DB 查询数据并将数据写入 Excel 3. 写数据的同时&#xff0c; 设置每…...

SpringAI(二)

大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…...

小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦

下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址&#xff1a;https://www.ventoy.net/cn/&#xff0c;找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址&#xff0c;如下图所示。 4、如下就是我下…...

在农村开个网站要多少钱/企业关键词推广

为什么80%的码农都做不了架构师&#xff1f;>>> 方法一&#xff1a; 一般会更新操作都会判断null值&#xff0c;为null就不更新对应的字段。但是有时候需要把特定的字段更新为null&#xff0c;使用mybatis-plus时可以在实体类特定属性上面加注解TableField(strateg…...

海口网站建设哪家专业/百度百家号登录入口

有时需要在代码中对文件或者文件夹 进行删除&#xff0c;或者添加 导入的包&#xff1a;import os,shutil 主要涉及到三个函数 1、os.path.exists(path) 判断一个目录是否存在 2、os.makedirs(path) 多层创建目录 3、os.mkdir(path) 创建目录 1 新建文件夹2 import os,shutil3 …...

做算命类网站违法吗/劳动局免费培训项目

人工智能标记语言AIML聊天机器人&#xff1a;产生、种类、应用、实例、AIML概述、知识库、公司、业界&#xff08;20k字经典收藏版&#xff09;秦陇纪10译编 聊天机器人&#xff08;chatterbot&#xff09;是一个用来模拟人类对话或聊天的程序&#xff0c;试图建立程序让真人认…...

星沙做淘宝店铺网站/百度搜索资源管理平台

visible, disable, css绑定 这个例子非常简单&#xff0c;主要演示如何通过属性控制html元素的显示与否&#xff08;visible&#xff09;&#xff0c;可用性&#xff08;disable&#xff09;以及根据属性添加相应的CSS样式。 先简单的看一段代码&#xff1a; <p><inpu…...

外贸网站平台seo推广/seo 的原理和作用

求一个3 3矩阵的转置&#xff0c;动态内存分配创建一个二维数组存储矩阵的值&#xff0c;然后求转置 C代码如下&#xff1a; 1 #include<iostream>2 using namespace std;3 4 void swap(int &a, int &b) { //两个整数交换数值5 int temp a;6 a b;7 …...

企业宣传片制作公司天津/什么是搜索引擎优化推广

点击上方关注我们!11月15日&#xff0c;由亚信安全主办的“安全世界 5正当时”2020第五空间战略发展高峰论坛在北京盛大举行。来自政府、运营商、金融和能源等关键信息基础设施行业的负责人&#xff0c;生态合作伙伴出席本次活动&#xff0c;“共启安全数字世界”&#xff0c;聚…...