按照excel文档中的内容在当前cad图纸中自动排布实体

本例实现的主要功能是读取excel文档中的内容,其次是将按照读取的信息在当前cad图纸中添加相应的实体。下面先介绍实现代码:

    CString excelPath; //外部excel文档的地址
    UpdateData();//将对话框中的数据复制给变量
    if (m_excelPath == _T(""))
    { 
        MessageBox(_T("地址不能为空,请选择Excel文档!"));
        return;
    }
    else
    {
        excelPath = m_excelPath;//m_excelPath是与地址对话框绑定的变量
    }

    //设置基点,作为自动排布的所有实体的基点
    AcGePoint3d ptBase;
    ptBase.x = m_pointX;
    ptBase.y = m_pointY;
    ptBase.z = m_pointZ;
    
    //打开指定的Excel文档
    CoInitialize(NULL);//初始化
    if (!m_excel.pApp.CreateDispatch(_T("Excel.Application")))
    {
        MessageBox(_T("创建Excel服务失败!"));
        exit(1);
    }
    m_excel.pApp.put_Visible(FALSE);
    m_excel.pBooks.AttachDispatch(m_excel.pApp.get_Workbooks(), true);
    m_excel.pBook.AttachDispatch(m_excel.pBooks.Open(excelPath, vtMissing, vtMissing, vtMissing,
        vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
        vtMissing, vtMissing, vtMissing));
    m_excel.pSheets.AttachDispatch(m_excel.pBook.get_Worksheets(), true);
    m_excel.pSheet.AttachDispatch(m_excel.pSheets.get_Item(_variant_t("sheet1")), true);
    m_excel.pRange.AttachDispatch(m_excel.pSheet.get_Cells(), true);

    //获得Excel文档中已经使用的行数和列数
    m_excel.pRange = m_excel.pSheet.get_UsedRange();//获得列数
    m_excel.pRange = m_excel.pRange.get_Columns(); 
    int colNum = m_excel.pRange.get_Count();

    m_excel.pRange = m_excel.pSheet.get_UsedRange();//获得行数
    m_excel.pRange = m_excel.pRange.get_Rows();
    int RowNum = m_excel.pRange.get_Count();

    //读取Excel中指定单元的数据
    for (int i = 2; i <= RowNum; i++)
    {
        CString ptX = m_excel.GetCString(4, i);
        CString ptY = m_excel.GetCString(5, i);
        CString ptZ = m_excel.GetCString(6, i);
        CString rad = m_excel.GetCString(7, i);
        
        //按照excel文档中的数据转化成中心点
        AcGePoint3d ptExcel;
        ptExcel = strToDouble(ptX, ptY, ptZ);//将字符串型数据转换成双精度型,其中strToDouble()函数是自己所写,这里就不另外给出
        double raduis ;
        raduis = strToDouble(rad);//将字符串型rad转换成双精度型

        //根据Excel中的图形类型,在模型空间添加相应的实体
        CString grapfType = m_excel.GetCString(2,i);
        if (grapfType == _T(""))
        {
            //根据选择的基点设定圆的中心点
            AcGePoint3d ptCenter;
            ptCenter.x = ptExcel.x + ptBase.x;
            ptCenter.y = ptExcel.y + ptBase.y;
            ptCenter.z = ptExcel.z + ptBase.z;
            AcGeVector3d vec(0,0,1);
            //定义实体圆
            AcDbCircle *pCir = new AcDbCircle(ptCenter, vec, raduis);
            PostToModelSpace(pCir);
        }
        if (grapfType == _T("直线"))
        {
            CString endPointX = m_excel.GetCString(8, i);
            CString endPointY = m_excel.GetCString(9, i);
            CString endPointZ = m_excel.GetCString(10, i);
            AcGePoint3d ptMid = strToDouble(endPointX, endPointY, endPointZ);
            //按照选择的基点设置起点和终点
            AcGePoint3d startPoint;//起点
            startPoint.x = ptExcel.x + ptBase.x;
            startPoint.y = ptExcel.y + ptBase.y;
            startPoint.z = ptExcel.z + ptBase.z;
            AcGePoint3d endPoint;//终点
            endPoint.x = ptMid.x + ptBase.x;
            endPoint.y = ptMid.y + ptBase.y;
            endPoint.z = ptMid.z + ptBase.z;

            //将直线添加到模型空间
            AcDbLine *pLine = new AcDbLine(startPoint, endPoint);
            PostToModelSpace(pLine);
        }
    }
    //完成所有操作后一定要清除掉excel文档相关的内容
    m_excel.pRange.ReleaseDispatch();
    m_excel.pSheet.ReleaseDispatch();
    m_excel.pSheets.ReleaseDispatch();
    m_excel.pBook.ReleaseDispatch();
    m_excel.pBooks.ReleaseDispatch();
    m_excel.pApp.Quit();
    m_excel.pApp.ReleaseDispatch();    

这里只是一个简单的例子,对于excel文档的读取基本操作都有涉及到。

原文地址:https://www.cnblogs.com/pengjun-shanghai/p/4897920.html