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/details/88922238 (再看這篇博客前,先把當前博客看完。)
版本:VS2013 office2016

 

圖片轉載自https://blog.csdn.net/xiaoxiangyuan123456/article/details/70941588, 感謝博主。

  • EXCAL操作(一)打開寫入

參考例子:https://blog.csdn.net/ywx123_/article/details/77074038
這是另一個CSDN博主寫的,我也是參考他的例子去做的,再此感謝這位博主。

新建一個MFC項目

點擊下一步

選擇基於對話框

直接點完成,進來后如下圖

先點項目,右鍵屬性,更改為多字節。

先什么都不動,編譯一下代碼。默認看能不能通過。
然后點項目,右鍵類向導。

彈出窗口如下

點擊添加類-類型庫中的MFC類

彈出如下

我們切換到文件,點擊添加。

此處添加要找到的文件就是你電腦上裝的EXCAL.exe這個程序文件。
如果你不知道怎么找到的話,有一個方法,先去開始菜單找到你的EXCAL快捷方式,然后在點右鍵,打開文件所在的位置。

這樣就找到了。

下面在回到MFC項目里面,我們選中這個文件。
添加進來之后,如圖所示。

左側為EXCAL給出的接口,我們來選擇一些需要的添加進來。
我們就先添加這七個,后續有其他需求在添加其他的。(先在左側接口里選中一個,點中間的>就能添加到右側里生成的類里,不想要就在點中間的<撤退回去。)

然后我們點完成,點確定。就看到頭文件自動添加進來了。

我們點擊新增進來的EXCAL每個頭文件,都把第一行的那句注釋掉。

都注釋完之后,我們在#include "stdafx.h"里添加EXCAL頭文件,

然后編譯代碼,出現如下報錯問題。這時我們雙擊這個錯誤,跳到對應的代碼那里。

有問題的位置如下

我們需要在DialogBox前面加上一個 _ 下划線。再去編譯就通過了。別問我為什么,我答不上來,你照着搞就是了,別人就是這么搞的。

好的,到這里我們這個項目環境就算搭建完成了。
下面可以寫代碼了。
點擊MFC那個對話框界面,雙擊確定。在里面寫代碼。

代碼如下:打開EXCAL,寫入內容。

  1     //1.創建基本對象
  2     CApplication App;  //創建應用程序實例
  3     CWorkbooks Books;  //工作簿,多個Excel文件
  4     CWorkbook Book;    //單個工作簿
  5     CWorksheets sheets;//多個sheet頁面
  6     CWorksheet sheet;  //單個sheet頁面
  7     CRange range;      //操作單元格
  8     //2.打開指定Excel文件,如果不存在就創建
  9     char path[MAX_PATH];
 10     GetCurrentDirectory(MAX_PATH, (TCHAR*)path);//獲取當前路徑
 11     CString strExcelFile = (TCHAR*)path;
 12     CString strdevName = _T("\\Test.xlsx");    //xls也行
 13     strExcelFile += strdevName;
 14     COleVariant
 15         covTrue((short)TRUE),
 16         covFalse((short)FALSE),
 17         covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
 18 
 19     LPDISPATCH lpdisp = NULL;
 20     //1.創建Excel實例
 21     if (!App.CreateDispatch(_T("Excel.Application"), NULL))
 22     {
 23         AfxMessageBox(_T("創建Excel實例失敗"));
 24         exit(-1);
 25     }
 26     else
 27     {
 28         AfxMessageBox(_T("創建成功"));
 29     }
 30     App.put_Visible(TRUE);  //打開Excel
 31     App.put_UserControl(FALSE);
 32     //2. 得到workbooks容器
 33     Books.AttachDispatch(App.get_Workbooks());
 34     Book.AttachDispatch(Books.Add(covOptional));
 35     sheets.AttachDispatch(Book.get_Worksheets());
 36     sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1)));   //獲取sheet1
 37     sheet.put_Name(_T("TestName"));     //設置sheet1名字
 38 
 39     //3. 加載要合並的單元格
 40     range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);
 41     range.Merge(COleVariant((long)0));  //合並單元格
 42 
 43     //4. 設置表格內容
 44     range.AttachDispatch(sheet.get_Cells(), TRUE);               //加載所有單元格
 45     range.put_Item(COleVariant((long)2), COleVariant((long)2), COleVariant(_T("電氣工程及其自動化課程統計")));
 46     range.put_Item(COleVariant((long)3), COleVariant((long)2), COleVariant(_T("課程名稱")));
 47     range.put_Item(COleVariant((long)3), COleVariant((long)3), COleVariant(_T("課時")));
 48     range.put_Item(COleVariant((long)3), COleVariant((long)4), COleVariant(_T("難度")));
 49     range.put_Item(COleVariant((long)3), COleVariant((long)5), COleVariant(_T("教學方式")));
 50 
 51     range.put_Item(COleVariant((long)4), COleVariant((long)2), COleVariant(_T("電磁場")));
 52     range.put_Item(COleVariant((long)4), COleVariant((long)3), COleVariant(_T("30")));
 53     range.put_Item(COleVariant((long)4), COleVariant((long)4), COleVariant(_T("變態難")));
 54     range.put_Item(COleVariant((long)4), COleVariant((long)5), COleVariant(_T("老師講課")));
 55 
 56     range.put_Item(COleVariant((long)5), COleVariant((long)2), COleVariant(_T("電機學")));
 57     range.put_Item(COleVariant((long)5), COleVariant((long)3), COleVariant(_T("40")));
 58     range.put_Item(COleVariant((long)5), COleVariant((long)4), COleVariant(_T("")));
 59     range.put_Item(COleVariant((long)5), COleVariant((long)5), COleVariant(_T("老師講課加實驗")));
 60 
 61     range.put_Item(COleVariant((long)6), COleVariant((long)2), COleVariant(_T("PLC")));
 62     range.put_Item(COleVariant((long)6), COleVariant((long)3), COleVariant(_T("20")));
 63     range.put_Item(COleVariant((long)6), COleVariant((long)4), COleVariant(_T("普通")));
 64     range.put_Item(COleVariant((long)6), COleVariant((long)5), COleVariant(_T("老師講課加實驗")));
 65 
 66 
 67     range.put_Item(COleVariant((long)7), COleVariant((long)2), COleVariant(_T("電力系統")));
 68     range.put_Item(COleVariant((long)7), COleVariant((long)3), COleVariant(_T("50")));
 69     range.put_Item(COleVariant((long)7), COleVariant((long)4), COleVariant(_T("")));
 70     range.put_Item(COleVariant((long)7), COleVariant((long)5), COleVariant(_T("老師講課加實驗")));
 71 
 72     range.AttachDispatch(sheet.get_UsedRange());//加載已使用的單元格
 73     range.put_WrapText(COleVariant((long)1));   //設置文本自動換行
 74 
 75     //5.設置對齊方式
 76     //水平對齊:默認 1 居中 -4108, 左= -4131,右=-4152
 77     //垂直對齊:默認 2 居中 -4108, 左= -4160,右=-4107
 78     range.put_VerticalAlignment(COleVariant((long)-4108));
 79     range.put_HorizontalAlignment(COleVariant((long)-4108));
 80     //6.設置字體顏色
 81     CFont0 ft;
 82     ft.AttachDispatch(range.get_Font());
 83     ft.put_Name(COleVariant(_T("楷體"))); //字體
 84     ft.put_ColorIndex(COleVariant((long)1));//顏色    //黑色
 85     ft.put_Size(COleVariant((long)12));     //大小
 86 
 87     range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);
 88     ft.AttachDispatch(range.get_Font());
 89     ft.put_Name(COleVariant(_T("華文行楷")));
 90     ft.put_Bold(COleVariant((long)1));
 91     ft.put_ColorIndex(COleVariant((long)5));    //顏色    
 92     ft.put_Size(COleVariant((long)18));         //大小
 93     Book.SaveCopyAs(COleVariant(strExcelFile)); //保存
 94 
 95     Book.put_Saved(TRUE);
 96     //8.釋放資源
 97     range.ReleaseDispatch();
 98     sheet.ReleaseDispatch();
 99     sheets.ReleaseDispatch();
100     Book.ReleaseDispatch();
101     Books.ReleaseDispatch();
102     App.ReleaseDispatch();

編譯后,我們點調試-開始執行。

點確定,自動打開了EXCAL,並寫入了內容。EXCAL自動保存在了你這個項目的當前文件夾里。

就寫到這里了,好多我也沒有用過,回頭用到了再去研究。其他的相關內容大家參考下面這些大神們的博客吧。
參考資料:
一個封裝的實用的EXCEL類 https://blog.csdn.net/gyssoft/article/details/1592104
vs對Excel讀寫操作 https://blog.csdn.net/qq_16334327/article/details/81353248
在 VS2008 下操作 Excel 的方法總結 https://blog.csdn.net/DavidHsing/article/details/4231592
VS2010 對Excel讀寫操作 https://blog.csdn.net/ywx123_/article/details/77074038
VS2010 MFC Excel(1)https://www.cnblogs.com/zztong/p/6695283.html
VS2010 MFC 讀取Excel(2)https://www.cnblogs.com/zztong/p/6695284.html
VS2010對Excel2010進行操作 https://blog.csdn.net/xiaoxiangyuan123456/article/details/70941588
(轉)VS2010 MFC 操作Excel(讀寫)https://blog.csdn.net/zhaodan19861107/article/details/80675888
VS2010 MFC讀取Excel文件中數據 https://blog.csdn.net/V10_x/article/details/78464453
MFC vs2012 Office2013 讀寫excel文件(OLE/COM)https://blog.csdn.net/baidu_37503452/article/details/72842573
vs創建控制台程序使用C++讀寫excel文件(ODBC方式)https://www.cnblogs.com/renjiashuo/p/7545784.html
VC++遍歷Excelhttps://blog.csdn.net/z3312656/article/details/8282194
感謝各位大神無私的奉獻。


免責聲明!

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



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