MFC操作excel

环境:VS2013+office2007

头文件:

 1 #pragma once
 2 #ifndef __MYEXCEL_H_
 3 #define __MYEXCEL_H_
 4 #include "CApplication.h"
 5 #include "CFont0.h"
 6 #include "CRange.h"
 7 #include "CWorkbook.h"
 8 #include "CWorkbooks.h"
 9 #include "CWorksheet.h"
10 #include "CWorksheets.h"
11
12 class CMyExcel
13 {
14 public:
15     CMyExcel();
16     ~CMyExcel();
17
18     CApplication app;
19     CWorkbook book;
20     CWorkbooks books;
21     CWorksheet sheet;
22     CWorksheets sheets;
23     CRange range;
24     CFont0 font;
25     CRange cols;
26     LPDISPATCH lpDisp;
27
28     void test();
29     void create_new_excel(CString filename);
30     CString change_name_to_current_path(CString filename);
31     void open_excel(CString filename);
32     void close_excel();
33     void save_excel();
34     void set_value(char* pos, char* val);
35     CString get_value(char* pos);
36 };
37
38 #endif

源文件:

#include "stdafx.h"
#include "MyExcel.h"
#include <shlwapi.h>
#pragma comment(lib,"Shlwapi.lib") //如果没有这行,会出现link错误

CMyExcel::CMyExcel()
{

}

CMyExcel::~CMyExcel()
{

}

void CMyExcel::test()
{
}

//新建excel,通过save as
void CMyExcel::create_new_excel(CString path)
{
    //导出
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if (!app.CreateDispatch(_T("Excel.Application")))
    {
        AfxMessageBox(_T("无法创建Excel应用!"));
        return;
    }
    books = app.get_Workbooks();
    //打开Excel,其中pathname为Excel表的路径名  

    book = books.Add(covOptional);
    //CString path = change_name_to_path(filename);
    if (!PathFileExists(path))
    {
        book.SaveAs(COleVariant(path), covOptional,
            covOptional, covOptional,
            covOptional, covOptional, (long)0, covOptional, covOptional, covOptional,
            covOptional, covOptional);
    }

    //释放对象(相当重要!)
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    //退出程序
    app.Quit();
    //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
    app.ReleaseDispatch();
}

//将文件名转化为当前目录下文件的绝对路径
CString CMyExcel::change_name_to_current_path(CString filename)
{
    CString theAppPath, theAppName;
    char Path[MAX_PATH];

    GetModuleFileName(NULL, Path, MAX_PATH);//得到应用程序的全路径
    theAppPath = (CString)Path;

    theAppName = AfxGetApp()->m_pszAppName;
    theAppName += ".exe";

    //把最后的文件名去掉
    int length1, length2;

    length1 = theAppPath.GetLength();
    length2 = theAppName.GetLength();

    theAppPath.Delete(length1 - length2, length2);

    CString TempPath = "";

    return(theAppPath + filename);//EXCEL模板的路径
}

//
void CMyExcel::open_excel(CString path)
{
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if (!app.CreateDispatch(_T("Excel.Application")))
    {
        AfxMessageBox("无法创建Excel应用!");
        return;
    }
    //CString path = change_name_to_path(filename);
    books = app.get_Workbooks();
    lpDisp = books.Open(path, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
    book.AttachDispatch(lpDisp);
}

void CMyExcel::save_excel()
{
    book.Save();
}

//设置值,pos:指定位置  val:指定值
void CMyExcel::set_value(char* pos, char* val)
{
    sheets = book.get_Worksheets();
    sheet = sheets.get_Item(COleVariant((short)1));
    //sheet.put_Name("test");
    range = sheet.get_Range(COleVariant(_T(pos)), COleVariant(_T(pos)));  //获得坐标为(A,1)单元格
    range.put_Value2(COleVariant(_T(val)));   //设置单元格类容为Hello Exce
    cols = range.get_EntireColumn();//选择整列,并设置宽度为自适应
    cols.AutoFit();
    //设置字体为粗体
    font = range.get_Font();
    font.put_Bold(COleVariant((short)TRUE));
    //选择整列,并设置宽度为自适应
    cols = range.get_EntireColumn();
    cols.AutoFit();
    //显示Excel表
    //app.put_Visible(TRUE);
    //app.put_UserControl(TRUE);
}

CString CMyExcel::get_value(char* pos)
{
    range = sheet.get_Range(COleVariant(_T(pos)), COleVariant(_T(pos)));
    //获得单元格的内容
    COleVariant rValue;
    rValue = COleVariant(range.get_Value2());
    //转换成宽字符
    rValue.ChangeType(VT_BSTR);
    //转换格式,并输出
    AfxMessageBox(CString(rValue.bstrVal));
    return CString(rValue.bstrVal);
}

void CMyExcel::close_excel()
{
    //释放对象(相当重要!)
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    //退出程序
    app.Quit();
    //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
    app.ReleaseDispatch();
}

使用:

CMyExcel t;
    //t.test();
    CString path = t.change_name_to_current_path("3.xlsx");

    t.create_new_excel(path);

    t.open_excel(path);
    t.set_value("A3","hello hello");
    t.set_value("A8", "hello 123");
    t.get_value("A8");
    t.save_excel();
    t.close_excel();
时间: 2024-08-25 16:12:31

MFC操作excel的相关文章

MFC 操作excel 读写 感悟

在项目实现中,要操作excel 对表格进行读写,或者是将listcontrol控件里面的内容导入到表格中,为此在网上找了很多代码作为参考,但是都没有达到自己想要的效果! 在此,将自己在项目开发中遇到的问题和解决方法一一列出,希望能帮到其他人.    问题1   出现range等类的重定义,报错100多项 出错原因 主要是对于excel类库的多次添加导致,可以将类库删除后,重新添加.注意:在添加类中,应该添加自己需要的类,最好不要将类全部添加,否则程序运行会很慢. 同时,对于excel类库中类的操

使用MFC操作EXCEL文件

一.加载 1. 在VC6.0里创建一个MFC工程 2.打开MFCClassWizard窗口(查看->建立类向导),选择Automation,单击AddClass按钮,选择Froma type library...,弹出文件选择对话框,之后定位到C:\Program Files\MicrosoftOffice\OFFICE11\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可,为了简便,不出错保留了冗余),如下图.     3.返回编辑器,查看工程文件,可发现多了EXCEL.9H及

关于MFC操作Excel的几点心得

一.操作多个sheet时,记得在操作前先选中要操作的sheet 如将sheet1内的range(A1:An)的内容复制到sheet2内,“类Range的Select方法无效” 可在range.Select();前加sheet.Activate(); 二.使用CFileDiaDlg打开多个文件时,记得要为文件名设定缓存 CFileDialog内置的文件名缓存长度只有200,但是很多时候,文件的路径远大于这个数,为了保险起见,要自己设定一个文件名缓存. dlgFile.m_ofn.nMaxFile

MFC 操作excel

1.新建一个MFC工程,如对话框工程. 2.点击 项目--添加类-- MFC -- TypeLib中的MFC类,点击 "添加" 3.可用的类型裤中,找到 "Microsoft Excel 14.0 Object Library<1.7>" (不同版本的excel不同类型裤),接着添加以下9项: 1>_Application 2>_Chart 3>_Workbook 4>_Worksheet 5>Charts 6>Fon

MFC 与Excel文件的交互操作

假日快要结束了,带着沉重的心情写下之前关于MFC与Excel文件交互的总结.由于VS的版本不同可能在操作上有些差异,所以在此指明下本篇文章的工程环境为VS2013,也建议大家用最新的. 说到程序对于Excel的操作,应该不能算是什么新需求了,方法也有好几种,诸如利用office提供的接口.开源代码之类的.本文在查了一些资料之后选择了实现起来较为反便的一种.其实现的方法基本上完全照抄的这篇文章的,如果看本篇不大明白的可以去看看. 参考的文章说,"踏破铁鞋无觅处,得来费死了工夫",然而进过

MFC:使用ODBC操作EXCEL表

方案一:利用现成的第三方库:CSpreadSheet 使用CSpreadSheet操作EXCEL的局限性:你只能够在EXCEL中创建表,然后才能够采用ODBC的方式操作EXCEL表,否则查询语句中FROM后面的表名称无法填写. 限制 该控件需要MFC(微软基础类库)支持.未测试是否支持Unicode编码.控件以ODBC读写 Excel文件,需要ODBC驱动程序.Excel文件必须列标记.且首行列标记唯一(字段).禁止 删除工作簿,仅允许删除工作簿内容.列值类型参照程序数据类型.不采用Excel格

VC操作excel

http://www.cnblogs.com/witxjp/archive/2010/06/05/1752181.html 最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要报给其他单位).所以查阅了一下相关的VC的Excel编程操作,总结一下吧:(所有资料来源于网络) 利用VC操作Excel的方法至少有两种 1 .利用ODBC把Excel文件当成数据库文件,来进行读.写.修改等操作,网上有人编写了CSpreadSheet类,提供支持. 2. 利用Automation(OL

VC++操作Excel

摘要:使用Microsoft Office所带的控件来实现代码操作excel表格. 开发环境:操作系统是Microsoft Windows7 32bit,Office办公套装是Microsoft Office 2003,编程环境是Microsoft Visual Studio 6.0. 使用背景:我最近有个项目中要生成报表,是将数据库中的发证数据查询出来导出到Excel表格中以便打印,所以上网找了这方面的内容,具体内容如下,如错误还请指证. 从平常我们操作一般文件上来看,无非是打开文件,操作文件

OLE操作Excel编译错误处理

Excel在公司用的很多,而这个东西我用的不是很好,就想用程序来处理,遇到很多错误.这几天研究了下OLE操作Excel.环境:VS2008 SP1+Excel 2007 加入OLE Type Library随便建立一个MFC程序,选添加类,Typelib中的MFC类,出来一个对话,可用类型库选“Microsoft Excel 12.0 Object Library”一般来说,添加下边这些类就够了,当然也可以全部添加CApplication CWorkbookCWorkbooksCWorkshee