在看這個博客前,請讀者先去完整看完: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二次開發CreateDialog函數在UI.hxx文件和WinUser.h中的沖突【轉載】
https://www.cnblogs.com/nxopen2018/p/11811708.html