Files
cpzs-backend/Excel导入使用说明.md
2025-08-01 19:09:57 +08:00

484 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Excel数据导入功能使用说明
## 功能概述
本系统提供了Excel数据导入功能可以将包含T1、T2、T3、T4、T5、T6、T7、T8、T10和T11工作表的Excel文件数据导入到十四个数据库表中
### 红球数据T1 Sheet
- `history_all` - 红球全部历史数据表
- `history_100` - 红球最近100期数据表
- `history_top` - 红球历史数据排行表
- `history_top_100` - 红球100期数据排行表
### 蓝球数据T2 Sheet
- `blue_history_all` - 蓝球全部历史数据表
- `blue_history_100` - 蓝球最近100期数据表
- `blue_history_top` - 蓝球历史数据排行表
- `blue_history_top_100` - 蓝球100期数据排行表
### 红球线系数数据T3 Sheet
- `t3` - 红球组红球的线系数表
### 蓝球组红球线系数数据T4 Sheet
- `t4` - 蓝球组红球的线系数表
### 蓝球组蓝球线系数数据T5 Sheet
- `t5` - 蓝球组蓝球的线系数表
### 红球组蓝球线系数数据T6 Sheet
- `t6` - 红球组蓝球的线系数表
### 红球组红球面系数数据T7 Sheet
- `t7` - 红球组红球的面系数表
### 红球组蓝球面系数数据T8 Sheet
- `t8` - 红球组蓝球的面系数表
### 彩票开奖信息数据T10 Sheet
- `lottery_draws` - 彩票开奖信息表
### 蓝球组红球面系数数据T11 Sheet
- `t11` - 蓝球组红球的面系数表
## Excel文件格式要求
### 文件要求
- **文件格式**:必须是`.xlsx`格式
- **工作表名称**:必须包含名为`T1``T2``T3``T4``T5``T6``T7``T8``T10``T11`的工作表
- **编码**:支持中文
### 数据结构要求
**T1工作表红球数据**的数据结构如下:
| 列位置 | 列名 | 对应表 | 字段说明 |
|--------|------|--------|----------|
| A-G | 全部历史数据 | history_all | 球号、出现频次、出现频率%、平均隐现期次、最长隐现期次、最多连出期次、点系数 |
| H-M | 最近100期数据 | history_100 | 出现频次、出现频率%、平均隐现期、当前隐现期、最多连出期次、点系数 |
| N-P | 历史数据排行 | history_top | 排行、球号、点系数 |
| Q-S | 100期数据排行 | history_top_100 | 排行、球号、点系数 |
**T2工作表蓝球数据**的数据结构如下:
| 列位置 | 列名 | 对应表 | 字段说明 |
|--------|------|--------|----------|
| A-G | 全部历史数据 | blue_history_all | 球号、出现频次、出现频率%、平均隐现期次、最长隐现期次、最多连出期次、点系数 |
| H-M | 最近100期数据 | blue_history_100 | 出现频次、出现频率%、平均隐现期、当前隐现期、最多连出期次、点系数 |
| N-P | 历史数据排行 | blue_history_top | 排行、球号、点系数 |
| Q-S | 100期数据排行 | blue_history_top_100 | 排行、球号、点系数 |
**T3工作表红球线系数数据**的数据结构如下:
| 列位置 | 数据组织 | 对应表 | 字段说明 |
|--------|----------|--------|----------|
| C | 1号组线系数 | t3 | 主球=1从球=1-33线系数=C列 |
| F | 2号组线系数 | t3 | 主球=2从球=1-33线系数=F列 |
| I | 3号组线系数 | t3 | 主球=3从球=1-33线系数=I列 |
| ... | 依此类推 | t3 | 每三列为一组,组号即主球号 |
**说明**T3工作表每三列为一组数据每组有33行数据从球号固定为1-33行号线系数在C、F、I、L...列。
**T4工作表蓝球组红球线系数数据**的数据结构如下:
| 列位置 | 数据组织 | 对应表 | 字段说明 |
|--------|----------|--------|----------|
| C | 蓝球1号线系数 | t4 | 主球=1从球=1-33线系数=C列 |
| F | 蓝球2号线系数 | t4 | 主球=2从球=1-33线系数=F列 |
| I | 蓝球3号线系数 | t4 | 主球=3从球=1-33线系数=I列 |
| ... | 依此类推 | t4 | 每三列为一组最多16组 |
**说明**T4工作表每三列为一组数据每组有33行数据蓝球号码1-16主球红球号码1-33从球行号线系数在C、F、I、L...列。
**T5工作表蓝球组蓝球线系数数据**的数据结构如下:
| 列位置 | 数据组织 | 对应表 | 字段说明 |
|--------|----------|--------|----------|
| C | 蓝球1号线系数 | t5 | 主球=1从球=1-16线系数=C列 |
| F | 蓝球2号线系数 | t5 | 主球=2从球=1-16线系数=F列 |
| I | 蓝球3号线系数 | t5 | 主球=3从球=1-16线系数=I列 |
| ... | 依此类推 | t5 | 每三列为一组最多16组 |
**说明**T5工作表每三列为一组数据每组有16行数据蓝球号码1-16主球和从球线系数在C、F、I、L...列。
**T6工作表红球组蓝球线系数数据**的数据结构如下:
| 列位置 | 数据组织 | 对应表 | 字段说明 |
|--------|----------|--------|----------|
| C | 红球1号线系数 | t6 | 主球=1从球=1-16线系数=C列 |
| F | 红球2号线系数 | t6 | 主球=2从球=1-16线系数=F列 |
| I | 红球3号线系数 | t6 | 主球=3从球=1-16线系数=I列 |
| ... | 依此类推 | t6 | 每三列为一组最多33组 |
**说明**T6工作表每三列为一组数据每组有16行数据红球号码1-33主球蓝球号码1-16从球行号线系数在C、F、I、L...列。
**T7工作表红球组红球面系数数据**的数据结构如下:
| 列位置 | 数据组织 | 对应表 | 字段说明 |
|--------|----------|--------|----------|
| C | 红球1号面系数 | t7 | 主球=1从球=2-33面系数=C列 |
| F | 红球2号面系数 | t7 | 主球=2从球=1,3-33面系数=F列 |
| I | 红球3号面系数 | t7 | 主球=3从球=1-2,4-33面系数=I列 |
| ... | 依此类推 | t7 | 每三列为一组最多33组 |
**说明**T7工作表每三列为一组数据每组有33行数据红球号码1-33主球和从球面系数在C、F、I、L...列。**特殊处理**:排除自己和自己组合的情况。
**Excel数据结构**
- **第1行**标题行1号组、面系数、2号组、面系数...
- **第2行**从球1号的数据对应所有主球的面系数
- **第3行**从球2号的数据对应所有主球的面系数
- **...**
- **第34行**从球33号的数据对应所有主球的面系数
**处理逻辑**
- **1号组主球1**
- 球号列B列面系数列C列
- 读取所有行从B列获取从球号从C列获取面系数
- 排除对角线主球1=从球1的情况
- **2号组主球2**
- 球号列E列面系数列F列
- 读取所有行从E列获取从球号从F列获取面系数
- 排除对角线主球2=从球2的情况
- **依此类推...**
**关键改进**
- **动态读取球号**从Excel的球号列B、E、H...)读取实际球号,不依赖行号
- **完整数据覆盖**读取到Excel的最后一行确保包含33号球数据
- **不排除对角线**:读取到什么数据就插入什么数据,包括主球=从球的情况
- **最终生成**33×33=1089条记录
### 具体列映射
#### 红球表映射T1 Sheet
**history_all 表 (列A-G)**
- A列球号 (ballNumber)
- B列出现频次 (frequencyCount)
- C列出现频率% (frequencyPercentage)
- D列平均隐现期次 (averageInterval)
- E列最长隐现期次 (maxHiddenInterval)
- F列最多连出期次 (maxConsecutiveCount)
- G列点系数 (pointCoefficient)
**history_100 表 (列H-M球号使用A列)**
- A列球号 (ballNumber)
- H列出现频次 (frequencyCount)
- J列平均隐现期 (averageInterval)
- K列当前隐现期 (nowInterval)
- L列最多连出期次 (maxConsecutiveCount)
- M列点系数 (pointCoefficient)
**history_top 表 (列N-P)**
- N列排行 (no)
- O列球号 (ballNumber)
- P列点系数 (pointCoefficient)
**history_top_100 表 (列Q-S)**
- Q列排行 (no)
- R列球号 (ballNumber)
- S列点系数 (pointCoefficient)
#### 蓝球表映射T2 Sheet
**blue_history_all 表 (列A-G)**
- A列球号 (ballNumber)
- B列出现频次 (frequencyCount)
- C列出现频率% (frequencyPercentage)
- D列平均隐现期次 (averageInterval)
- E列最长隐现期次 (maxHiddenInterval)
- F列最多连出期次 (maxConsecutiveCount)
- G列点系数 (pointCoefficient)
**blue_history_100 表 (列H-M球号使用A列)**
- A列球号 (ballNumber)
- H列出现频次 (frequencyCount)
- J列平均隐现期 (averageInterval)
- K列当前隐现期 (nowInterval)
- L列最多连出期次 (maxConsecutiveCount)
- M列点系数 (pointCoefficient)
**blue_history_top 表 (列N-P)**
- N列排行 (no)
- O列球号 (ballNumber)
- P列点系数 (pointCoefficient)
**blue_history_top_100 表 (列Q-S)**
- Q列排行 (no)
- R列球号 (ballNumber)
- S列点系数 (pointCoefficient)
#### T3表映射T3 Sheet
**t3 表(红球线系数数据)**
- 数据组织每三列为一组每组33行数据
- 红球号码范围1-33主球和从球都是
- 线系数位置C、F、I、L...列
**数据映射**
- C列红球1号线系数主球=1从球=1-33线系数=C列
- F列红球2号线系数主球=2从球=1-33线系数=F列
- I列红球3号线系数主球=3从球=1-33线系数=I列
- 依此类推...
**字段映射**
- masterBallNumber主红球号码1-33
- slaveBallNumber从红球号码固定1-33对应行号
- lineCoefficient线系数每组第三列保留两位小数
#### T4表映射T4 Sheet
**t4 表(蓝球组红球的线系数)**
- 数据组织每三列为一组每组33行数据
- 蓝球号码范围1-16主球
- 红球号码范围1-33从球对应行号
- 线系数位置C、F、I、L...列
**数据映射**
- C列蓝球1号线系数主球=1从球=1-33线系数=C列
- F列蓝球2号线系数主球=2从球=1-33线系数=F列
- I列蓝球3号线系数主球=3从球=1-33线系数=I列
- 依此类推...
**字段映射**
- masterBallNumber蓝球号码1-16
- slaveBallNumber红球号码固定1-33对应行号
- lineCoefficient线系数每组第三列保留两位小数
#### T5表映射T5 Sheet
**t5 表(蓝球组蓝球的线系数)**
- 数据组织每三列为一组每组16行数据
- 蓝球号码范围1-16主球和从球都是
- 线系数位置C、F、I、L...列
**数据映射**
- C列蓝球1号线系数主球=1从球=1-16线系数=C列
- F列蓝球2号线系数主球=2从球=1-16线系数=F列
- I列蓝球3号线系数主球=3从球=1-16线系数=I列
- 依此类推...
**字段映射**
- masterBallNumber主蓝球号码1-16
- slaveBallNumber从蓝球号码固定1-16对应行号
- lineCoefficient线系数每组第三列保留两位小数
#### T6表映射T6 Sheet
**t6 表(红球组蓝球的线系数)**
- 数据组织每三列为一组每组16行数据
- 红球号码范围1-33主球
- 蓝球号码范围1-16从球
- 线系数位置C、F、I、L...列
**数据映射**
- C列红球1号线系数主球=1从球=1-16线系数=C列
- F列红球2号线系数主球=2从球=1-16线系数=F列
- I列红球3号线系数主球=3从球=1-16线系数=I列
- 依此类推...
**字段映射**
- masterBallNumber主红球号码1-33
- slaveBallNumber从蓝球号码固定1-16对应行号
- lineCoefficient线系数每组第三列保留两位小数
#### T7表映射T7 Sheet
**t7 表(红球组红球的面系数)**
- 数据组织每三列为一组每组33行数据
- 红球号码范围1-33主球和从球都是
- 面系数位置C、F、I、L...列
- 特殊处理:读取到什么数据就插入什么数据,包括对角线
**数据映射**
- C列红球1号面系数主球=1从球=1-33面系数=C列
- F列红球2号面系数主球=2从球=1-33面系数=F列
- I列红球3号面系数主球=3从球=1-33面系数=I列
- 依此类推...
**字段映射**
- masterBallNumber主红球号码1-33
- slaveBallNumber从红球号码1-33包括与主球相同的号码
- faceCoefficient面系数每组第三列保留两位小数
#### T8表映射T8 Sheet
**t8 表(红球组蓝球的面系数)**
- 数据组织每三列为一组每组16行数据
- 红球号码范围1-33主球
- 蓝球号码范围1-16从球
- 面系数位置C、F、I、L...列
**数据映射**
- C列红球1号面系数主球=1从球=1-16面系数=C列
- F列红球2号面系数主球=2从球=1-16面系数=F列
- I列红球3号面系数主球=3从球=1-16面系数=I列
- 依此类推...
**字段映射**
- masterBallNumber主红球号码1-33
- slaveBallNumber从蓝球号码固定1-16对应行号
- faceCoefficient面系数每组第三列保留两位小数
#### T10表映射T10 Sheet
**lottery_draws 表(彩票开奖信息)**
- 数据组织:标准表格结构,每行一条开奖记录
- 开奖期号Long类型主键
- 开奖日期Date类型支持多种格式
- 红球1-6Integer类型
- 蓝球Integer类型
**数据映射**
- A列开奖期号drawId
- B列开奖日期drawDate
- C列红球1redBall1
- D列红球2redBall2
- E列红球3redBall3
- F列红球4redBall4
- G列红球5redBall5
- H列红球6redBall6
- I列蓝球blueBall
**字段映射**
- drawId开奖期号Long类型主键
- drawDate开奖日期Date类型支持yyyy-MM-dd、yyyy/MM/dd等格式
- redBall1-redBall6红球1-6Integer类型
- blueBall蓝球Integer类型
**数据特性**
- 所有字段均为必填项
- 开奖期号为主键,不能重复
- 日期格式自动识别和转换
- 数据完整性验证
#### T11表映射T11 Sheet
**t11 表(蓝球组红球的面系数)**
- 数据组织每三列为一组每组33行数据
- 蓝球号码范围1-16主球
- 红球号码范围1-33从球
- 面系数位置C、F、I、L...列
**数据映射**
- C列蓝球1号面系数主球=1从球=1-33面系数=C列
- F列蓝球2号面系数主球=2从球=1-33面系数=F列
- I列蓝球3号面系数主球=3从球=1-33面系数=I列
- 依此类推...
**字段映射**
- masterBallNumber主蓝球号码1-16
- slaveBallNumber从红球号码固定1-33对应行号
- faceCoefficient面系数每组第三列保留两位小数
## 使用方法
### 1. API接口方式
#### 1.1 文件上传导入
```http
POST /api/excel/upload
Content-Type: multipart/form-data
参数:
- file: Excel文件 (.xlsx格式)
```
#### 1.2 文件路径导入
```http
POST /api/excel/import-by-path
Content-Type: application/x-www-form-urlencoded
参数:
- filePath: Excel文件的完整路径 (例如: D:/data/kaifa1.xlsx)
```
#### 1.3 获取导入说明
```http
GET /api/excel/import-info
```
### 2. 程序调用方式
```java
@Autowired
private ExcelImportService excelImportService;
// 方式1通过文件路径导入
String result = excelImportService.importExcelFileByPath("D:/data/kaifa1.xlsx");
// 方式2通过MultipartFile导入
String result = excelImportService.importExcelFile(multipartFile);
```
### 3. 测试方式
运行测试类:
```java
// 运行 ExcelImportTest 类中的测试方法
@Test
public void testImportExcelByPath() {
// 修改文件路径为实际路径
String filePath = "D:/code/xy-ai-cpzs/kaifa1.xlsx";
String result = excelImportService.importExcelFileByPath(filePath);
System.out.println("导入结果:" + result);
}
```
## 注意事项
1. **数据清空**:每次导入前会清空现有数据,请谨慎操作
2. **数据验证**:系统会验证数据的完整性,球号为空的记录会被跳过
3. **错误处理**:导入过程中如有错误会回滚操作并返回错误信息
4. **日志记录**:导入过程会记录详细日志,便于问题排查
5. **文件大小**建议文件大小不超过10MB
6. **并发限制**:避免同时进行多个导入操作
## 常见问题
### Q1: 提示"未找到T1/T2/T3/T4/T5/T6/T7/T8/T10/T11工作表"
**A**: 请检查Excel文件是否包含名为"T1"(红球数据)、"T2"(蓝球数据)、"T3"(红球线系数)、"T4"(蓝球组红球线系数)、"T5"(蓝球组蓝球线系数)、"T6"(红球组蓝球线系数)、"T7"(红球组红球面系数)、"T8"(红球组蓝球面系数)、"T10"(彩票开奖信息)和"T11"(蓝球组红球面系数)的工作表,注意区分大小写。如果缺少某个工作表,系统会跳过该部分数据并显示警告。
### Q2: 导入后数据不完整
**A**: 请检查Excel数据格式是否正确确保数值类型的列包含有效数字。
### Q3: 导入失败提示文件格式错误
**A**: 请确保文件是.xlsx格式不支持.xls格式。
### Q4: 如何查看导入日志
**A**: 导入过程中的日志会输出到控制台,可以通过查看应用日志了解详细信息。
### Q5: 报错"Cannot get a NUMERIC value from a STRING cell"
**A**: 这个错误已经修复。系统现在能够自动处理字符串类型的数值单元格,会尝试将字符串转换为数值。
### Q6: Excel中有公式单元格怎么办
**A**: 系统支持公式单元格,会自动读取公式计算后的结果值。
### Q7: 单元格为空怎么处理
**A**: 空白单元格会被自动跳过对应的字段值会设为null。
## 数据类型支持
系统支持以下类型的Excel单元格
- **数值类型** - 直接读取数值
- **字符串类型** - 尝试转换为数值(如果包含数字)
- **公式类型** - 读取公式计算结果
- **空白类型** - 设为null
- **其他类型** - 会记录警告日志并设为null
## 数据精度处理
- **浮点数字段**:自动保留两位小数(使用四舍五入)
- **整数字段**:直接转换为整数(去除小数部分)
- **特殊值处理**NaN和无穷大值会被设为null
示例:
- `123.456789``123.46`
- `12.1``12.10`
- `5``5.00`
## Swagger文档
启动应用后可以通过以下地址访问API文档
- Swagger UI: http://localhost:8123/api/swagger-ui.html
- Knife4j UI: http://localhost:8123/api/doc.html
在文档中可以直接测试Excel导入接口。