《苍穹外卖》知识梳理P11-Apache POI导出报表

一.Apache POI

可以通过Apache POI处理excel文件,核心操作是读和写

应用场景

  • 银行网银交易明细
  • 各种业务系统导出Excel报表
  • 批量导入业务数据

使用步骤

1.导入maven坐标

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

2.测试代码(写操作)

	public class PoiTest {
	
	    /**
	     * 写操作
	     * 通过POI创建excel文件并写入文件内容
	     */
	    public static void write() throws IOException {
	        //在内存中创建一个excel文件XSSFWorkbook表示excel文件
	        XSSFWorkbook excel = new XSSFWorkbook();
	        //在excel文件中创建一个sheet页
	        XSSFSheet sheet = excel.createSheet("info");
	        //在sheet页中创建行对象,i表示第i+1行
	        XSSFRow row = sheet.createRow(1);
	        //在行上创建单元格,并写入内容
	        row.createCell(1).setCellValue("姓名");
	        row.createCell(2).setCellValue("城市");
	
	        row = sheet.createRow(2);
	        row.createCell(1).setCellValue("张三");
	        row.createCell(2).setCellValue("北京");
	
	        row = sheet.createRow(3);
	        row.createCell(1).setCellValue("李四");
	        row.createCell(2).setCellValue("东京");
	
	        //通过输出流将内存中的内容输出到文件中
	        FileOutputStream fileOutputStream=new FileOutputStream(new File("D:\\info.xlsx"));
	        excel.write(fileOutputStream);
	        fileOutputStream.close();
	        excel.close();
	    }
	
	    public static void main(String[] args) throws Exception {
	        write();
	    }
	}

3.运行结果(写操作)
在这里插入图片描述
4.测试代码(读操作)

	public class PoiTest {

	    /**
	     * 通过POI读取excel文件中内容
	     */
	    public static void read() throws IOException {
	        //通过输入流读取一个磁盘中的文件内容;
	        FileInputStream inputStream = new FileInputStream(new File("D:\\info.xlsx"));
	        //在内存中创建一个excel文件XSSFWorkbook表示excel文件,并传入输入流
	        XSSFWorkbook excel=new XSSFWorkbook(inputStream);
	        //按照sheet页的名称读取
	        XSSFSheet sheet=excel.getSheetAt(0);
	        int lastRowNum = sheet.getLastRowNum();//获取有文字的最后一行的行号(从0开始);
	        for (int i = 1; i < lastRowNum; i++) {
	            //获取某一行
	            XSSFRow row=sheet.getRow(i);
	            if (row==null) continue;
	            //获取单元格对象
	            String cellValue=row.getCell(1).getStringCellValue();
	            String cellValue1=row.getCell(2).getStringCellValue();
	            System.out.println(cellValue+" "+cellValue1);
	        }
	        //关闭输入流
	        inputStream.close();
	        //关闭资源
	        excel.close();
	    }
	
	    public static void main(String[] args) throws Exception {
	//        write();
	        read();
	    }
	}

5.运行结果(读操作)
在这里插入图片描述

二.导出Excel报表

由于实际业务中可能会有复杂的报表格式,如果直接使用POI进行读取操作十分繁琐,通常是先在windows上对报表格式进行设计,得到一个模版文件,直接读入模版文件进行操作即可

  • 设计模版文件
  • 查询xx天的数据
  • 将查询到的数据写入模版文件
  • 通过输出流将excel文件下载到客户端浏览器

实现步骤

  • 项目中导入模版文件,在src/main/resources/下新建template目录用来存放模版文件,将模版.xlsx导入
    在这里插入图片描述
  • 编写代码,对指定位置进行填充,写入excel文件中的格式基本是固定的,我认为关键在于传递的参HttpServletResponse response,response.getOutputStream(): 通过调用response对象的getOutputStream()方法,获取到一个Servlet输出流。Servlet输出流是用于向客户端发送数据的输出流,通过这个输出流可以将数据发送到客户端。excel.write(outputStream): 调用excel对象的write()方法,将Excel文件内容写入到之前获取的Servlet输出流中。这会将Excel文件的内容写入到HTTP响应的输出流中,实际上是将Excel文件的字节流发送到客户端浏览器。然后客户端浏览器获得响应后自动开始下载文件.
	//通过输出流将excel下载到客户浏览器
    ServletOutputStream outputStream = response.getOutputStream();
    excel.write(outputStream);

    //关闭资源
    outputStream.close();
    excel.close();

业务层完整代码

	/**
     * 导出运行数据报表
     *
     * @param response
     */
    @Override
    public void exportBusinessData(HttpServletResponse response) {
        //查数据库获取营业数据
        LocalDate dateBegin = LocalDate.now().minusDays(30);
        LocalDate dateEnd = LocalDate.now().minusDays(1);
        //将日期转换为详细时间
        LocalDateTime dateStartPoint = LocalDateTime.of(dateBegin, LocalTime.MIN);
        LocalDateTime dateEndPoint = LocalDateTime.of(dateEnd, LocalTime.MAX);
        BusinessDataVO businessData = workspaceService.getBusinessData(dateStartPoint, dateEndPoint);
        ClassLoader loader = getClass().getClassLoader();
        InputStream stream = loader.getResourceAsStream("template/运营数据报表模板.xlsx");
        log.info("读入的输入流stream{}",stream);
        //从类路径下边读取资源
        InputStream inputStream = ReportServiceImpl.class.getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
//        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");

        try {
            //基于模版文件创建一个新的excel文件
            XSSFWorkbook excel=new XSSFWorkbook(inputStream);
            XSSFSheet sheet1 = excel.getSheet("Sheet1");
            //填充数据,填充时间
            sheet1.getRow(1).getCell(1).setCellValue("时间"+dateBegin+"至"+dateEnd);

            //获得第四行
            XSSFRow row=sheet1.getRow(3);
            row.getCell(2).setCellValue(businessData.getTurnover());
            row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
            row.getCell(6).setCellValue(businessData.getNewUsers());

            //获得第五行
            row=sheet1.getRow(4);
            row.getCell(2).setCellValue(businessData.getValidOrderCount());
            row.getCell(4).setCellValue(businessData.getUnitPrice());

            //填充明细数据
            for (int i=0;i<30;i++){
                LocalDate date=dateBegin.plusDays(1);
                //查询某一天的数据
                workspaceService.getBusinessData(LocalDateTime.of(dateBegin,LocalTime.MIN),
                        LocalDateTime.of(dateBegin,LocalTime.MAX));
                //获取某一行
                row = sheet1.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(5).setCellValue(businessData.getNewUsers());

            }

            //通过输出流将excel下载到客户浏览器
            ServletOutputStream outputStream = response.getOutputStream();
            excel.write(outputStream);

            //关闭资源
            outputStream.close();
            excel.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        //将查询到的数据写入到Excel文件中

    }

实现效果
备注:并不是下载了5个(是我之前测试用的提前下载了4个)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用C++,实现高精度加减乘除法运算!

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 我的专栏&#xff1a; \mathcal{{\color{Green} 我的专栏&#xff1a;} } 我的专栏&#xff1a; 《精选文章》《算法》《每日一道编程题》《高精度算法》 文章目录 前言高精度计算初始模版string 转…

游泳听音乐最好的耳机推荐,游泳防水耳机排行榜推荐

在当今社会&#xff0c;随着人民生活水平的不断提高&#xff0c;人们对健康生活的追求也越来越高。运动成为了人们日常生活中不可或缺的一部分&#xff0c;而游泳作为一种全身性的锻炼方式&#xff0c;更是受到了广大人群的喜爱。然而&#xff0c;对于音乐爱好者来说&#xff0…

【机构vip教程】​python(1):python正则表达式匹配指定的字符开头和指定的字符结束

一&#xff0c;使用python的re.findall函数&#xff0c;匹配指定的字符开头和指定的字符结束 代码示例&#xff1a; 1 import re 2 # re.findall函数;匹配指定的字符串开头和指定的字符串结尾(前后不包含指定的字符串) 3 str01 hello word 4 str02 re.findall((?<e).*?…

Java学习笔记------static

static 创建Javabean类 public class student {private int age;private String name;private String gender;public student() {}public student(int age, String name, String gender) {this.age age;this.name name;this.gender gender;}/*** 获取* return age*/public…

数据结构——lesson3单链表介绍及实现

目录 1.什么是链表&#xff1f; 2.链表的分类 &#xff08;1&#xff09;无头单向非循环链表&#xff1a; &#xff08;2&#xff09;带头双向循环链表&#xff1a; 3.单链表的实现 &#xff08;1&#xff09;单链表的定义 &#xff08;2&#xff09;动态创建节点 &#…

【Gitea】配置 Push To Create

引 在 Git 代码管理工具使用过程中&#xff0c;经常需要将一个文件夹作为仓库上传到一个未创建的代码仓库。如果 Git 服务端使用的是 Gitea&#xff0c;通常会推送失败。 PS D:\tmp\git-test> git remote add origin http://192.1.1.1:3000/root/git-test.git PS D:\tmp\g…

VMware虚拟机安装CentOS7

对于系统开发来说&#xff0c;开发者时常会需要涉及到不同的操作系统&#xff0c;比如Windows系统、Mac系统、Linux系统、Chrome OS系统、UNIX操作系统等。由于在同一台计算机上安装多个系统会占据我们大量的存储空间&#xff0c;所以虚拟机概念应运而生。本篇将介绍如何下载安…

SaaS系统介绍

本文系个人学习笔记&#xff0c;内容来源于资料整合及个人理解。 1. 概念介绍 SaaS系统英文全称为Software as a Service&#xff08;软件即服务&#xff09;&#xff0c;通俗来讲就是提供固定功能的在线软件。从宏观上看&#xff0c;SaaS有三大特点&#xff1a; 1. 用户无需…

如何在Linux系统中配置并优化硬盘的RAID

在Linux系统中配置和优化硬盘的RAID技术可以帮助提高数据存储性能和安全性。RAID&#xff08;Redundant Array of Independent Disks&#xff09;技术通过将多个硬盘组合起来&#xff0c;以增加性能、容量或冗余度&#xff0c;提高数据的可靠性和可用性。本文将介绍如何在Linux…

代码随想录算法训练营第15天—二叉树04 | ● *110.平衡二叉树 ● *257. 二叉树的所有路径 ● 404.左叶子之和

*110.平衡二叉树 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 考点 后序遍历二叉树高度计算 我的思路 错误地将平衡二叉树的定义等价为判断整体二叉树的最大深度和最小深度之差是否大于1 视…

黑马程序员-瑞吉外卖-day8

目录 菜品新增 菜品代码准备&#xff1a; 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 5.controller 菜品口味代码准备&#xff1a; 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 菜品新增 分析&#xff1a; 后台系统中可以管理菜品信息&…

胆小勿入!AI创作恐怖电影宣传片《生化危机:重生》

胆小勿入&#xff01;AI创作恐怖电影宣传片《生化危机&#xff1a;重生》 "The city is falling, and the dead walk among us." "In the shadow of the apocalypse, the fight for survival begins." "The streets are silent, but the nightmare …

若依项目改造

ctrlalt l 格式化项目 alt f6 修改包和import包名 替换com.ruoyi 为 com.cj 替换若依版本为自己的版本 将ruoyi改成自己项目的英文名 修改中文名字 修改文件包名 修改有ruoyi的类名 &#xff1a; 验证码生成器包名修改&#xff1a;

蝶阀、球阀、阀门百科

一、D71X是蝶阀的型号其中D 就代表了蝶阀,7 代表是对夹式链接,1代表这个蝶阀是中线结构,x就是密封面材质为橡胶。结合起来D71X表示的就是手柄对夹中线蝶阀。 二、J41H-100C型号字母含义介绍 J41H-100C型号是德特森阀门常用的高压截止阀型号字母代表的意思是: J——代表阀门类…

英文论文(sci)解读复现【NO.21】一种基于空间坐标的轻量级目标检测器无人机航空图像的自注意

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

内存基础知识

内存作用&#xff1a;用来存放数据 int x10&#xff1b; xx1&#xff1b; 这会生成一个可执行文件&#xff08;装入模块&#xff09;然后存入内存地址中 绝对装入&#xff1a;-如果知道程序放到内存中哪个位置&#xff0c;编译程序将产生绝对地址的目标代码 可重定位装入&am…

【MySQL】变量、流程控制

一、变量 在MySQL的存储过程与函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。它可以分为用户自定义变量与系统变量 1、系统变量 1&#xff09;系统变量分为全局变量&#xff08;需要使用关键字global&#xff09;和会话…

Shell脚本条件语句

1.条件测试 文件测试与整数测试 test命令 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;不成立返回其他数值 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] 测试 是否成功使用 $? 操作符&#xff1a; -d&#xff1a;测试是否为目…

JavaWeb学习(1)数据库相关概念,mysql数据库管理系统,SQL语句

数据库相关概念 数据库&#xff1a; 存储数据的仓库&#xff0c;数据是有组织的进行存储 英文&#xff1a;DataBase 简称DB 数据库管理系统&#xff1a; 管理数据库的大型软件 英文&#xff1a;DataBase Management System,简称DBMS SQL 英文&#xff1a;Stry…

Java_方法(重载方法签名等详解)

在之前我们学习C语言时&#xff0c;当我们想要重复使用某段代码的功能时&#xff0c;我们会将这段代码定义为一个函数&#xff0c;而在java中我们把这段重复使用的代码叫做方法。 方法的定义 类体的内容分为变量的声明和方法的定义&#xff0c;方法的定义包括两部分&#xff1…