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

  • 相关阅读:
    远程访问linux环境安装图形界面问题解决汇总
    如何通过SecureCRT FTP上传下载文件
    X-Frame-Options 响应头
    Openresty 学习笔记(四)lualocks包管理器安装使用
    PHP7 学习笔记(十六)Yaconf 一个高性能的配置管理扩展
    网络工具(一)frp 供内网穿透服务的工具
    博客园自定义样式参考
    Redis学习笔记(二)解析dump.rdb文件工具之redis-rdb-tools
    Docker 从入门到放弃(四)Docker+Jenkins_自动化持续集成
    PHP7 学习笔记(十五)Repository 模式实现业务逻辑和数据访问的分离
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/10981416.html
Copyright © 2020-2023  润新知