16 KiB
16 KiB
版本发布说明
v1.5.0 — 2026-06-06
✨ 模板分离与格式提取增强
v1.5.0 将两个方向的模板完全分离,并实现了提取式模板格式应用机制,不再依赖硬编码的边框和对齐属性。新增 F012 回归测试确保上/下边 PinName 位置正确。
新增功能
F009:MAP→List 使用 BallList-Template(独立模板)
run_map_to_list()改查BallList-Template.xlsx- 不再共用旧模板
PinMAP-Template.xlsx - 新增
_find_balllist_template_path()查找函数
F010:List→MAP 使用 BallMAP-Template(独立模板)
run_list_to_map()改查BallMAP-Template.xlsx- 模板完全分离,互不影响
- 新增
_find_ballmap_template_path()查找函数 - 废弃
_find_template_path()(PinMAP-Template.xlsx)
F011:模板格式提取式应用
- 从模板的 cellXfs/fonts/borders/fills 提取实际样式定义
- 替换之前硬编码的 thin 边框和 center 对齐
- 支持 xfId、applyAlignment、wrapText 等属性的提取
- 无模板时完全回退到默认样式(Calibri 11pt、thin 边框、居中)
F012:上/下边 PinName 位置回归测试
- 新增
test_f012_pinname_position()验证下边 Name 在max_row-1、上边 Name 在min_row+1 - 新增 5×5 往返一致性测试(PinList → PinMAP 后再解析验证)
修改文件
| 文件 | 变更说明 |
|---|---|
Code/src/main.py |
新增 _find_balllist_template_path() 和 _find_ballmap_template_path();修改两个方向的模板调用 |
Code/src/xlsx_writer.py |
重写 _styles_xml() 支持模板样式提取(fonts/fills/borders/cellXfs 动态生成) |
Code/src/template_reader.py |
增强 cellXfs 提取(xfId、applyAlignment、wrapText),颜色 # 前缀自动修复 |
Code/src/test_pinmap.py |
新增 F012 回归测试 + F011 模板格式提取测试共 12 个测试用例 |
技术实现
模板查找逻辑
def _find_balllist_template_path() -> str | None:
"""查找顺序:项目根目录 → 当前工作目录"""
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 1. 项目根目录
template_path = os.path.join(root_dir, "BallList-Template.xlsx")
if os.path.isfile(template_path):
return template_path
# 2. 当前工作目录
cwd_template = os.path.join(os.getcwd(), "BallList-Template.xlsx")
if os.path.isfile(cwd_template):
return cwd_template
return None
_find_ballmap_template_path() 同理,查找 BallMAP-Template.xlsx。
样式提取式应用
模板 styles.xml
│
▼ 读取字体、填充、边框定义
▼ 读取 cellXfs 引用
▼ 读取列宽、行高
│
▼ 写入输出 styles.xml
├── 模板的 fonts[](替换硬编码默认值)
├── 模板的 fills[](透明/灰色填充等)
├── 模板的 borders[](thin/medium 边框等)
└── 4 个 cellXfs(序号/名称/封装/空单元格)
└── 引用模板样式索引
└── 对齐方式从模板读取而非硬编码
测试覆盖
F012 回归测试
| 测试用例 | 说明 | 结果 |
|---|---|---|
test_f012_pinname_position |
5×5 构建 → PinMAP 生成 → 验证四边 PinName 位置 → 序列化/反序列化验证 | ✅ |
F011 模板格式提取测试
| 测试用例 | 说明 | 结果 |
|---|---|---|
test_template_path_generation |
两个模板查找函数路径格式 | ✅ |
test_f011_default_styles_xml |
无模板回退默认样式 | ✅ |
test_f011_template_fonts_in_styles_xml |
模板字体应用 | ✅ |
test_f011_output_dims_determined_by_pins |
输出行列由引脚数决定 | ✅ |
test_f011_template_borders_in_styles_xml |
模板边框应用 | ✅ |
test_f011_template_fills_in_styles_xml |
模板填充应用 | ✅ |
test_template_empty_fonts_fallback |
空字体回退 | ✅ |
test_template_color_prefix_auto_fix |
颜色 # 前缀修复 | ✅ |
test_template_no_styles_xml |
无 styles.xml 降级 | ✅ |
新增测试: 12 个测试用例 总测试: 20 个单元测试 + 6 个集成测试 = 26 个 测试通过率: 100%
已知问题
无
限制
| 限制项 | 说明 |
|---|---|
| 模板查找 | 仅支持项目根目录和当前工作目录两种位置 |
| 模板格式 | 仅支持 .xlsx 格式模板 |
| 样式应用 | 提取式而非复制式,部分高级格式可能丢失 |
其他限制同 v1.2.0。
升级指南
从 v1.3.x / v1.2.0 升级:替换 Code/src/ 目录下所有文件。模板文件需手动放置:
- MAP→List 方向:在项目根目录放置
BallList-Template.xlsx - List→MAP 方向:在项目根目录放置
BallMAP-Template.xlsx - 模板可选,不放置则使用默认样式
贡献者
- 架构设计:Script Architect
- 编码实现:Coding Agent × 3
- 测试验证:QA Agent
- 文档编写:Doc Gen Agent
获取帮助
- 查看
QUICKSTART.md了解使用方法 - 查看
README.md了解完整说明 - 查看
architecture-design.md了解技术细节 - 查看
CHANGELOG.md了解变更历史 - 查看
Test/test_report.md了解测试详情
v1.2.0 — 2026-05-28
✨ 新增 PinList → PinMAP 反向转换
v1.2.0 为项目增加了完整的反向转换能力,PinMAP ↔ PinList 现在可以双向互转。
新增功能
PinList → PinMAP 转换
- PinList 解析:从 Excel 文件中读取 PinName(A 列)和 Pin 序号(B 列)
- 布局计算:根据用户输入的行数和列数,自动计算四边引脚分配
- 逆时针分配:左上角为 1 脚,沿左边→下边→右边→上边逆时针排列
- PinName 定位:自动计算 PinName 与序号的相对位置(右/上/左/下)
- 周长验证:检查引脚总数是否匹配
2×rows + 2×cols − 4 - 优雅降级:缺失 PinName 自动设为 "NC"
模板样式引擎
- 样式提取:从模板 xlsx 文件中提取字体、填充、边框、列宽、行高
- 样式应用:将模板样式应用到生成的 PinMAP 输出文件
- 优雅降级:模板不存在或解析失败时自动使用默认样式
交互式方向选择
- 启动菜单:运行
python main.py显示方向选择(1: MAP→List / 2: List→MAP) - 尺寸输入:List→MAP 模式需要输入 PinMAP 的行数和列数
- 文件选择:根据方向自动切换文件选择器标题和提示
数据验证增强
- PinList 验证:序号连续性、序号唯一性、周长匹配、PinName 完整性
- 非 4 倍数提示:Pin 数量不是 4 的倍数时提示(信息级别)
新增模块
| 模块 | 代码量 | 说明 |
|---|---|---|
pinlist_parser.py |
~80 行 | PinList 文件解析(A/B 列读取 + 排序) |
pinlist_validator.py |
~90 行 | PinList 数据验证(连续性/唯一性/周长匹配) |
pinmap_generator.py |
~70 行 | PinMAP 生成与输出(布局应用 + 样式) |
pinmap_layout.py |
~100 行 | PinMAP 布局计算(四边分配 + 坐标计算) |
template_reader.py |
~170 行 | 模板样式提取(fonts/fills/borders/cols/rows) |
更新模块
| 模块 | 变更说明 |
|---|---|
main.py |
增加 run_list_to_map() 流程 + 方向选择菜单 |
file_selector.py |
增加 mode 参数,支持 "map_to_list" / "list_to_map" |
models.py |
新增 PinListEntry、EdgePins、PinMAPLayout、LayoutError |
xlsx_writer.py |
增加 write_xlsx_with_style() 支持模板样式写入 |
validator.py |
新增 PinMapValidator 类,统一验证接口 |
技术实现
布局算法
总引脚数 = 2 × rows + 2 × cols − 4
左边: rows 个引脚(从上到下)
下边: cols − 1 个引脚(从左到右)
右边: rows − 2 个引脚(从下到上)
上边: cols − 1 个引脚(从右到左)
坐标映射
左边: 序号 (r, 0) → Name (r, 1) 右侧
下边: 序号 (rows, c) → Name (rows-1, c) 上方
右边: 序号 (r, cols) → Name (r, cols-1) 左侧
上边: 序号 (1, c) → Name (2, c) 下方
模板样式提取
xl/styles.xml:
├── fonts: name, size, bold, italic, color
├── fills: pattern_type, fg_color
├── borders: top, bottom, left, right (style + color)
└── cellXfs: numFmtId, fontId, fillId, borderId, alignment
xl/worksheets/sheet1.xml:
├── cols: column width (min, max, width)
└── sheetData: row height
测试覆盖
单元测试(8 个用例)
| 用例 | 测试内容 | 结果 |
|---|---|---|
test_4x4_parse |
4×4 方形 PinMAP 解析 | ✅ |
test_4x4_validate |
4×4 方形验证 | ✅ |
test_missing_names_warning |
PinName 缺失警告 | ✅ |
test_duplicate_numbers |
序号重复检测 | ✅ |
test_gap_in_numbers |
序号不连续检测 | ✅ |
test_empty_cells |
空单元格处理 | ✅ |
test_no_pins |
无引脚数据检测 | ✅ |
test_12pin_square |
12 引脚方形解析 | ✅ |
集成测试(6 个用例)
| 用例 | 输入文件 | 测试内容 | 结果 |
|---|---|---|---|
| TC001 | sample_4x4.xlsx |
标准 4×4 转换(8 Pin) | ✅ |
| TC002 | sample_rect.xlsx |
长方形转换(13 Pin) | ✅ |
| TC003 | error_gap.xlsx |
序号不连续检测 | ✅ |
| TC004 | error_dup.xlsx |
序号重复检测 | ✅ |
| TC005 | warning_missing.xlsx |
PinName 缺失警告 | ✅ |
| TC006 | error_empty_a1.xlsx |
A1 为空检测 | ✅ |
测试通过率:100%(14/14)
已知问题
无
限制
| 限制项 | 说明 |
|---|---|
| 引脚数量 | 建议 < 1000 引脚(典型封装 < 200 引脚,无压力) |
| 输入格式 | 仅支持 .xls 和 .xlsx,不支持 CSV/其他格式 |
| 输出格式 | 仅输出 .xlsx,不支持 .xls |
| 工作表 | 仅处理第一个工作表 |
| 公式单元格 | 仅读取公式的计算结果,不保留公式本身 |
| 命令行方向 | 命令行模式直接传入文件默认走 MAP→List,List→MAP 需交互式选择 |
未来计划
v1.3.0 — 格式增强(规划中)
- 支持
.xls格式输出 - 保留原始 Excel 的字体和格式(MAP→List 方向)
- 支持多工作表选择
v1.4.0 — 功能扩展(规划中)
- 批量转换(拖拽多个文件)
- CSV 格式输出
- PinMAP 结构可视化预览
v2.0.0 — 架构升级(远期规划)
- 支持更多封装类型(BGA、QFN 等)
- 插件式解析器架构
- Web 界面
升级指南
首次使用:直接运行即可,无需升级。
从 v1.0.0 升级:替换 Code/src/ 目录下所有文件。
从 v1.1.0 升级:替换 Code/src/ 目录下所有文件。
贡献者
- 架构设计:Script Architect
- 编码实现:Coding Agent × 3
- 测试验证:QA Agent
- 文档编写:Doc Gen Agent
获取帮助
- 查看
QUICKSTART.md了解使用方法 - 查看
architecture-design.md了解技术细节 - 查看
Test/test_report.md了解测试详情
v1.0.0 — 2026-05-25
🎉 首次发布
这是 PinMAP → PinList 转换器的第一个正式版本,实现了从 Excel PinMAP 到 PinList 的完整转换流程。
新增功能
PinMAP 解析
- 自动识别方形和长方形封装结构
- 沿四条边(左→下→右→上)逆时针提取引脚
- 角点共享处理(按单元格位置去重)
- 支持 2×2 及以上任意尺寸
数据验证
- 序号连续性检查:检测 1~N 序列中的间隔
- 序号唯一性检查:检测重复的引脚序号
- PinName 完整性检查:检测缺失的引脚名称(警告级别)
- 结构完整性检查:验证方形区域最小尺寸和 A1 封装信息
PinList 生成
- A 列 PinName,B 列 Pin 序号
- 按 Pin 序号递增排序
- 缺失 PinName 自动设为 "NC"
格式支持
.xls读取:BIFF8 引擎(OLE2 复合文档解析).xlsx读取:OOXML 引擎(ZIP + XML 解析).xlsx写入:OOXML 引擎(纯手工构建)
运行模式
- GUI 模式:tkinter 文件选择对话框(Windows 推荐)
- 命令行模式:
python main.py input.xlsx(Linux/Mac 推荐) - 自动回退:无 GUI 环境自动切换至命令行模式
技术实现
| 模块 | 代码量 | 说明 |
|---|---|---|
xls_reader.py |
~400 行 | BIFF8 OLE2 解析引擎,支持 SST/LABELSST/NUMBER/FORMULA/RK/MULRK/LABEL |
xlsx_reader.py |
~80 行 | ZIP + XML 解析,支持共享字符串表 |
xlsx_writer.py |
~120 行 | OOXML 构建,生成标准 .xlsx 文件 |
pinmap_parser.py |
~100 行 | 方形边界检测 + 四边引脚提取 |
validator.py |
~60 行 | 连续性/唯一性/完整性验证 |
pinlist_generator.py |
~40 行 | PinList 生成 + NC 默认值 |
file_selector.py |
~35 行 | tkinter 对话框 + 命令行回退 |
main.py |
~60 行 | 流程编排 + 异常处理 |
models.py |
~40 行 | 数据模型定义 |
utils.py |
~35 行 | 坐标转换工具 |
总代码量:约 1000 行(不含注释和空行)
第三方依赖:0
测试覆盖
单元测试(8 个用例)
| 用例 | 测试内容 | 结果 |
|---|---|---|
test_4x4_parse |
4×4 方形 PinMAP 解析 | ✅ |
test_4x4_validate |
4×4 方形验证 | ✅ |
test_missing_names_warning |
PinName 缺失警告 | ✅ |
test_duplicate_numbers |
序号重复检测 | ✅ |
test_gap_in_numbers |
序号不连续检测 | ✅ |
test_empty_cells |
空单元格处理 | ✅ |
test_no_pins |
无引脚数据检测 | ✅ |
test_12pin_square |
12 引脚方形解析 | ✅ |
集成测试(6 个用例)
| 用例 | 输入文件 | 测试内容 | 结果 |
|---|---|---|---|
| TC001 | sample_4x4.xlsx |
标准 4×4 转换(8 Pin) | ✅ |
| TC002 | sample_rect.xlsx |
长方形转换(13 Pin) | ✅ |
| TC003 | error_gap.xlsx |
序号不连续检测 | ✅ |
| TC004 | error_dup.xlsx |
序号重复检测 | ✅ |
| TC005 | warning_missing.xlsx |
PinName 缺失警告 | ✅ |
| TC006 | error_empty_a1.xlsx |
A1 为空检测 | ✅ |
测试通过率:100%(14/14)
已知问题
| # | 问题 | 严重性 | 说明 |
|---|---|---|---|
| K1 | XLS 读取缺乏真实样本验证 | 中 | 当前测试环境无 .xls 格式测试文件,BIFF8 引擎尚未在真实 .xls 文件上验证 |
| K2 | 无字体/格式保留 | 低 | 输出文件不保留原始 Excel 的字体、颜色、边框等格式信息 |
| K3 | 仅支持 sheet1 | 低 | 仅读取 Excel 文件的第一个工作表 |
| K4 | Linux 无头环境无 GUI | 低 | 无显示器环境下 tkinter 不可用,需使用命令行模式 |
限制
| 限制项 | 说明 |
|---|---|
| 引脚数量 | 建议 < 1000 引脚(典型封装 < 200 引脚,无压力) |
| 输入格式 | 仅支持 .xls 和 .xlsx,不支持 CSV/其他格式 |
| 输出格式 | 仅输出 .xlsx,不支持 .xls |
| 工作表 | 仅处理第一个工作表 |
| 公式单元格 | 仅读取公式的计算结果,不保留公式本身 |
未来计划
v1.1.0 — 格式增强(规划中)
- 支持
.xls格式输出 - 保留原始 Excel 的字体和格式
- 支持多工作表选择
v1.2.0 — 功能扩展(规划中)
- 批量转换(拖拽多个文件)
- CSV 格式输出
- PinMAP 结构可视化预览
v2.0.0 — 架构升级(远期规划)
- 支持更多封装类型(BGA、QFN 等)
- 插件式解析器架构
- Web 界面
升级指南
首次使用:直接运行即可,无需升级。
从测试版升级:替换 Code/src/ 目录下所有文件。
贡献者
- 架构设计:Script Architect
- 编码实现:Coding Agent × 3
- 测试验证:QA Agent
- 文档编写:Doc Gen Agent
获取帮助
- 查看
QUICKSTART.md了解使用方法 - 查看
architecture-design.md了解技术细节 - 查看
Test/test_report.md了解测试详情