feat: ExcelParser 基础(workbook/sheet 读取 + source_uri)

This commit is contained in:
lhl
2026-08-08 16:50:24 +08:00
parent 35d845fd21
commit df9427c76e
5 changed files with 68 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
from openpyxl import Workbook
def new_workbook(sheets: dict[str, list[list]]) -> Workbook:
"""生成临时 Workbookkey=Sheet 名,value=gridcell 值)。"""
wb = Workbook()
wb.remove(wb.active)
for name, grid in sheets.items():
ws = wb.create_sheet(name)
for r, row in enumerate(grid, start=1):
for c, value in enumerate(row, start=1):
ws.cell(row=r, column=c, value=value)
return wb
def save_workbook(tmp_path, wb: Workbook) -> str:
"""落盘到 tmp_path 并返回路径字符串。"""
path = tmp_path / "source.xlsx"
wb.save(path)
return str(path)
+24
View File
@@ -0,0 +1,24 @@
import pytest
from genesis.parsers.excel_reader import open_workbook, sheet_matrix
from genesis.parsers.provenance import build_source_uri
from tests.excel_helpers import new_workbook, save_workbook
def test_build_source_uri_format():
assert build_source_uri("要求.xlsx", "機能一覧", "A5") == "要求.xlsx#機能一覧!A5"
def test_open_workbook_and_sheet_matrix(tmp_path):
wb = new_workbook({"機能一覧": [["機能ID", "機能名"], ["F001", "社員登録"]]})
path = save_workbook(tmp_path, wb)
ws = open_workbook(path)["機能一覧"]
assert sheet_matrix(ws) == [["機能ID", "機能名"], ["F001", "社員登録"]]
def test_open_workbook_rejects_xls(tmp_path):
bad = tmp_path / "old.xls"
bad.write_bytes(b"not really xls")
with pytest.raises(ValueError):
open_workbook(bad)