JavaWeb合集22-Apache POI

二十二、Apache POI

Apache POI是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用POI在Java
序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI都是用于操作Excel文件。

使用场景:银行网银系统导出交易明细、各种业务系统导出Excel报表、批量导,入业务数据。

1、入门案例

  1. 导入对应的Maven坐标

    <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>
  2. 创建Excel工作簿,并对其写入和读取

    public class POITest {/**通过POI.创建Excel.文件并且写入文件内容*/public static void wirteExcel() throws Exception{// 在内存中创建一个EXcel工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 在工作簿中创建一个工作表,并命名为infoXSSFSheet sheet = workbook.createSheet("info");// 在info工作表中创建一行,行号是从0开始的XSSFRow row = sheet.createRow(1);// 在row行中创建一个单元格,列号从0开始,并设置单元格的值为,姓名(2行3列)性别(2行4列)row.createCell(2).setCellValue("姓名");row.createCell(3).setCellValue("性别");//再次创创建一个新行,第3行row=sheet.createRow(2);// 在row行中创建单元格,并设置单元格的值row.createCell(2).setCellValue("张三");row.createCell(3).setCellValue("男");// 再次创建一个新行,第4行row=sheet.createRow(3);row.createCell(2).setCellValue("小明");row.createCell(3).setCellValue("女");// 将内存中的数据写入到磁盘中OutputStream outputStream=new FileOutputStream("D:\\info.xlsx");workbook.write(outputStream);  // 写入到输出流中//关闭资源outputStream.close();workbook.close();}/*** 读取Excel文件* @throws Exception*/public static void readExcel() throws Exception{// 创建输入流对象InputStream inputStream=new FileInputStream("D:\\info.xlsx");//从输入流中读取一个工作簿XSSFWorkbook workbook=new XSSFWorkbook(inputStream);// 根据名字来获取工作表//  XSSFSheet sheet = workbook.getSheet("info");//根据下标来获取工作表XSSFSheet sheet = workbook.getSheetAt(0);// 获取最后一行的行号(下标从0开始的)Integer lastRowNum = sheet.getLastRowNum();//  循环读取每一行,以及每一行对应的单元格数据,(第一行为空白,我们从第二行开始读取,下标为1)for(int i=1;i<=lastRowNum;i++){XSSFRow row = sheet.getRow(i); // 获取第i行String name =  row.getCell(2).getStringCellValue(); // 获取第i行,第3列的数据String sex = row.getCell(3).getStringCellValue(); // 获取第i行,第4列的数据System.out.println(name+"---"+sex);}// 关闭资源inputStream.close();workbook.close();}public static void main(String[] args) throws Exception {wirteExcel();readExcel();}
    }
    

    在这里插入图片描述

2、实操案例

报表导出,营业数据导出到工作表中,下载下来。

接口:没有参数,也没有返回值。

一般情况下,想这个比较复杂的工作表,都是不需要提供POI来创建的,一般是手动创建这样一个模板文件,通过输入流将其读取进去,只需要将数据写入对应的单元格,通过输出流由客户端、浏览器进行下载即可。

在这里插入图片描述

2.1 Controller层
  /*** 导出运营数据报表*/@Operation(summary = "导出运营数据报表")@GetMapping("/export")public void getBusinessReportData(HttpServletResponse response){// 调用service导出报表,传入响应对象reportService.exportBusinessReport(response);}
2.2 Service层
    /*** 导出运营数据报表* @param response*/@Overridepublic void exportBusinessReport(HttpServletResponse response) {//1、获取运营数据LocalDate beginDate=LocalDate.now().minusDays(30);LocalDate endDate=LocalDate.now().minusDays(1);LocalDateTime beginTime=LocalDateTime.of(beginDate,LocalTime.MIN);LocalDateTime endTime=LocalDateTime.of(endDate,LocalTime.MAX);BusinessDataVO businessDataVO= workspaceService.getBusinessData(beginTime,endTime); //获取运营数据//2、将数据写入到模板文件中//2.1、获取模板文件log.info("name:{}",this.getClass().getClassLoader());//通过类加载器,获取到路径:src/main/resources,再拼接路径:template/运营数据报表模板.xlsxInputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");try {//2.2、通过模块创建工作簿XSSFWorkbook workbook=new XSSFWorkbook(inputStream);//2.3、读取第一个工作表XSSFSheet sheet=workbook.getSheetAt(0);//2.4、设置时间数据sheet.getRow(1).getCell(0).setCellValue("日期范围:"+beginDate+" 至 "+endDate);//2.5、设置概况数据XSSFRow row= sheet.getRow(3);row.getCell(1).setCellValue(businessDataVO.getTurnover().doubleValue());//营业额row.getCell(3).setCellValue(businessDataVO.getOrderCompletionRate()); //订单完成率row.getCell(5).setCellValue(businessDataVO.getNewUsers()); //新增用户数row= sheet.getRow(4);row.getCell(1).setCellValue(businessDataVO.getValidOrderCount());//有效订单数row.getCell(3).setCellValue(businessDataVO.getUnitPrice().doubleValue());//平均客单价//2.6、设置订单明细数据for(int i=0;i<30;i++){LocalDate date=beginDate.plusDays(i);LocalDateTime begin=LocalDateTime.of(date,LocalTime.MIN);LocalDateTime end=LocalDateTime.of(date,LocalTime.MAX);businessDataVO=workspaceService.getBusinessData(begin,end);row= sheet.getRow(7+i);row.getCell(0).setCellValue(date.toString()); //日期row.getCell(1).setCellValue(businessDataVO.getTurnover().doubleValue()); //营业额row.getCell(2).setCellValue(businessDataVO.getValidOrderCount()); //有效订单数row.getCell(3).setCellValue(businessDataVO.getOrderCompletionRate());//订单完成率row.getCell(4).setCellValue(businessDataVO.getUnitPrice().doubleValue());row.getCell(5).setCellValue(businessDataVO.getNewUsers()); //新增用户数}//3、将文件输出到浏览器 浏览器下载ServletOutputStream servletOutputStream = response.getOutputStream();workbook.write(servletOutputStream);//4、关闭资源workbook.close();servletOutputStream.close();inputStream.close();}catch (Exception e){e.printStackTrace();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457573.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android】Kotlin教程(2)

文章目录 1.空安全2.let安全调用3.非空断言操作符!!4.空合并操作符 ?:5.异常6.先决条件函数7.substring8.split函数9.replace10.字符串比较11.安全转换函数12.标准库函数1.apply2.run3.with4.also5.takeIf6.takeUnless 1.空安全 为了避免NullPointerException&#xff0c;Kot…

【2024|滑坡数据集论文解读3】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集

【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 文章目录 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

西瓜书《机器学习》符号表KaTex表示

写这篇post的缘故是最近整理机器学习的相关公式&#xff0c;经常要用到KaTex, 但网络上搜索到的西瓜书符号表的表示有些并不准确或不严谨&#xff0c;本着严谨治学的态度&#xff0c;整理了一下符号表的KaTex表示&#xff0c;希望有所帮助,整理过程中参考了《南瓜书》和 KaTex官…

Flutter TextField和Button组件开发登录页面案例

In this section, we’ll go through building a basic login screen using the Button and TextField widgets. We’ll follow a step-bystep approach, allowing you to code along and understand each part of the process. Let’s get started! 在本节中&#xff0c;我们…

软件系统建设方案书(word参考模板)

1 引言 1.1 编写目的 1.2 项目概述 1.3 名词解释 2 项目背景 3 业务分析 3.1 业务需求 3.2 业务需求分析与解决思路 3.3 数据需求分析【可选】 4 项目建设总体规划【可选】 4.1 系统定位【可选】 4.2 系统建设规划 5 建设目标 5.1 总体目标 5.2 分阶段目标【可选】 5.2.1 业务目…

ctfshow(259->261)--反序列化漏洞--原生类与更多魔术方法

Web259 进入界面&#xff0c;回显如下&#xff1a; highlight_file(__FILE__);$vip unserialize($_GET[vip]); //vip can get flag one key $vip->getFlag();题干里还提示了网站有一个flag.php界面&#xff0c;源代码如下&#xff1a; $xff explode(,, $_SERVER[HTTP_X…

Docker容器操作

Docker容器操作 启动容器 docker run -it 镜像名(镜像id) bash当利用docker run来创建容器时&#xff0c;Docker在后台运行的标准操作包括&#xff1a; 检查本地是否存在指定的镜像&#xff0c;不存在就从公有仓库中下载利用镜像创建并启动一个容器分配一个文件系统&#xf…

C语言实现Go的defer功能

之前笔者写了一篇博文C实现Go的defer功能&#xff0c;介绍了如何在C语言中实现Go的defer功能&#xff0c;那在C语言中是否也可以实现这样的功能呢&#xff1f;本文就将介绍一下如何在C语言中实现Go的defer功能。 我们还是使用C实现Go的defer功能中的示例&#xff1a; void te…

医院信息化与智能化系统(9)

医院信息化与智能化系统(9) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…

改进YOLOv8系列:引入低照度图像增强网络Retinexformer | 优化低光照目标检测那题

改进YOLOv8系列:引入低照度图像增强网络Retinexformer | 优化低光照目标检测那题 🚀论文研究概括🚀加入到网络中的理论研究🚀需要修改的代码1 🍀🍀Retinexformer 代码2🍀🍀tasks里引用🚀创建yaml文件🚀测试是否创建成功前言:这篇论文提出了一种用于低光图像…

STM32应用详解(10)I2C总线初始化

文章目录 前言一、I2C总线初始化二、程序源码与详解1.I2C初始化2.I2C端口初始化及设置IO端口工作模式3.函数I2C_Init4.函数I2C_Cmd5.使能APB1外设时钟6.I2C通信时序图 前言 介绍STM32的I2C总线初始化&#xff0c;给出了代码详解。《i2c.h》文件&#xff0c;由用户编写。定义了…

系统聚类比较——最短距离法、最长距离法、重心法和类平均法

系统聚类概述 系统聚类&#xff0c;又称分层聚类法&#xff0c;是一种用于分析数据的统计方法&#xff0c;在生物学、分类学、社会网络等领域有广泛应用。以下是对系统聚类的详细概述&#xff1a; 一、基本思想 系统聚类的基本思想是将每个样品&#xff08;或数据点&#xf…

OAK相机的RGB-D彩色相机去畸变做对齐

▌低畸变标准镜头的OAK相机RGB-D对齐的方法 OAK相机内置的RGB-D管道会自动将深度图和RGB图对齐。其思想是将深度图像中的每个像素与彩色图像中对应的相应像素对齐。产生的RGB-D图像可以用于OAK内置的图像识别模型将识别到的2D物体自动映射到三维空间中去&#xff0c;或者产生的…

深入理解Python异常处理机制

在Python编程中&#xff0c;异常处理是一个非常重要的概念。它可以帮助我们捕获程序运行过程中出现的错误&#xff0c;防止程序崩溃&#xff0c;并提供友好的错误信息。本文将详细讲解Python的异常处理机制&#xff0c;并提供丰富的代码示例&#xff0c;帮助您更好地理解和应用…

【Spring MVC】响应结果和设置

​ 我的主页&#xff1a;2的n次方_ 1. 返回静态页面 先创建一个 html 页面 ​ 如果还按照之前的方式进行返回的话&#xff0c;返回的并不是一个 html 页面 RequestMapping("/response") RestController public class ResponseController {RequestMapping(&quo…

React基础使用教程

初识JSX React主要使用的就是jsx语法来编写dom&#xff0c;所以我们要先认识jsx&#xff0c;然后再开始学习两者相结合jsx其实就是在JS中编写HTML的一种写法编写jsx要注意以下几个规则&#xff1a; 定义虚拟DOM时&#xff0c;不要写引号标签中混入JS表达式时要用{}样式的类名指…

2024 Rust现代实用教程:1.3获取rust的库国内源以及windows下的操作

文章目录 一、使用Cargo第三方库1.直接修改Cargo.toml2.使用cargo-edit插件3.设置国内源4.与windows下面的rust不同点 参考 一、使用Cargo第三方库 1.直接修改Cargo.toml rust语言的库&#xff1a;crate 黏贴至Cargo.toml 保存完毕之后&#xff0c;自动下载依赖 拷贝crat…

形态学-闭运算

目录 依赖库显示图像的函数读取图像转换为灰度图像应用二值化阈值处理创建结构元素应用形态学闭运算显示结果 依赖库 首先&#xff0c;我们需要导入必要的库&#xff1a; import cv2 import numpy as npcv2 是OpenCV的Python接口&#xff0c;用于图像处理。numpy 是一个用于科…