CAD 表格提取导出 Excel
Overview
从 CAD 图纸(DWG/DXF)中自动识别由文本 + 线条构成的表格,按坐标重建行列结构,还原特殊字符,导出为多 sheet 的 Excel 文件。核心是几何聚类,而非 OCR:靠竖线定位列、横线定位行、文本坐标归位单元格。
何时使用
- 用户给出 .dxf / .dwg 文件,要求"导出里面的表格""把表转成 Excel""提取图上的表"。
- 图纸中的表格是 CAD 原生表格(TEXT/MTEXT + LINE 边框),而非扫描图片。
- 若表格是扫描/图片形式,本技能不适用,需走 OCR 路线。
环境与依赖
- Python:
C:\Users\ZJ\.workbuddy\binaries\python\envs\default\Scripts\python.exe(隔离 venv)。 - 依赖
ezdxf、openpyxl,通常已装;缺则pip install ezdxf openpyxl。 - 若输入是
.dwg(非 ASCII 的 DXF),先用 cad-viewer 技能或 ODA/ezdxf 转成.dxf再处理。
工作流
1. 先跑自动提取
cd "C:\Users\ZJ\.workbuddy\skills\cad-table-extract"
"C:\Users\ZJ\.workbuddy\binaries\python\envs\default\Scripts\python.exe" \
scripts/extract_tables.py "C:\path\to\drawing.dxf" "C:\path\to\output.xlsx"
脚本会自动:识别表格带(上下排列的多表)→ 按 x 大间隙分割(左右排列的多表)→ 推导行列边界 → 文本归位 → 生成多 sheet Excel。终端会打印每张表的行列数与提示。
2. 结果错位时用诊断工具定位
"C:\Users\ZJ\.workbuddy\binaries\python\envs\default\Scripts\python.exe" \
scripts/dump_texts.py "C:\path\to\drawing.dxf" --lines
dump 全部文本的 x/y/字号/对齐 与全部 LINE 端点,据此判断每张表的真实列边界(竖线 x)与行边界(横线 y)。若自动推导仍不准,在脚本内按实际坐标硬编码 col_edges / 表带 x 范围(参照本技能此前处理"洁净手术室参数表"三个左右排列表的做法)。
3. 验证输出
用 openpyxl 读回 Excel,打印每个 sheet 的前几行,核对:表头多级结构、单位行、特殊符号、行/列归属。多级表头(如"夏季/冬季"分组、上下拼接的单位)通常需要手动合并单元格,在脚本里用 merge_cells 补。
已知坑(务必人工核对)
- ≤/≥ 错位:CAD 的 SHX 字体里 ≥ 与 ≤ 在字符表位置相邻,导出 DXF 后可能互相错位。导出后按业务逻辑判断,例如"最厚保温档对应最大管径"应为 ≥ 而非 ≤。必要时在脚本加后处理强制纠正。
- 特殊字符:
%%D→°、%%C→∅、%%P→±、%%DC→℃、%%%→%、m2/m3→²/³。脚本已内置fix(),若字体特殊可调整。 - MTEXT 多行:MTEXT 的
\P换行与格式码需清理,脚本已处理,但复杂 MTEXT 表格建议先 dump 核对。 - 无框线表格:若表格只有文本没有 LINE 边框,几何聚类失效,需退化为按文本 y/x 聚类(
cluster_ys思路),参照dump_texts.py输出手工建边界。
脚本清单
scripts/extract_tables.py— 自动提取主脚本(通用,坐标聚类)。scripts/dump_texts.py— 诊断工具,dump 文本坐标与线条端点。
Scan to join WeChat group