Files
cpzs-backend/Excel导入使用说明.md

484 lines
18 KiB
Markdown
Raw Normal View History

2025-08-01 19:09:57 +08:00
# 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导入接口。