欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MFC - Excel操作简介(基于VS2010)

程序员文章站 2022-05-25 19:48:20
一、添加与 Excel 操作相关的头文件 项目 -> 类向导,在右上方有一个下拉栏,选择其中的 类型库中的MFC类(T),即可看到下图所示界面,选择“文件”选项,然后在下方的位置选项中添加本地文件,本人电脑中的EXCEL是安装在 C 盘的,故文件目录为:C:\Program Files\Micros ......

 一、添加与 excel 操作相关的头文件

  项目 -> 类向导,在右上方有一个下拉栏,选择其中的 类型库中的mfc类(t),即可看到下图所示界面,选择“文件”选项,然后在下方的位置选项中添加本地文件,本人电脑中的excel是安装在 c 盘的,故文件目录为:c:\program files\microsoft office\office14\excel.exe。

MFC - Excel操作简介(基于VS2010)

  添加了 excel.exe 后,可以看到一系列接口,选择其中的: _application、_workbook、_worksheet、workbooks、worksheets、font、range 并添加,然后在主程序中添加其头文件:

#include "capplication.h"
#include "cworkbook.h"
#include "cworkbooks.h"
#include "cworksheet.h"
#include "cworksheets.h"
#include "crange.h"
#include "cfont0.h"

   逐次打开上述头文件,并将其中的 “ #import "c:\\program files\\microsoft office\\office14\\excel.exe" no_namespace ” 这句话给屏蔽掉,不然会报错,无法编译成功。这样之后,编译还是不能通过,会出现以下报错:

MFC - Excel操作简介(基于VS2010)

  点击 warning 来到报错处,在 dialogbox() 前面加上下划线 "_",即 "_dialogbox()" 即可。

 

二、创建并保存一个 excel

  直接上代码先:

void cexcel_exampledlg::savedatatoexcel()
{
    cstring cellnum;

    capplication m_excelapp;            // excel 应用程序接口
    cworkbook m_excelbook;             // 工作簿
    cworkbooks m_excelbooks;           // 工作簿集合
    cworksheet m_excelsheet;            // 工作表
    cworksheets m_excelsheets;         // 工作表集合
    crange m_excelrange;                // 用于对单元格进行操作
    crange m_excelcols;
    cfont0 m_excelfont;                    // 用于字体操作

    // 获取系统时间并保存为 cstring 类型
    cstring timestr;                       // 获取系统时间
    systemtime systime;
    getlocaltime(&systime);

    cstring m_savefilepath;                // 保存路径
    timestr.format(l"_%4d.%2d.%2d_%2d.%2d",systime.wyear , systime.wmonth , systime.wday , systime.whour , systime.wminute);
    m_savefilepath =  _t("e:\\workplace\\excelexample") + timestr + _t(".xlsx"); 
  
    cstring str;
    for(int i = 0;i <20;i++)
    {
        str.format(l"%d",i);
        valuearray1.add(str);

        str.format(l"%d",2 * i);
        valuearray2.add(str);

        str.format(l"%d",3 * i);
        sumarray.add(str);

    }

    colevariant covtrue((short)true);
    colevariant covfalse((short)false);
    colevariant covoptional((long)disp_e_paramnotfound,vt_error);

    if(!m_excelapp.createdispatch(_t("excel.application")))
    {
        afxmessagebox(_t("创建excel失败"),mb_ok | mb_iconwarning);
        return;
    }

    m_excelbooks = m_excelapp.get_workbooks();        // 获取一个工作簿集合
    m_excelbook = m_excelbooks.add(covoptional);        // 添加一个工作簿

    m_excelsheets = m_excelbook.get_sheets();            // 获取一个工作表集合
    m_excelsheet = m_excelsheets.get_item(colevariant((short)1));   // 获取一个工作表

    // 向 excel 中添加数据
    // 选择工作表中 a1-a1 单元格区域
    m_excelrange = m_excelsheet.get_range(colevariant( _t("a1")), colevariant(_t("a1")));        
    m_excelrange.put_value2(colevariant( _t("变量名1")));              // 设置 a1 内容
    m_excelcols = m_excelrange.get_entirecolumn();                    // 选择整列
    m_excelcols.put_horizontalalignment(colevariant((long)-4108));    // 设置居中对齐

    // 选择工作表中 b1-b1 单元格区域
    m_excelrange = m_excelsheet.get_range(colevariant( _t("b1")), colevariant(_t("b1")));            
    m_excelrange.put_value2(colevariant( _t("值")));                  // 设置 b1 内容
    m_excelcols = m_excelrange.get_entirecolumn();                    // 选择整列
    m_excelcols.put_horizontalalignment(colevariant((long)-4108));    // 设置居中对齐

    // 选择工作表中 c1-c1 单元格区域
    m_excelrange = m_excelsheet.get_range(colevariant( _t("c1")), colevariant(_t("c1")));            
    m_excelrange.put_value2(colevariant( _t("变量名2")));              // 设置 c1 内容
    m_excelcols = m_excelrange.get_entirecolumn();                    // 选择整列
    m_excelcols.put_horizontalalignment(colevariant((long)-4108));    // 设置居中对齐
     
    // 选择工作表中 d1-d1 单元格区域   
    m_excelrange = m_excelsheet.get_range(colevariant( _t("d1")), colevariant(_t("d1")));        
    m_excelrange.put_value2(colevariant( _t("值")));                  // 设置 d1 内容
    m_excelcols = m_excelrange.get_entirecolumn();                   // 选择整列
    m_excelcols.put_horizontalalignment(colevariant((long)-4108));   // 设置居中对齐

    // 选择工作表中 e1-e1 单元格区域
    m_excelrange = m_excelsheet.get_range(colevariant( _t("e1")), colevariant(_t("e1")));            
    m_excelrange.put_value2(colevariant( _t("和")));                 // 设置 e1 内容
    m_excelcols = m_excelrange.get_entirecolumn();                   // 选择整列
    m_excelcols.put_horizontalalignment(colevariant((long)-4108));   // 设置居中对齐

    for(int i = 0;i < 20;i++)
    {    
        cellnum.format(l"%d",i+2);
        cellnum = _t("a") + cellnum;
        // 依次选择工作表中 a 列 的单元格
        m_excelrange = m_excelsheet.get_range(colevariant(cellnum), colevariant(cellnum));        
        m_excelrange.put_value2(colevariant(_t("a")));          // 设置 a 列内容

        cellnum.format(l"%d",i+2);
        cellnum = _t("b") + cellnum;
        // 依次选择工作表中 b 列 的单元格
        m_excelrange = m_excelsheet.get_range(colevariant(cellnum), colevariant(cellnum));        
        m_excelrange.put_value2(colevariant(valuearray1[i]));   // 设置 b 列内容

        cellnum.format(l"%d",i+2);
        cellnum = _t("c") + cellnum;
        // 依次选择工作表中 c 列 的单元格
        m_excelrange = m_excelsheet.get_range(colevariant(cellnum), colevariant(cellnum));        
        m_excelrange.put_value2(colevariant(_t("b")));          // 设置 c 列内容

        cellnum.format(l"%d",i+2);
        cellnum = _t("d") + cellnum;
        // 依次选择工作表中 d 列 的单元格
        m_excelrange = m_excelsheet.get_range(colevariant(cellnum), colevariant(cellnum));        
        m_excelrange.put_value2(colevariant(valuearray2[i]));  // 设置 d 列内容

        cellnum.format(l"%d",i+2);
        cellnum = _t("e") + cellnum;
        // 依次选择工作表中 e 列 的单元格
        m_excelrange = m_excelsheet.get_range(colevariant(cellnum), colevariant(cellnum));        
        m_excelrange.put_value2(colevariant(sumarray[i]));    // 设置 e 列内容

    }

    m_excelapp.put_visible(false);                        // 不显示 excel 表格
    m_excelapp.put_usercontrol(false);                    // 设置表格状态为用户不可控制

    m_excelbook.savecopyas(colevariant(m_savefilepath));  // 保存excel表格
    m_excelbook.put_saved(true);

    // 释放对象
    m_excelbooks.releasedispatch();
    m_excelbook.releasedispatch();
    m_excelsheets.releasedispatch();
    m_excelsheet.releasedispatch();
    m_excelrange.releasedispatch();

    m_excelapp.quit();          // 退出 excel 程序,注意这里要先退出,后释放
    m_excelapp.releasedispatch();

}

 

  这段代码创建了一个 excel ,然后向 excel 中添加了 5 列 21 行的数据并保存到本地,最终所得到的 excel 如下:

MFC - Excel操作简介(基于VS2010)

  整个代码不复杂,设置好一切后向 excel 中添加数据即可,添加完数据后,记得保存表格,并释放相应的资源,否则程序结束后会有一个 excel 进程驻留在内存中,这样重复运行程序时会出错。