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

Posted nxopen2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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界面的项目,环境也是这样搭建的。

以上是关于NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))的主要内容,如果未能解决你的问题,请参考以下文章

nx二次开发外部库出错怎么解决

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

UG NX二次开发(C#)--详细讲述编程模板NXOpen_CS_Wizard的代码意义,帮你轻松进入NXOpen(C#)二次开发

NX二次开发-基于OpenCV图像处理的开发(将彩色图片变为灰色)

NX二次开发-UFUN结合NXOPEN开发_常用代码模板

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