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
感谢各位大神无私的奉献。

原文地址:https://www.cnblogs.com/nxopen2018/p/10981416.html

时间: 2024-11-05 13:30:24

NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))的相关文章

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的

NX二次开发-UFUN获取显示在NX交互界面的对象UF_OBJ_is_displayable

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_disp.h> 5 #include <uf_obj.h> 6 #include <uf_part.h> 7 8 UF_initialize(); 9 10 //遍历当前显示部件 11 tag_t NextTag = NULL_TAG; 12 int Type1, SubType1; 13 do 14 { 15 NextTag = UF_OBJ_cycle_all

Visual Stadio 与NX二次开发的环境配置(以VS2010、NX10.0为例)

问题描述: 许多博文发布了关于Visual Stadio 与NX二次开发的环境配置,这些博文的提示事修改了文件NX10_Open.vsz中的引擎为10.0,但实际结果是创建C++引导失败. 问题解决概述: 创建正确引导应该同时修改NX10_Open.vsz与NX10_NXOpenCPP.vsz两个文件的引擎版本号. 解决步骤: 将NX10.0 UGOPEN目录下的所有文件夹(VB.VC.VC#)复制,并粘贴到Visual Stadio 2010安装目录下与对应的文件夹合并即可(覆盖). 例如,将

NX二次开发-NX+VS写代码设断点调试技巧

在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对.2.VS设断点-添加进程调试,来看输入输出值对不对3.UF_CALL也就是UF_get_fail_message这个函数,来看函数自己用的对不对.4.查看NX-Help-LogFile(日志),拖到最后看提示了哪些错误. 我一般用的比较多的是设断点调试,这里先说设断点调试.其他方法改天再写. 写举一

NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用

关于 在Block UI中UF_initialize();和UF_terminate();的使用 1 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize();和UF_terminate();. 2 可以直接加在CPP里这个位置: 3 4 extern "C" DllExport void ufusr(char *param, int *retcod, int param_len) 5 { 6 TwoPointCyl *theTwoPoin

NX二次开发-移动WCS坐标系

说明:移动WCS坐标系 用法: #include <uf.h> #include <uf_csys.h> extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); //移动WCS,到点 couCsysOrigin2 double couCsysOrigin2[3] = { 10,10,10 }; //获取当前WCS标识 tag_t tagWCS = NULL_TAG;

NX二次开发-获取指定矩阵标识的矩阵值

函数:UF_CSYS_ask_matrix_values () 函数说明:获取指定矩阵标识的矩阵值. 用法: #include <uf.h> #include <uf_csys.h> extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); //获取WCS标识 tag_t tagWCS = NULL_TAG; UF_CSYS_ask_wcs(&tagWCS);

NX二次开发-通过3x3矩阵获取XYZ轴矢量

函数:UF_CSYS_ask_wcs() 函数说明:通过3x3矩阵获取XYZ轴矢量 用法: 1 #include <uf.h> 2 #include <uf_mtx.h> 3 extern DllExport void ufusr(char *param, int *returnCode, int rlen) 4 { 5 UF_initialize(); 6 7 double douMatrixValues[9] = {1,0,0,0,1,0,0,0,1}; 8 double dV

NX二次开发-UFUN和NXOpen结合开发中Tag_t对象与TaggedObject对象转换方法

1 本文通过举四个例子来告诉大家在NX二次开发过程中会经常用到UFUN和NXOpen结合去开发,在UFUN中我们得到的是Tag_t对象,在NXOpen中得到的是TaggedObject对象,这两个是需要进行转换的.本文主要知识点为:TaggedObject->tag_t() , NXOpen::NXObjectManager::Get(BodyTag1) , feature1->JournalIdentifier()的用法. 2 3 NX11+VS2013 4 5 #include <u