如何将 CAD 图纸信息导出到 Excel 表格?

一、实现思路

  1. 连接已打开的AutoCAD 2025图纸;
  2. 遍历图纸中指定类型的对象(比如直线、圆、文字、块参照等);
  3. 提取对象的关键属性(如坐标、长度、半径、文字内容、图层等);
  4. 将提取的信息整理成结构化数据,写入Excel表格;
  5. 异常处理:避免因图纸无对象、CAD未启动等情况导致程序崩溃。

二、前置条件

  1. 确保已安装Python 3.9+(CAD2025推荐3.10);
  2. 安装所需Python库:
    # 连接CAD的库
    pip install pyautocad
    # 操作Excel的库(xlsxwriter生成格式更美观的xlsx文件)
    pip install xlsxwriter
    # 辅助处理CAD坐标的库
    pip install comtypes
    
  3. 提前打开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)

四、代码关键说明

  1. 对象类型识别:通过obj.ObjectName判断CAD对象类型(直线=AcDbLine、圆=AcDbCircle、文字=AcDbText),你可以根据需要添加其他类型(如块参照=AcDbBlockReference、多段线=AcDbPolyline);
  2. 属性提取
    • 直线:起点/终点坐标、长度、图层、颜色;
    • 圆:圆心坐标、半径、周长、面积;
    • 文字:插入点、内容、高度;
  3. Excel格式化:用xlsxwriter分工作表存储不同类型对象,数据保留2位小数,便于阅读;
  4. 异常处理:单个对象处理失败不会导致整个程序崩溃,同时给出明确的错误提示。

五、扩展与定制(根据你的需求调整)

如果想导出其他信息,只需在代码中添加对应逻辑:

  • 导出多段线:新增elif obj_name == "AcDbPolyline",提取obj.NumberOfVertices(顶点数)、obj.Length(长度)等;
  • 导出块参照:新增elif obj_name == "AcDbBlockReference",提取obj.Name(块名)、obj.InsertionPoint(插入点)等;
  • 只导出指定图层:在处理对象时添加判断if obj.Layer == "你要的图层名":
  • 导出标注尺寸:标注对象类型为AcDbDimension,可提取obj.TextOverride(标注文字)、obj.DimensionLinePosition(尺寸线位置)等。

总结

  1. 核心流程:连接CAD → 遍历对象 → 提取属性 → 写入Excel,Python的pyautocad+xlsxwriter是实现该需求的高效组合;
  2. 代码可直接运行,只需修改excel_save_path为自己的保存路径,且兼容AutoCAD 2025;
  3. 可根据需要扩展对象类型和提取的属性,异常处理机制保证了程序的稳定性。
posted @ 2026-01-13 13:15  恰逢其时2008  阅读(0)  评论(0)    收藏  举报