前言
本篇文章是学习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文件并且写入文件指定内容
- 导入Maven
xml
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
- 创建测试类:
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();
}
}
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
...。。。。。。。。。。。...
...。。。。。。。。。。。...