NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))

在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article/details/88922030 这篇博客,要不然你听不懂我下面在说什么。

版本NX11+VS2013+office2016

首先我们通过NX开发向导创建了一个模板。

先把项目属性改成多字节。
下面我们把前面做的MFC项目里的几个EXCAL头文件和stdafx一块拷过来,加到NX的项目里。

在NX的CPP里加上#include "stdafx.h"头文件

编译出现如下问题,把stdafx.h"头文件里的//#include "targetver.h"注释掉,在编译。

出现 warning C4003: “CreateDialogW”宏的实参不足,双击报错问题,跳转到对应代码位置。
把CreateDialog前加_下划线。(不要问我为什么这么做,我解释不出来),反正你在编译就通过了。同时也不当误用Block UI

到这里这个操作EXCAL的项目搭建就完事了。
去自己定义的回调函数里,直接写操作EXCAL的代码就行了。
下面是打开EXCAL,读取内容的一个简单例子。写在模板的do_it里

  1     LPDISPATCH lpDisp;
  2     COleVariant vResult;
  3     COleVariant
  4         covTrue((short)TRUE),
  5         covFalse((short)FALSE),
  6         covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  7
  8     if (!App.CreateDispatch("Excel.Application"))
  9     {
 10         uc1601("创建Excel实例失败", 1);
 11     }
 12
 13
 14     App.put_Visible(TRUE);          //使Excel可见
 15     App.put_UserControl(TRUE);
 16     App.put_DisplayAlerts(false);
 17
 18     Books.AttachDispatch(App.get_Workbooks());
 19
 20
 21     //打开EXCAL
 22     lpDisp = Books.Open("D:\\ABC.xlsx", covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,
 23         covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
 24     Book.AttachDispatch(lpDisp);
 25
 26
 27     //得到Worksheets
 28     lpDisp = Book.get_Worksheets();
 29     sheets.AttachDispatch(lpDisp);
 30
 31     //获得Sheet的数量
 32     int count = sheets.get_Count();
 33
 34     for (int k = 1; k <= count; k++)
 35     {
 36         _variant_t var = (long)k;
 37         sheet.AttachDispatch(sheets.get_Item(var));
 38
 39         if (sheet.get_Name() == "DEF")
 40         {
 41             sheet.Activate();
 42
 43             //获得活动的WorkSheet(工作表)
 44             sheet.AttachDispatch(Book.get_ActiveSheet(), TRUE);
 45
 46             //获得使用的区域Range(区域)
 47             range.AttachDispatch(sheet.get_UsedRange(), TRUE);
 48
 49             //获得使用的行数
 50             long lgUsedRowNum = 0;
 51             range.AttachDispatch(range.get_Rows(), TRUE);
 52             lgUsedRowNum = range.get_Count();
 53
 54             //获得使用的列数
 55             long lgUsedColumnNum = 0;
 56             range.AttachDispatch(range.get_Columns(), TRUE);
 57             lgUsedColumnNum = range.get_Count();
 58
 59             //读取Sheet名称
 60             CString strSheetName = sheet.get_Name();
 61
 62             //得到全部Cells,此时,userRange是cells的集合
 63             range.AttachDispatch(sheet.get_Cells(), TRUE);
 64
 65
 66             //遍历整个Excel表格
 67             double Date1;
 68             CString str1;
 69             for (int j = 1; j <= lgUsedRowNum; j++)
 70             {
 71                 for (int i = 1; i <= lgUsedColumnNum; i++)
 72                 {
 73                     CString str;
 74                     str.Format("%c%d", 65 + i - 1, j);
 75                     lpDisp = range.get_Range(COleVariant(str), COleVariant(str));
 76
 77                     CRange range;
 78                     range.AttachDispatch(lpDisp);
 79
 80                     VARIANT vl = range.get_Value2();
 81
 82
 83                     if (vl.vt == VT_R8)       //8字节的数字
 84                     {
 85
 86                         Date1 = vl.dblVal;
 87                         char msg[256];
 88                         sprintf_s(msg, "%f", Date1);
 89
 90                         uc1601(msg, 1);
 91                     }
 92
 93                     if (vl.vt == VT_BSTR)       //字符串
 94                     {
 95
 96                         str1 = vl.bstrVal;
 97
 98                         uc1601(str1, 1);
 99
100                     }
101                 }
102
103             }
104
105         }
106     }
107
108
109
110     //释放对象,关闭EXCEL
111     //range.ReleaseDispatch();
112     //sheet.ReleaseDispatch();
113     //sheets.ReleaseDispatch();
114     //Book.Close(covOptional, covOptional, covOptional);
115     //Book.ReleaseDispatch();
116     //Books.Close();
117     //Books.ReleaseDispatch();
118     //App.Quit();
119     //App.ReleaseDispatch();

更多关于EXCAL操作代码,请大家看NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://www.cnblogs.com/nxopen2018/p/10981416.html 这篇文章,介绍的比较多。当前这个文章主要还是介绍怎么去搭建NX开发操作EXCAL的环境,用NX UI界面的项目,环境也是这样搭建的。

原文地址:https://www.cnblogs.com/nxopen2018/p/10981433.html

时间: 2024-10-09 19:45:29

NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))的相关文章

NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的方法,无论C++还是C#还是VB方式思路都是一样的.先介绍用MFC去做,然后在写一篇博客介绍怎么在NX的二次开发的向导模板里去做.NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article

轻松完成excel读写操作- 基于POI的框架BingExcel的使用(1)

Bingexcel User Guide 使用maven进行项目开发目前项目的maven仓库是在github上,浏览地址为 https://github.com/bingyulei007/mvn-repo/tree/master/repository/com/bing/excel,在使用时候,你只要加上一下远程仓库: <repositories> <repository> <id>bingyulei-mvn-repo</id> <url>http

Visual Stadio 与NX二次开发的环境配置(以VS2010、NX10.0为例)

问题描述: 许多博文发布了关于Visual Stadio 与NX二次开发的环境配置,这些博文的提示事修改了文件NX10_Open.vsz中的引擎为10.0,但实际结果是创建C++引导失败. 问题解决概述: 创建正确引导应该同时修改NX10_Open.vsz与NX10_NXOpenCPP.vsz两个文件的引擎版本号. 解决步骤: 将NX10.0 UGOPEN目录下的所有文件夹(VB.VC.VC#)复制,并粘贴到Visual Stadio 2010安装目录下与对应的文件夹合并即可(覆盖). 例如,将

NX二次开发-NX+VS写代码设断点调试技巧

在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对.2.VS设断点-添加进程调试,来看输入输出值对不对3.UF_CALL也就是UF_get_fail_message这个函数,来看函数自己用的对不对.4.查看NX-Help-LogFile(日志),拖到最后看提示了哪些错误. 我一般用的比较多的是设断点调试,这里先说设断点调试.其他方法改天再写. 写举一

NX二次开发-UFUN和NXOpen结合开发中Tag_t对象与TaggedObject对象转换方法

1 本文通过举四个例子来告诉大家在NX二次开发过程中会经常用到UFUN和NXOpen结合去开发,在UFUN中我们得到的是Tag_t对象,在NXOpen中得到的是TaggedObject对象,这两个是需要进行转换的.本文主要知识点为:TaggedObject->tag_t() , NXOpen::NXObjectManager::Get(BodyTag1) , feature1->JournalIdentifier()的用法. 2 3 NX11+VS2013 4 5 #include <u

NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用

关于 在Block UI中UF_initialize();和UF_terminate();的使用 1 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize();和UF_terminate();. 2 可以直接加在CPP里这个位置: 3 4 extern "C" DllExport void ufusr(char *param, int *retcod, int param_len) 5 { 6 TwoPointCyl *theTwoPoin

NX二次开发-移动WCS坐标系

说明:移动WCS坐标系 用法: #include <uf.h> #include <uf_csys.h> extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); //移动WCS,到点 couCsysOrigin2 double couCsysOrigin2[3] = { 10,10,10 }; //获取当前WCS标识 tag_t tagWCS = NULL_TAG;

NX二次开发-获取指定矩阵标识的矩阵值

函数:UF_CSYS_ask_matrix_values () 函数说明:获取指定矩阵标识的矩阵值. 用法: #include <uf.h> #include <uf_csys.h> extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); //获取WCS标识 tag_t tagWCS = NULL_TAG; UF_CSYS_ask_wcs(&tagWCS);

NX二次开发-通过3x3矩阵获取XYZ轴矢量

函数:UF_CSYS_ask_wcs() 函数说明:通过3x3矩阵获取XYZ轴矢量 用法: 1 #include <uf.h> 2 #include <uf_mtx.h> 3 extern DllExport void ufusr(char *param, int *returnCode, int rlen) 4 { 5 UF_initialize(); 6 7 double douMatrixValues[9] = {1,0,0,0,1,0,0,0,1}; 8 double dV