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

news2025/1/20 21:49:29

一.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个)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

萝卜大杂烩 | 把微信接入ChatGPT,变成聊天机器人竟然这么简单!(一起来尝试吧~)

本文来源公众号“萝卜大杂烩”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;把微信接入ChatGPT&#xff0c;变成聊天机器人竟然这么简单&#xff01; 最近的 ChatGPT 又再次火热起来了&#xff0c;各种周边工具也是层出不穷&…

力扣72. 编辑距离(动态规划)

Problem: 72. 编辑距离 文章目录 题目描述思路复杂度Code 题目描述 思路 由于易得将字符串word1向word2转换和word2向word1转换是等效的&#xff0c;则我们假定统一为word1向word2转换&#xff01;&#xff01;&#xff01; 1.确定状态&#xff1a;我们假设现在有下标i&#x…

SQL补充2:数据库的增操作

数据库的增操作 数据库的增操作主要涉及数据库的增加、数据表的增加、表记录增加以及表字段增加等&#xff1a; 数据库的增加非常简单&#xff0c;就是新创建一个数据库&#xff1b;表记录的增加指的就是新增表的数据行&#xff0c;可以是在已有表的基础上增加记录&#xff0…

菜刀HTTPTCP后门分析+防范

本文由掌控安全学院 - aj545302905 投稿 “菜刀”对于渗透测试者来说耳熟能详&#xff0c;但是大家用的菜刀真的安全吗&#xff1f;你能保证你所使用的工具不会被别人偷偷的塞入后门吗&#xff1f; 如果菜刀中被塞入后门 那我们岂不是成了别人的苦力。辛辛苦苦打下的shell就这…

简单介绍数据结构的基本概念

数据结构的基本概念 常用术语 数据 数据&#xff08;Data&#xff09;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。例如&#xff1a;整数、字符串、图形、图像、声音和动画等 数据元素 数据元素&#xff08;Data Element&…

基于SSM的宁夏旅游网站平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的宁夏旅游网站平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

解决updatexml和extractvalue查询显示不全

报错注入是一种常见的SQL 注入方式&#xff0c;通过注入代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 updatexml和extractvalue updatexml和extractvalue 是常用的两个报错注入函数 http://localhost/sqli/Less-5/?id1%27and%20updat…

树莓派登录方式

目录 1.串口登录树莓派 1.1 USB-TTL连接树莓派串口 1.2 修改系统配置&#xff0c;启用串口登录树莓派 1.3 启动树莓派 2.网络方式登录树莓派 2.1 使树莓派接入网络 2.2 网络SSH 方式登录树莓派 2.2.1 打开ssh功能&#xff0c; 输入命令&#xff1a; 1.串口登录树莓派 1…

循环语句及对应练习

一、循环语句 echo命令 echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符 选项作用\r光标移至行首&#xff0c;并且不换行\s当前shell的名称&#xff0c;如bash\t插入Tab键&#xff0c;制表符\n输出换行\f换行&#xff0c;但光标仍停留在原处\表示插入“\”本身…

OpenAI视频生成模型Sora的全面解析:从扩散Transformer到ViViT、DiT、NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0、W.A.L.T》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来&#xff0c;不…

IO进程线程day1作业

1、使用fgets统计给定文件行数 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv[]) {if(argc ! 2){printf("inputs file error\n");printf("usage:./a.out filename\n&quo…

ruoyi低版本shiro反序列化解决

解决方式如下&#xff1a; 方案一.升级shiro至最新版本方案二.保持shiro版本不变,修改rememberMe默认密钥,改为自定义密钥获取 com.msunsoft.framework.config.ShiroConfig: 将其改为以下内容: // 设置cipherKey密钥Value("${shiro.cookie.cipherKey}")private Str…

有关光猫、路由器、交换机、网关的理解

前提 在了解计算机网络的过程中&#xff0c;出现了这四个名词&#xff1a;光猫、路由器、交换机、网络。有点模糊&#xff0c;查阅互联网相关资料&#xff0c;进行整理。如有错误&#xff0c;欢迎大家批评指正。 光猫 首先光猫是物理存在的&#xff0c;大家在家里应该都可以…

『 C++ 』海量数据处理

文章目录 &#x1f996; 快速找出海量数据中是否存在该整型数据&#x1f996; 有限内存情况下两个文件(海量query)中找出交集&#x1f996; 海量数据中找出只出现1次的数据&#x1f996; 有限内存情况下两个文件(整型)找出交集&#x1f996; 海量数据中找出出现次数不超过2次的…

CleanMyMac X好不好用?如何下载2024最新版本

CleanMyMac X是一款好用的系统优化软件&#xff0c;具有简洁的界面和多样的功能&#xff0c;能够支持系统垃圾、图片、邮件、iTunes清理&#xff0c;移除恶意软件&#xff0c;优化系统和释放多余空间等。 CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid4…

Python算法题集_随机链表的复制

Python算法题集_随机链表的复制 题138&#xff1a;随机链表的复制1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【双层循环】2) 改进版一【字典哈希】3) 改进版二【单层哈希】4) 改进版三【递归大法】 4. 最优算法 本文为Python算法题集之一的…

Open CASCADE学习|TopoDS_Vertex与gp_Pnt相互转化

目录 gp_Pnt TopoDS_Vertex 关系和转换 使用场景 在Open CASCADE Technology (OCCT)中&#xff0c;TopoDS_Vertex和gp_Pnt是两种不同的数据类型&#xff0c;用于表示三维空间中的点。它们有不同的用途和特性&#xff1a; gp_Pnt gp_Pnt是OCCT几何库&#xff08;Geom&…

使用RegNet替换YOLOX中原始的Backbone

使用mmdetection 中的RegNet bcakbones替换YOLOX中原始的Backbone 将mmdet/models/backbones/regnet.py中相关的代码复制到YOLOX中&#xff0c;并进行适配 注意通道数要适配 in_channels [64, 160, 384] &#xff0c;可以通过调试后&#xff0c;先运行到后后端输出结果出&a…

算法练习-01背包问题【含递推公式推导】(思路+流程图+代码)

难度参考 难度&#xff1a;困难 分类&#xff1a;动态规划 难度与分类由我所参与的培训课程提供&#xff0c;但需 要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0…

阿里云香港轻量应用服务器网络线路cn2?

阿里云香港轻量应用服务器是什么线路&#xff1f;不是cn2。 阿里云香港轻量服务器是cn2吗&#xff1f;香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器&#xff0c;通过mtr traceroute测试了一下&#xff0c;最后一跳是202.97开头的ip&#xff0c;1…