JavaWeb(苍穹外卖)--学习笔记18(Apache POI)

前言

本篇文章是学习B站黑马程序员苍穹外卖的学习笔记📑。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,就进入到了用户端微信小程序的开发,用户端开发的流程大致为用户登录---商品浏览(其中涉及到缓存,之前写过)---添加/查看/清空购物车---下单支付(到现在没搞懂😵‍💫)---地址簿---订单查询/超时/取消处理(巨多)...还有我没学到的🤪🤪,统计功能实现之后,为了方便商家了解运营数据,我们一般以Excel表格的形式呈现出我们想要的数据,方便观看。

🙌先来认识一个新工具---Apache POI?

Apache POI (Poor Obfuscation Implementation)是 Apache 软件基金会的一个开源 Java 库。它的主要功能是读取、创建和操作 Microsoft Office 格式的文件,特别是:

Excel 文件(.xls 和 .xlsx)

Word 文件(.docx)

PowerPoint 文件(.pptx)

以及其他一些 Office 格式(如 Visio .vsd 等)

通过一个测试代码来看一下怎么使用Apache POI来创建Excel表格🤔

👍通过POI创建Excel文件并且写入文件指定内容

  1. 导入Maven
xml 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
</dependency>
  1. 创建测试类:
java 复制代码
package com.sky.test;

...

public class POITest {
    /*
     * 通过POI创建Excel文件并且写入文件内容
     * */
    @Test
    public void writeTest() throws IOException {
        //在内存中创建一个Excel文件
        XSSFWorkbook excel = new XSSFWorkbook();
        //在Excel文件中创建一个Sheet页
        XSSFSheet sheet = excel.createSheet("info");
        //在Sheet中创建行对象,rownum编号从0开始
        XSSFRow row = sheet.createRow(1); //1代表第2行
        row.createCell(1).setCellValue("姓名");//创建单元格写入内容
        row.createCell(2).setCellValue("城市");
        //创建一个新行
        row = sheet.createRow(2);//第3行
        row.createCell(1).setCellValue("hhh");//创建单元格写入内容
        row.createCell(2).setCellValue("xxx");

        row = sheet.createRow(3);//第4行
        row.createCell(1).setCellValue("hhhh");//创建单元格写入内容
        row.createCell(2).setCellValue("xxxx");
        //上面写的都是在内存,现在想在磁盘看到
        FileOutputStream out = new FileOutputStream(new File("D://hhh/hhhh.xlsx"));//设置文件
        excel.write(out);//写入到文件
        //关闭资源
        out.close();
        excel.close();

    }
}

来看看实现:

✌️将读取磁盘上已经存在的Excel文件

java 复制代码
@Test
public void readTest() throws IOException{
    FileInputStream in = new FileInputStream(new File("D://hhh/hhhh.xlsx"));
    //读取磁盘上已经存在的Excel文件
    XSSFWorkbook excel = new XSSFWorkbook(in);
    //读取Excel文件中的第一个Sheet页
    XSSFSheet sheet = excel.getSheetAt(0);
    //获取Sheet中最后一行行号
    int lastRowNum = sheet.getLastRowNum();
    for(int i=1;i<=lastRowNum;i++){
        //获得某一行
        XSSFRow row = sheet.getRow(i);
        //获得单元格对象
        String cellValue1 = row.getCell(1).getStringCellValue();
        String cellValue2 = row.getCell(2).getStringCellValue();
        System.out.println(cellValue1+" "+cellValue2);
    }
    //关闭资源
    in.close();
 
}

来看看实现:

✅我用ai总结了一下上面所用的Apache POI 组件,每个组件针对特定的 Office 格式或技术::

1. XSSFWorkbook:

用途: 代表一个 Excel .xlsx 格式的工作簿(整个文件)。它是所有操作的起点和容器。无论是读还是写,都需要先创建或加载一个 XSSFWorkbook 实例。

写入: 使用 new XSSFWorkbook() 在内存中创建一个新的工作簿。

读取: 使用 new XSSFWorkbook(InputStream) 从已存在的文件流加载一个现有的工作簿。

3. XSSFSheet:

用途: 代表工作簿中的一个工作表(Sheet)。

写入: 使用 workbook.createSheet("name") 创建一个新的工作表。

读取: 使用 workbook.getSheetAt(index) 或 workbook.getSheet("name") 获取一个已存在的工作表。

4. XSSFRow:

用途: 代表工作表中的一行。

写入: 使用 sheet.createRow(rowIndex) 在指定行号(从0开始)创建一个新行。

读取: 使用 sheet.getRow(rowIndex) 获取指定行号的行对象。

5. XSSFCell:

用途: 代表行中的一个单元格。

写入: 使用 row.createCell(cellIndex) 在指定列号(从0开始)创建一个新单元格。

读取: 使用 row.getCell(cellIndex) 获取指定列号的单元格对象。

最后我们来看看项目中(导出Excel表) 代码开发

首先还是来看看前端,来看功能:

在统计界面的右上角有一个小按钮(数据导出),点击后,我们的前端便可把要统计的数据传给我们的后端,后端再返回一个Excel数据表

🙌在写代码前,先做一个准备工作:

先设计一个运营数据报表模板:

再在resources下面创建一个template包,然后把运营数据报表模板.xlsx复制进去。

admin下的ReportController类:

java 复制代码
 /**
     * 导出Excel
     * @param response
     */
    @GetMapping("/export")
    @ApiOperation("导出Excel")
    public void export(HttpServletResponse response) {

        reportService.exportBusinessData(response);
    }

ReportService类:

java 复制代码
    /**
     * 导出营业数据
     * @param response
     */
    void exportBusinessData(HttpServletResponse response);
}

ReportServiceImpl类:

java 复制代码
@Override
    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);
            //填充数据-"营业额"列
            XSSFRow row =sheet.getRow(3);
            row.getCell(2).setCellValue(businessDataVO.getTurnover());
            row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());
            row.getCell(6).setCellValue(businessDataVO.getNewUsers());

            //填充数据-"有效订单数"列
            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());

            }

            //3.使用输出流将Excel文件下载到客户端
            ServletOutputStream out = response.getOutputStream();
            excel.write(out);

            //释放资源
            out.close();
            excel.close();

        } catch (IOException e) {
            e.printStackTrace();
        }





    }

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

...。。。。。。。。。。。...

...。。。。。。。。。。。...

相关推荐
teeeeeeemo28 分钟前
Ajax、Axios、Fetch核心区别
开发语言·前端·javascript·笔记·ajax
鲸鱼在dn1 小时前
RAG-大模型课程《李宏毅 2025》作业1笔记
人工智能·笔记·gpt·搜索引擎·语言模型·chatgpt
Cx330❀2 小时前
【数据结构初阶】--二叉树(三)
c语言·数据结构·经验分享·笔记
醉卧红尘的鱼2 小时前
随机向量正交投影定理(Orthogonal Projection Theorem, OPT)_学习笔记
学习·算法
元契4 小时前
7、西门子PLC基础术语:数据单位、存储区域、寻址方式、字节序
学习
我们从未走散5 小时前
Redis学习笔记-----Redis内存回收
java·redis·笔记·学习
qq_386322695 小时前
华为网路设备学习-28(BGP协议 三)路由策略
学习
驱动探索者5 小时前
瑞芯微 RK3588 平台驱动开发 学习计划
驱动开发·学习
universe_016 小时前
day22|学习前端ts语言
前端·笔记