==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍
因为其中原理我也不是很懂,所以目前只能按着基本步骤来,感兴趣的可以去看ATL/COM编程。
点击下载完整代码
步骤如下:
1.新建一个MFC工程(对话框)
之后会自动添加如下头文件
#include // MFC 自动化类
3.找到EXCEL.EXE所在的路径,然后复制上去,点击一下空白的地方就会出现下面的接口
4.添加基本的接口
一般肯定会用到的有CApplication、CWorkbooks、CWorkbook、CWorksheets、CWorksheet、CRange
其中CApplication用来打开EXCEL.EXE,CWorkbooks获取所有工作簿,CWorkbook一个工作簿,CWorksheets所有工作表,CWorksheet一个工作表
CRange操作单元格
完成-》确定即可
5.删掉每个头文件的第一句
#import "C:\\Program Files\\Microsoft Office\\Office16\\EXCEL.EXE" no_namespace
6.做完上面的工作后,编译后出现如下错误
这时候只要把DialogBox改成_DialogBox,这下编译就通过了。
7.读取EXCEL数据
步骤:
1).打开EXCEL.EXE服务器
//打开excel服务器
if (!m_app.CreateDispatch(L"Excel.Application"))
{
AfxMessageBox(L"无法启动Excel服务器!");
return FALSE;
}
2).打开工作簿
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//打开工作簿
books = m_app.get_Workbooks();
book = books.Open(m_fileName, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
3).打开工作表
//获取工作表
sheet = book.get_ActiveSheet();
4).获取单元格
range = sheet.get_Cells(); //获取所有的,这个不能省
range = range.get_Item(_variant_t(m_rRow), _variant_t(m_rCol)).pdispVal; //再获取指定的
5).获取单元格数据
vResult = range.get_Value2();
if (vResult.vt == VT_R8) //8字节的数字
m_rRes.Format(TEXT("%lf"), vResult.dblVal);
else if (vResult.vt == VT_BSTR) //字符串
m_rRes = vResult.bstrVal;
6).关闭工作簿、释放对象
//关闭工作簿
books.Close();
//释放对象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
在初始化对话框中打开服务器
当程序退出的时候才关闭服务器,否则打开关闭打开关闭,速度很慢。
8.写入EXCEL数据
步骤:
1).打开EXCEL.EXE服务器
//打开excel服务器
if (!m_app.CreateDispatch(L"Excel.Application"))
{
AfxMessageBox(L"无法启动Excel服务器!");
return FALSE;
}
2).新建一个工作簿
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
books = m_app.get_Workbooks();
book = books.Add(covOptional);
3).新建一个工作表
sheet = book.get_ActiveSheet();
4).获取单元格
range = sheet.get_Cells();
5).写入数据
range.put_Item(_variant_t(m_wRow), _variant_t(m_wCol),_variant_t(m_wRes));
6).保存
book.SaveCopyAs(_variant_t(m_pathName));
book.put_Saved(true);
//如果是打开已有的,可以直接保存
//book.Save();
6).关闭工作簿、释放对象
//关闭工作簿
books.Close();
//释放对象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();