• 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

  • 相关阅读:
    为什么要配置PATH环境变量?如何配置
    JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些
    常用的开发工具
    API文档说明
    Java注释(Comment)
    EditPlus和notepad++配置
    Java第一个程序--HelloWorld
    cmd命令和快捷键
    如何以计算机的方式去思考
    藤野先生后来怎么样了?被自卑隔阂的友谊
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/10981433.html
Copyright © 2020-2023  润新知