苍穹外卖-DAY12

一、apche poi

image-20260209120903336

Apache POI 是一个非常著名的开源 Java 库,全称为 Apache Poor Obfuscation Implementation(虽然名字有点自嘲的意思,意为“糟糕的模糊实现”),由 Apache 软件基金会维护。

简单来说,它的核心作用就是让 Java 程序能够读取、创建和修改 Microsoft Office 格式的文件(主要是 Excel,但也包括 Word、PowerPoint 等)。

如果你在做企业级 Java 开发(如后台管理系统),经常会遇到“导出报表”、“导入员工数据”等需求,这时候 Apache POI 几乎是必选的技术之一。


1. 核心组件与命名规则

Apache POI 的组件命名非常有意思,主要分为两类:前缀为 H 的和前缀为 X 的。

  • H 系列 (Horrible): 处理 2003 版及以前的老格式(二进制格式,如 .xls)。
  • X 系列 (XML): 处理 2007 版及以后的新格式(基于 OOXML 标准,如 .xlsx)。

为了方便记忆,我为你整理了一个对照表:

组件名称 对应 Office 文件 文件后缀 说明
HSSF Excel ‘97(-2007) .xls 处理旧版 Excel,现在用得较少。
XSSF Excel 2007+ .xlsx 最常用,处理新版 Excel。
SXSSF Excel 2007+ .xlsx 大文件专用,流式写入,解决内存溢出问题。
HWPF / XWPF Word .doc / .docx 处理 Word 文档。
HSLF / XSLF PowerPoint .ppt / .pptx 处理 PPT 幻灯片。

2. 快速入门

这是 POI 最常见的应用场景。假设我们要生成一个包含“姓名”和“年龄”的简单 Excel 表格。

首先,需要引入 Maven 依赖:

1
2
3
4
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version> </dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;

public class PoiExample {
public static void main(String[] args) {
// 1. 创建一个工作簿 (Workbook),对应一个 Excel 文件
try (Workbook workbook = new XSSFWorkbook()) {

// 2. 创建一个工作表 (Sheet)
Sheet sheet = workbook.createSheet("员工列表");

// 3. 创建第一行 (表头)
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("姓名");
headerRow.createCell(1).setCellValue("年龄");

// 4. 创建数据行
Row dataRow = sheet.createRow(1);
dataRow.createCell(0).setCellValue("张三");
dataRow.createCell(1).setCellValue(25);

// 5. 输出到文件
try (FileOutputStream fileOut = new FileOutputStream("employees.xlsx")) {
workbook.write(fileOut);
System.out.println("Excel 文件生成成功!");
}

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

3.报表功能

报表接口

image-20260209130641931

报表通用接口实现

image-20260209131115306

自此,苍穹外卖项目后端部分结束

image-20260209164016861

二、苍穹外卖云服务器部署

1.打包

日志等级 warn

端口:5353

maven clean compile 打包

2.nginx配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
server
{
listen 5959;
server_name 101.200.184.201;

# 前端项目(静态站点/SPA)根目录:你说的真实路径在这里
root /www/wwwroot/sky/chuan_sky/sky;
index index.html index.htm;

#CERT-APPLY-CHECK--START
# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
include /www/server/panel/vhost/nginx/well-known/101.200.184.201_80.conf;
#CERT-APPLY-CHECK--END
include /www/server/panel/vhost/nginx/extension/101.200.184.201_80/*.conf;

#ERROR-PAGE-START 错误页配置
error_page 404 /404.html;
#ERROR-PAGE-END

# 如果你这个站点不需要 PHP,可注释掉下一行(不影响前端静态页面也能跑)
include enable-php-00.conf;

#REWRITE-START URL重写规则引用(你面板的伪静态)
include /www/server/panel/vhost/rewrite/101.200.184.201_80.conf;
#REWRITE-END

# 禁止访问敏感文件
location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$
{
return 404;
}

# 禁止访问敏感目录
location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ {
return 404;
}

# 一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}

# 禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}

# 静态资源缓存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}

location ~ .*\.(js|css)$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}

# =========================
# 前端入口(SPA 强烈建议)
# =========================
location / {
try_files $uri $uri/ /index.html;
}

# =========================
# 反向代理到后端:101.200.184.201:5353
# =========================

# 管理端:/api/ => 后端 /admin/
location /api/ {
proxy_pass http://127.0.0.1:5353/admin/;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# 用户端:/user/ => 后端 /user/
location /user/ {
proxy_pass http://127.0.0.1:5353/user/;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# WebSocket:/ws/ => 后端 /ws/
location /ws/ {
proxy_pass http://127.0.0.1:5353/ws/;

proxy_http_version 1.1;
proxy_read_timeout 3600s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

access_log /www/wwwlogs/101.200.184.201_5959.log;
error_log /www/wwwlogs/101.200.184.201_5959.error.log;
}

  • MYSQL
  • Redis
  • SpringBoot
  • vue