484 lines
18 KiB
Markdown
484 lines
18 KiB
Markdown
# 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-6:Integer类型
|
||
- 蓝球:Integer类型
|
||
|
||
**数据映射**:
|
||
- A列:开奖期号(drawId)
|
||
- B列:开奖日期(drawDate)
|
||
- C列:红球1(redBall1)
|
||
- D列:红球2(redBall2)
|
||
- E列:红球3(redBall3)
|
||
- F列:红球4(redBall4)
|
||
- G列:红球5(redBall5)
|
||
- H列:红球6(redBall6)
|
||
- I列:蓝球(blueBall)
|
||
|
||
**字段映射**:
|
||
- drawId:开奖期号(Long类型,主键)
|
||
- drawDate:开奖日期(Date类型,支持yyyy-MM-dd、yyyy/MM/dd等格式)
|
||
- redBall1-redBall6:红球1-6(Integer类型)
|
||
- 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导入接口。 |