环境:VS2013+office2007

头文件:

 #pragma once
#ifndef __MYEXCEL_H_
#define __MYEXCEL_H_
#include "CApplication.h"
#include "CFont0.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h" class CMyExcel
{
public:
CMyExcel();
~CMyExcel(); CApplication app;
CWorkbook book;
CWorkbooks books;
CWorksheet sheet;
CWorksheets sheets;
CRange range;
CFont0 font;
CRange cols;
LPDISPATCH lpDisp; void test();
void create_new_excel(CString filename);
CString change_name_to_current_path(CString filename);
void open_excel(CString filename);
void close_excel();
void save_excel();
void set_value(char* pos, char* val);
CString get_value(char* pos);
}; #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), 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)));
//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();

MFC操作excel的更多相关文章

  1. 【VC++学习笔记一】MFC操作Excel

    最近在做一个读取Excel的功能,之前也做过相关的,但总是零零闪闪的,趁着正在劲头上,归纳一下: 利用Automation添加相关的类,在Excel2010中可以在安装文件夹下直接点击Excel.ex ...

  2. C++之操作Excel(抄录https://www.cnblogs.com/For-her/p/3499782.html)

    MFC操作Excel 下面的操作基于Excel2003 一.初始化操作 1.导入类库 点击查看->建立类向导-> Add Class...\From a type Library...-& ...

  3. MFC 与Excel文件的交互操作

    假日快要结束了.带着沉重的心情写下之前关于MFC与Excel文件交互的总结. 因为VS的版本号不同可能在操作上有些差异.所以在此指明下本篇文章的project环境为VS2013,也建议大家用最新的. ...

  4. VS2010 C++ 操作Excel表格的编程实现

    转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html 通过VC实现对Excel表格的操作的方法有多种, ...

  5. OLE操作Excel编译错误处理

      Excel在公司用的很多,而这个东西我用的不是很好,就想用程序来处理,遇到很多错误.这几天研究了下OLE操作Excel.环境:VS2008 SP1+Excel 2007 加入OLE Type Li ...

  6. VC操作excel

    http://www.cnblogs.com/witxjp/archive/2010/06/05/1752181.html   最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要 ...

  7. VC操作Excel之基本操作(颜色等)【转载】

    文章出处https://blog.csdn.net/form88/article/details/78566390 EXCEL里如何知道某种颜色的ColorIndex的值 ===fag::====== ...

  8. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  9. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

随机推荐

  1. iOS 设置非ARC类

    用-fno-objc-arc标记来禁用在ARC工程那些不支持ARC的文件的ARC用-fobjc-arc标记启用非ARC工程中支持ARC的文件

  2. Yii2 用户登录

    在Yii2的basic版本中默认是从一个数组验证用户名和密码,如何改为从数据表中查询验证呢?且数据库的密码要为哈希加密密码验证? 下面我们就一步一步解析Yii2的登录过程. 一. 创建user表模型 ...

  3. Spring MVC基础入门

    Spring MVC简介 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱 ...

  4. Java基础知识点1:基本类型包装类

    基本类型的包装类 简介 通常来说我们在程序中经常会使用元类型,比如 int data = 1; float data = 2.1F; 但是在有些场景中不能直接使用元类型,比如如果我们想要建立一个int ...

  5. Centos7 基本shell命令

    删除文件 # rm /usr/local/test.txt# rm -f /usr/local/test.txt //强制删除文件,不弹出提示 移动文件或文件夹 # mv webdata /bin/u ...

  6. backbonejs使用

    backbone是一个非常好的前端MVC框架,将数据与逻辑分离出来,在稍大一点项目中,backbone都有用武之地. 个人感觉backbone最好的地方就是通过事件来管理数据改变导致的视图改变,bac ...

  7. iOS __weak __strong WeakSelf StrongSelf

    在block中常常会用到self,可是会造成循环引用.这时候就需要这样来解决这个问题: #define WeakSelf __weak typeof(self) weakSelf = self #de ...

  8. html和css书写规范

    HTML 规范 分离的标记.样式和脚本 结构.表现.行为分离 在可能情况下验证你的标记 使用编辑器验证你的标记是否正确,一般编辑器都自带有这个功能. 技术不支持的时候使用备胎,如canvas 编码格式 ...

  9. bzoj4364: [IOI2014]wall砖墙

    线段树打标记的好(luo)题 打打标记,记得下移 = =听说2000000是用来卡线段树的 = =怎么办呢,,, = =打个读入优化看看能不能卡过去吧 #include<cstdio> # ...

  10. 【Redis】简介与安装

    Linux 安装 [root@redis ~]# wget http://download.redis.io/releases/redis-2.8.19.tar.gz 解压缩redis[root@ha ...