在看这个博客前,请读者先去完整看完: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界面的项目,环境也是这样搭建的。