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二次開發CreateDialog函數在UI.hxx文件和WinUser.h中的沖突【轉載】

https://www.cnblogs.com/nxopen2018/p/11811708.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM