如何将 CAD 图纸信息导出到 Excel 表格?
一、实现思路
- 连接已打开的AutoCAD 2025图纸;
- 遍历图纸中指定类型的对象(比如直线、圆、文字、块参照等);
- 提取对象的关键属性(如坐标、长度、半径、文字内容、图层等);
- 将提取的信息整理成结构化数据,写入Excel表格;
- 异常处理:避免因图纸无对象、CAD未启动等情况导致程序崩溃。
二、前置条件
- 确保已安装Python 3.9+(CAD2025推荐3.10);
- 安装所需Python库:
# 连接CAD的库 pip install pyautocad # 操作Excel的库(xlsxwriter生成格式更美观的xlsx文件) pip install xlsxwriter # 辅助处理CAD坐标的库 pip install comtypes - 提前打开AutoCAD 2025,并打开需要导出信息的图纸。
三、完整代码(导出直线、圆、文字对象到Excel)
import win32com.client # pyautocad依赖的底层库
from pyautocad import Autocad, APoint
import xlsxwriter
import os
def export_cad_to_excel(save_path):
"""
将CAD图纸中的直线、圆、文字对象信息导出到Excel
:param save_path: Excel文件保存路径(如"D:/cad_export.xlsx")
"""
try:
# 1. 连接到已运行的AutoCAD 2025
acad = Autocad(create_if_not_exists=False)
print(f"✅ 成功连接到AutoCAD: {acad.name}")
# 2. 获取CAD模型空间的所有对象
model_space = acad.model
obj_count = model_space.Count
if obj_count == 0:
print("⚠️ 当前图纸模型空间无任何对象!")
return
# 3. 创建Excel文件并初始化工作表
workbook = xlsxwriter.Workbook(save_path)
# 分别创建直线、圆、文字的工作表
ws_line = workbook.add_worksheet("直线信息")
ws_circle = workbook.add_worksheet("圆信息")
ws_text = workbook.add_worksheet("文字信息")
# 4. 写入表头
# 直线表头:ID、起点X/Y/Z、终点X/Y/Z、长度、图层、颜色
line_headers = ["对象ID", "起点X", "起点Y", "起点Z", "终点X", "终点Y", "终点Z", "长度", "图层", "颜色"]
# 圆表头:ID、圆心X/Y/Z、半径、周长、面积、图层、颜色
circle_headers = ["对象ID", "圆心X", "圆心Y", "圆心Z", "半径", "周长", "面积", "图层", "颜色"]
# 文字表头:ID、插入点X/Y/Z、文字内容、高度、图层、颜色
text_headers = ["对象ID", "插入点X", "插入点Y", "插入点Z", "文字内容", "高度", "图层", "颜色"]
# 写入表头到对应工作表(第一行)
for col, header in enumerate(line_headers):
ws_line.write(0, col, header)
for col, header in enumerate(circle_headers):
ws_circle.write(0, col, header)
for col, header in enumerate(text_headers):
ws_text.write(0, col, header)
# 5. 遍历CAD对象,提取信息并写入Excel
line_row = 1 # 直线数据从第二行开始写
circle_row = 1 # 圆数据从第二行开始写
text_row = 1 # 文字数据从第二行开始写
for i in range(obj_count):
try:
obj = model_space.Item(i)
obj_name = obj.ObjectName # 获取对象类型
# 提取公共属性:ID、图层、颜色
obj_id = obj.ObjectID
obj_layer = obj.Layer
obj_color = obj.Color
# 处理直线对象 (AcDbLine)
if obj_name == "AcDbLine":
# 提取直线坐标和长度
start = obj.StartPoint
end = obj.EndPoint
length = obj.Length
# 写入Excel
ws_line.write(line_row, 0, obj_id)
ws_line.write(line_row, 1, round(start[0], 2)) # 保留2位小数
ws_line.write(line_row, 2, round(start[1], 2))
ws_line.write(line_row, 3, round(start[2], 2))
ws_line.write(line_row, 4, round(end[0], 2))
ws_line.write(line_row, 5, round(end[1], 2))
ws_line.write(line_row, 6, round(end[2], 2))
ws_line.write(line_row, 7, round(length, 2))
ws_line.write(line_row, 8, obj_layer)
ws_line.write(line_row, 9, obj_color)
line_row += 1
# 处理圆对象 (AcDbCircle)
elif obj_name == "AcDbCircle":
# 提取圆心、半径、周长、面积
center = obj.Center
radius = obj.Radius
perimeter = 2 * 3.1415926 * radius
area = 3.1415926 * radius * radius
# 写入Excel
ws_circle.write(circle_row, 0, obj_id)
ws_circle.write(circle_row, 1, round(center[0], 2))
ws_circle.write(circle_row, 2, round(center[1], 2))
ws_circle.write(circle_row, 3, round(center[2], 2))
ws_circle.write(circle_row, 4, round(radius, 2))
ws_circle.write(circle_row, 5, round(perimeter, 2))
ws_circle.write(circle_row, 6, round(area, 2))
ws_circle.write(circle_row, 7, obj_layer)
ws_circle.write(circle_row, 8, obj_color)
circle_row += 1
# 处理文字对象 (AcDbText)
elif obj_name == "AcDbText":
# 提取插入点、文字内容、高度
insert_point = obj.InsertionPoint
text_content = obj.TextString
text_height = obj.Height
# 写入Excel
ws_text.write(text_row, 0, obj_id)
ws_text.write(text_row, 1, round(insert_point[0], 2))
ws_text.write(text_row, 2, round(insert_point[1], 2))
ws_text.write(text_row, 3, round(insert_point[2], 2))
ws_text.write(text_row, 4, text_content)
ws_text.write(text_row, 5, round(text_height, 2))
ws_text.write(text_row, 6, obj_layer)
ws_text.write(text_row, 7, obj_color)
text_row += 1
except Exception as e:
print(f"⚠️ 处理第{i}个对象时出错: {str(e)}")
continue
# 关闭Excel工作簿
workbook.close()
print(f"✅ 导出完成!Excel文件保存路径:{save_path}")
print(f" - 直线数量:{line_row - 1}")
print(f" - 圆数量:{circle_row - 1}")
print(f" - 文字数量:{text_row - 1}")
except Exception as e:
print(f"❌ 程序执行失败:{str(e)}")
print(" 请检查:1. AutoCAD 2025是否已启动并打开图纸;2. 保存路径是否合法;3. 依赖库是否安装完整")
# ===================== 执行导出 =====================
if __name__ == "__main__":
# 自定义Excel保存路径(建议用绝对路径,避免中文/特殊字符)
excel_save_path = "D:/CAD图纸信息导出.xlsx"
# 调用导出函数
export_cad_to_excel(excel_save_path)
四、代码关键说明
- 对象类型识别:通过
obj.ObjectName判断CAD对象类型(直线=AcDbLine、圆=AcDbCircle、文字=AcDbText),你可以根据需要添加其他类型(如块参照=AcDbBlockReference、多段线=AcDbPolyline); - 属性提取:
- 直线:起点/终点坐标、长度、图层、颜色;
- 圆:圆心坐标、半径、周长、面积;
- 文字:插入点、内容、高度;
- Excel格式化:用
xlsxwriter分工作表存储不同类型对象,数据保留2位小数,便于阅读; - 异常处理:单个对象处理失败不会导致整个程序崩溃,同时给出明确的错误提示。
五、扩展与定制(根据你的需求调整)
如果想导出其他信息,只需在代码中添加对应逻辑:
- 导出多段线:新增
elif obj_name == "AcDbPolyline",提取obj.NumberOfVertices(顶点数)、obj.Length(长度)等; - 导出块参照:新增
elif obj_name == "AcDbBlockReference",提取obj.Name(块名)、obj.InsertionPoint(插入点)等; - 只导出指定图层:在处理对象时添加判断
if obj.Layer == "你要的图层名":; - 导出标注尺寸:标注对象类型为
AcDbDimension,可提取obj.TextOverride(标注文字)、obj.DimensionLinePosition(尺寸线位置)等。
总结
- 核心流程:连接CAD → 遍历对象 → 提取属性 → 写入Excel,Python的
pyautocad+xlsxwriter是实现该需求的高效组合; - 代码可直接运行,只需修改
excel_save_path为自己的保存路径,且兼容AutoCAD 2025; - 可根据需要扩展对象类型和提取的属性,异常处理机制保证了程序的稳定性。

浙公网安备 33010602011771号