VS2005 MFC C/C++ 操作excel

我使用的是office2003

第一步:

首先得到这几个文件

CApplication.h

CWorkbook.h

CWorkbooks.h

CWorksheet.h

CWorksheets.h

CRange.h

CFont0.h


得到的方法可以直接引入  引入的方法:

Project->add Class->mfc->MFC Class From TypeLib->Available type libraries->Mircrosoft Excel xx Object library

添加这接个类就可以了

当然也可以从本文下载,推荐直接下载加入到工程中去,本文后面有这些文件的源码可以直接复制过去用。

第二步,

工程中新建个.cpp文件和.h文件

我的是Excel.cpp Excel.h

在Excel.h中添加以下头文件

#include <comdef.h>

#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "CApplication.h"
#include "CFont0.h"

Excel.cpp中创建以下实例


CRange m_ExlRge;
CWorksheet m_ExlSheet;
CWorksheets m_ExlSheets;
CWorkbook m_ExlBook;
CWorkbooks m_ExlBooks;
CApplication m_ExlApp;
CFont0 ft;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);


第三步:

在工程中的InitInstance中加入下面的代码 初始化自动化模块ole

CWinApp::InitInstance();
    if(!AfxOleInit()){
        AfxMessageBox("init ole failed!");
    }

第四步:

接下来就可以使用相关的接口了

网上的搜到的接口和我们用的有差异


比如Get之类的函数我们使用get_

Set改为put_




我们随便建个函数 下面的方法基本上就是网上能搜到的一些方法了 拿来用就行

比如bool Excel()

{

首先启动Excel服务

if(!m_ExlApp.CreateDispatch("Excel.Application",NULL))
    {
          AfxMessageBox("创建Excel服务失败!请先安装Offic Excel 2003");
          return false;
    }

在我们程序编辑excel的时候显示出来(我是喜欢这样,网上例子一般都是设置成FALSE,我们先设置TRUE方便调试)

m_ExlApp.put_Visible(TRUE);

得到工作薄

m_ExlBooks.AttachDispatch(m_ExlApp.get_Workbooks(),true);
   m_ExlBook.AttachDispatch(m_ExlBooks.Add(covOptional),true);

}
_ExlSheets.AttachDispatch(m_ExlBook.get_Sheets(),true);
得到sheet工作表
    m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
    m_ExlSheet.AttachDispatch(m_ExlSheets.get_Item(_variant_t((long)1)),TRUE);
    //删除第二个Sheet页面
    m_ExlSheet.AttachDispatch(m_ExlSheets.get_Item(_variant_t((long)2)),TRUE);
    m_ExlSheet.Delete();

    //把第一个Sheet页面的名字改变为TestSheet
    m_ExlSheet.AttachDispatch(m_ExlSheets.get_Item(_variant_t((long)1)),TRUE);
    m_ExlSheet.put_Name("测试项");
合并单元格

m_ExlRge.AttachDispatch(m_ExlSheet.get_Range(_variant_t("A1"),_variant_t("K1")),TRUE);
    m_ExlRge.Merge(_variant_t((long)0));

单元格中写数据 写数据之前一定要加载所有单元格 否则定位就不准了

m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);//加载所有单元格
    m_ExlRge.put_Item(_variant_t((long)1),_variant_t((long)1),_variant_t("hello你好"));

所有单元格设置自动换行 水平和垂直居中

m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);//加载所有单元格
    m_ExlRge.put_WrapText(_variant_t(true));
    m_ExlRge.put_HorizontalAlignment(_variant_t((long)-4108));   
    m_ExlRge.put_VerticalAlignment(_variant_t((long)-4108));

设置边框

m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);//加载所有单元格
    CRange UnitRge;
    CString CellName;

    for(int i=1;i<=3);i++)
    {
          for(int j=1;j<=11;j++)
          {    
                 CellName.Format("%c%d",j+64,i);//单元格的名称

                 UnitRge.AttachDispatch(m_ExlRge.get_Range(_variant_t(CellName),_variant_t(CellName)));//加载单元格

                 //LineStyle=线型 Weight=线宽 ColorIndex=线的颜色(-4105为自动)
                 UnitRge.BorderAround(_variant_t((long)1),_variant_t((long)3),_variant_t((long)-4105),vtMissing);//设置边框
          }
    }

设置字体颜色


           m_ExlRge.AttachDispatch(m_ExlSheet.get_Range(_variant_t(“H1”),_variant_t(“H1”)));
                ft.AttachDispatch(m_ExlRge.get_Font());
                ft.put_ColorIndex(_variant_t((long)3));//红

特别注意的是使用m_ExlRge写数据的时候一定要先获取所有单元格,比如说我使用它的put_item函数写到一半设置了一下字体颜色,那么我们肯定会用到m_ExlRge.AttachDispatch那么我们就定位到这个地方了我们再次用put_item的时候设置字体颜色的那个点就认为是(0,0)点了所以这个时候需要先使用m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);加载所有单元格


最后关键的一步 保存文件和释放资源

我使用的是saveas保存文件,其他的方法目前还在研究,saveas就能直接保存的指定的目录了

CString FilePath = “D:\\test.xls”; 可以灵活设置

m_ExlBook.SaveAs(COleVariant(FilePath),covOptional,  
    covOptional,covOptional,  
    covOptional,covOptional,(long)0,covOptional,covOptional,covOptional,  
    covOptional,covOptional);
    m_ExlRge.ReleaseDispatch();
    m_ExlSheet.ReleaseDispatch();
    m_ExlSheets.ReleaseDispatch();
    m_ExlBook.ReleaseDispatch();
    m_ExlBooks.ReleaseDispatch();
    //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
    m_ExlApp.ReleaseDispatch();
    //退出程序
    m_ExlApp.Quit();

https://blog.csdn.net/shuilan0066/article/details/7936336
https://blog.csdn.net/wangmeng0804/article/details/65627826

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作Excel可以使用MFC中的COleVariant类和Excel自带的对象模型来实现。具体步骤如下: 1. 创建Excel应用程序对象 ```c++ _Application app; // 声明Excel应用程序对象 if (!app.CreateDispatch(_T("Excel.Application"))) // 创建Excel应用程序对象 { AfxMessageBox(_T("无法创建Excel应用程序对象!")); return; } app.put_Visible(TRUE); // 显示Excel应用程序 ``` 2. 打开工作簿 ```c++ Workbooks books; // 声明工作簿集合对象 books.AttachDispatch(app.get_Workbooks()); // 获取工作簿集合对象 _Workbook book; // 声明工作簿对象 if (!book.CreateDispatch(_T("Excel.Workbook"))) // 创建工作簿对象 { AfxMessageBox(_T("无法创建工作簿对象!")); return; } COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); // 创建一个可选参数 book.put_Visible(FALSE); // 隐藏工作簿窗口 book.put_SaveAs(covFileName); // 保存工作簿 ``` 3. 打开工作表 ```c++ Sheets sheets; // 声明工作表集合对象 sheets.AttachDispatch(book.get_Worksheets()); // 获取工作表集合对象 _Worksheet sheet; // 声明工作表对象 if (!sheet.CreateDispatch(_T("Excel.Worksheet"))) // 创建工作表对象 { AfxMessageBox(_T("无法创建工作表对象!")); return; } sheet.put_Name(_T("Sheet1")); // 设置工作表名称 sheet.Activate(); // 激活工作表 ``` 4. 写入数据 ```c++ COleVariant covData(_T("Hello, Excel!")); // 创建一个字符串数据 Range range; // 声明单元格对象 range.AttachDispatch(sheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("A1")))); // 获取单元格对象 range.put_Value2(covData); // 写入数据 ``` 5. 保存并关闭Excel应用程序对象 ```c++ book.Save(); // 保存工作簿 book.Close(covOptional, covOptional, covOptional); // 关闭工作簿 app.Quit(); // 关闭Excel应用程序 ``` 以上代码仅供参考,具体实现需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值