18 KiB
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 文件上传导入
POST /api/excel/upload
Content-Type: multipart/form-data
参数:
- file: Excel文件 (.xlsx格式)
1.2 文件路径导入
POST /api/excel/import-by-path
Content-Type: application/x-www-form-urlencoded
参数:
- filePath: Excel文件的完整路径 (例如: D:/data/kaifa1.xlsx)
1.3 获取导入说明
GET /api/excel/import-info
2. 程序调用方式
@Autowired
private ExcelImportService excelImportService;
// 方式1:通过文件路径导入
String result = excelImportService.importExcelFileByPath("D:/data/kaifa1.xlsx");
// 方式2:通过MultipartFile导入
String result = excelImportService.importExcelFile(multipartFile);
3. 测试方式
运行测试类:
// 运行 ExcelImportTest 类中的测试方法
@Test
public void testImportExcelByPath() {
// 修改文件路径为实际路径
String filePath = "D:/code/xy-ai-cpzs/kaifa1.xlsx";
String result = excelImportService.importExcelFileByPath(filePath);
System.out.println("导入结果:" + result);
}
注意事项
- 数据清空:每次导入前会清空现有数据,请谨慎操作
- 数据验证:系统会验证数据的完整性,球号为空的记录会被跳过
- 错误处理:导入过程中如有错误会回滚操作并返回错误信息
- 日志记录:导入过程会记录详细日志,便于问题排查
- 文件大小:建议文件大小不超过10MB
- 并发限制:避免同时进行多个导入操作
常见问题
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.4612.1→12.105→5.00
Swagger文档
启动应用后,可以通过以下地址访问API文档:
- Swagger UI: http://localhost:8123/api/swagger-ui.html
- Knife4j UI: http://localhost:8123/api/doc.html
在文档中可以直接测试Excel导入接口。