• 苍穹外卖集成 Apache POI Java实现Excel文件的读写下载


    苍穹外卖 day12 Echats 营业台数据可视化整合_软工菜鸡的博客-CSDN博客

    Apache POI - the Java API for Microsoft Documents
    Project News
    16 September 2022 - POI 5.2.3 available
    The Apache POI team is pleased to announce the release of 5.2.3. Several dependencies were updated to their latest versions to pick up security fixes and other improvements.

    A summary of changes is available in the Release Notes. A full list of changes is available in the change log. People interested should also follow the dev list to track progress.

    See the downloads page for more details.

    POI requires Java 8 or newer since version 4.0.1.

    2. Apache POI

    2.1 介绍

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

    一般情况下,POI 都是用于操作 Excel 文件。

    Apache POI 的应用场景

    • 银行网银系统导出交易明细

    • 各种业务系统导出Excel报表

    • 批量导入业务数据

    2.2 入门案例

    Apache POI既可以将数据写入Excel文件,也可以读取Excel文件中的数据,接下来分别进行实现。

    Apache POI的maven坐标:(项目中已导入)

    1. <dependency>
    2. <groupId>org.apache.poi</groupId>
    3. <artifactId>poi</artifactId>
    4. <version>3.16</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.apache.poi</groupId>
    8. <artifactId>poi-ooxml</artifactId>
    9. <version>3.16</version>
    10. </dependency>
    2.2.1 将数据写入Excel文件

    1). 代码开发

    1. package com.sky.test;
    2. import org.apache.poi.xssf.usermodel.XSSFCell;
    3. import org.apache.poi.xssf.usermodel.XSSFRow;
    4. import org.apache.poi.xssf.usermodel.XSSFSheet;
    5. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    6. import java.io.File;
    7. import java.io.FileInputStream;
    8. import java.io.FileOutputStream;
    9. public class POITest {
    10. /**
    11. * 基于POI向Excel文件写入数据
    12. * @throws Exception
    13. */
    14. public static void write() throws Exception{
    15. //在内存中创建一个Excel文件对象
    16. XSSFWorkbook excel = new XSSFWorkbook();
    17. //创建Sheet页
    18. XSSFSheet sheet = excel.createSheet("itcast");
    19. //在Sheet页中创建行,0表示第1
    20. XSSFRow row1 = sheet.createRow(0);
    21. //创建单元格并在单元格中设置值,单元格编号也是从0开始,1表示第2个单元格
    22. row1.createCell(1).setCellValue("姓名");
    23. row1.createCell(2).setCellValue("城市");
    24. XSSFRow row2 = sheet.createRow(1);//第二行
    25. row2.createCell(1).setCellValue("张三");
    26. row2.createCell(2).setCellValue("北京");
    27. XSSFRow row3 = sheet.createRow(2);//第三行
    28. row3.createCell(1).setCellValue("李四");
    29. row3.createCell(2).setCellValue("上海");
    30. FileOutputStream out = new FileOutputStream(new File("D:\\itcast.xlsx"));
    31. //通过输出流将内存中的Excel文件写入到磁盘上
    32. excel.write(out);
    33. //关闭资源
    34. out.flush();
    35. out.close();
    36. excel.close();
    37. }
    38. public static void main(String[] args) throws Exception {
    39. write();
    40. }
    41. }

    2). 实现效果

    在D盘中生成itcast.xlsx文件,创建名称为itcast的Sheet页,同时将内容成功写入。

    2.2.2 读取Excel文件中的数据

    1). 代码开发

    1. package com.sky.test;
    2. import org.apache.poi.xssf.usermodel.XSSFCell;
    3. import org.apache.poi.xssf.usermodel.XSSFRow;
    4. import org.apache.poi.xssf.usermodel.XSSFSheet;
    5. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    6. import java.io.File;
    7. import java.io.FileInputStream;
    8. import java.io.FileOutputStream;
    9. public class POITest {
    10. /**
    11. * 基于POI读取Excel文件
    12. * @throws Exception
    13. */
    14. public static void read() throws Exception{
    15. FileInputStream in = new FileInputStream(new File("D:\\itcast.xlsx"));
    16. //通过输入流读取指定的Excel文件
    17. XSSFWorkbook excel = new XSSFWorkbook(in);
    18. //获取Excel文件的第1个Sheet页
    19. XSSFSheet sheet = excel.getSheetAt(0);
    20. //获取Sheet页中的最后一行的行号
    21. int lastRowNum = sheet.getLastRowNum();
    22. for (int i = 0; i <= lastRowNum; i++) {
    23. //获取Sheet页中的行
    24. XSSFRow titleRow = sheet.getRow(i);
    25. //获取行的第2个单元格
    26. XSSFCell cell1 = titleRow.getCell(1);
    27. //获取单元格中的文本内容
    28. String cellValue1 = cell1.getStringCellValue();
    29. //获取行的第3个单元格
    30. XSSFCell cell2 = titleRow.getCell(2);
    31. //获取单元格中的文本内容
    32. String cellValue2 = cell2.getStringCellValue();
    33. System.out.println(cellValue1 + " " +cellValue2);
    34. }
    35. //关闭资源
    36. in.close();
    37. excel.close();
    38. }
    39. public static void main(String[] args) throws Exception {
    40. read();
    41. }
    42. }

    2). 实现效果

    将itcast.xlsx文件中的数据进行读取

    3. 导出运营数据Excel报表

    3.1 需求分析和设计

    3.1.1 产品原型

    在数据统计页面,有一个数据导出的按钮,点击该按钮时,其实就会下载一个文件。这个文件实际上是一个Excel形式的文件,文件中主要包含最近30日运营相关的数据。表格的形式已经固定,主要由概览数据和明细数据两部分组成。真正导出这个报表之后,相对应的数字就会填充在表格中,就可以进行存档。

    原型图:

    导出的Excel报表格式:

    业务规则:

    • 导出Excel形式的报表文件
    • 导出最近30天的运营数据
    3.1.2 接口设计

    通过上述原型图设计对应的接口。

    注意:

    • 当前接口没有传递参数,因为导出的是最近30天的运营数据,后端计算即可,所以不需要任何参数
    • 当前接口没有返回数据,因为报表导出功能本质上是文件下载,服务端会通过输出流将Excel文件下载到客户端浏览器

    3.2 代码开发

    3.2.1 实现步骤

    1). 设计Excel模板文件

    2). 查询近30天的运营数据

    3). 将查询到的运营数据写入模板文件

    4). 通过输出流将Excel文件下载到客户端浏览器

    3.2.2 Controller层

    根据接口定义,在ReportController中创建export方法:

    1. /**
    2. * 导出运营数据报表
    3. * @param response
    4. */
    5. @GetMapping("/export")
    6. @ApiOperation("导出运营数据报表")
    7. public void export(HttpServletResponse response){
    8. reportService.exportBusinessData(response);
    9. }
    3.2.3 Service层接口

    在ReportService接口中声明导出运营数据报表的方法:

    1. /**
    2. * 导出近30天的运营数据报表
    3. * @param response
    4. **/
    5. void exportBusinessData(HttpServletResponse response);
    3.2.4 Service层实现类

    在ReportServiceImpl实现类中实现导出运营数据报表的方法:

    提前将资料中的运营数据报表模板.xlsx拷贝到项目的resources/template目录中

    1. /**导出近30天的运营数据报表
    2. * @param response
    3. **/
    4. public void exportBusinessData(HttpServletResponse response) {
    5. LocalDate begin = LocalDate.now().minusDays(30);
    6. LocalDate end = LocalDate.now().minusDays(1);
    7. //查询概览运营数据,提供给Excel模板文件
    8. BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin,LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));
    9. InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
    10. try {
    11. //基于提供好的模板文件创建一个新的Excel表格对象
    12. XSSFWorkbook excel = new XSSFWorkbook(inputStream);
    13. //获得Excel文件中的一个Sheet页
    14. XSSFSheet sheet = excel.getSheet("Sheet1");
    15. sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end);
    16. //获得第4
    17. XSSFRow row = sheet.getRow(3);
    18. //获取单元格
    19. row.getCell(2).setCellValue(businessData.getTurnover());
    20. row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
    21. row.getCell(6).setCellValue(businessData.getNewUsers());
    22. row = sheet.getRow(4);
    23. row.getCell(2).setCellValue(businessData.getValidOrderCount());
    24. row.getCell(4).setCellValue(businessData.getUnitPrice());
    25. for (int i = 0; i < 30; i++) {
    26. LocalDate date = begin.plusDays(i);
    27. //准备明细数据
    28. businessData = workspaceService.getBusinessData(LocalDateTime.of(date,LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
    29. row = sheet.getRow(7 + i);
    30. row.getCell(1).setCellValue(date.toString());
    31. row.getCell(2).setCellValue(businessData.getTurnover());
    32. row.getCell(3).setCellValue(businessData.getValidOrderCount());
    33. row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
    34. row.getCell(5).setCellValue(businessData.getUnitPrice());
    35. row.getCell(6).setCellValue(businessData.getNewUsers());
    36. }
    37. //通过输出流将文件下载到客户端浏览器中
    38. ServletOutputStream out = response.getOutputStream();
    39. excel.write(out);
    40. //关闭资源
    41. out.flush();
    42. out.close();
    43. excel.close();
    44. }catch (IOException e){
    45. e.printStackTrace();
    46. }
    47. }

    3.3 功能测试

    直接使用前后端联调测试。

    进入数据统计

    点击数据导出:Excel报表下载成功

    3.4 代码提交

    后续步骤和其它功能代码提交一致,不再赘述。

    非常感谢您阅读到这里,创作不易!如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 收藏 💕评论💬感谢支持!!!

    听说 三连能够给人 带来好运!更有可能年入百w,进入大厂,上岸

  • 相关阅读:
    AutoJs学习-MC我的世界自动钓鱼
    springboot 获取参数
    【‘Integer(int)‘ 已经过时了】
    【MySQL】 B+ 树存储的原理
    options.css 内容优化2 --chatPGT
    【CEOI2022】Drawing(全局平衡二叉树,构造,分治)
    【C++】Cmake使用教程(看这一篇就够了)
    yolo 系列代码使用讲解(yolov5-yolov7)
    Debezium系列之:Kafka Connect配置参数总结
    Intellij各个功能小件的样子
  • 原文地址:https://blog.csdn.net/m0_67184231/article/details/132713744