vc++ 操作excel
2015-10-21 21:45
302 查看
1、首先项目中添加类”Typelib中的MFC类->选择文件中”,选择office的安装路径中的excel.exe;
2、选中以下几项_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然后导入;
3、导入后自动在工程中添加CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange这些类; 并将把这些类的头文件中的第一句话 #import “…….EXCEL.EXE” nonamespace 删除;
4、编译时会遇到问题Not enough actual parameters for macro ‘DialogBoxW’.
解决的方法:在CRange类中找到VARIANT DialogBox(){}并将DialogBox其改成_DialogBoxW
大致操作流程
定义变量
CApplication objApp;
CWorkbooks objBooks;
CWorkbook objBook;
CWorksheets objSheets;
CWorksheet objSheet;
CRange objRange,usedRange;
LPDISPATCH lpDisp;
COleVariant vResult;
CString temppath= _T(“e:\excel.xlsx”);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
1、初始化COM组件
if(::CoInitialize(NULL)==E_INVALIDARG)
{
AfxMessageBox(L”初始化Com失败!”);
return ;
}
if(!objApp.CreateDispatch(L”Excel.Application”))
{
AfxMessageBox(L”无法启动服务器!”);
::CoUninitialize();//主要做Com相关资源的释放,清理工作.
return ;
}
2、得到得到工作簿容器
objBooks.AttachDispatch(objApp.get_Workbooks());
3、打开工作簿
lpDisp=objBooks.Open(strBookPath,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);
objBook.AttachDispatch(lpDisp);
4、获得sheet容器
objSheets.AttachDispatch(objBook.get_Sheets());
5、在写入数据之前要根据需要对单元格做一定的处理,比如合并单元格、设置单元格格式、设置列宽和高;
objRange.AttachDispatch(objSheet.get_Range(_variant_t(“A1”),_variant_t(BTT1)),TRUE);
objRange.Merge(_variant_t((long)0));//合并单元格
objRange.AttachDispatch(objSheet.get_Range(_variant_t(“A1”),_variant_t(“A1”)),TRUE);
objRange.put_ColumnWidth(_variant_t((long)22));//设置列宽
objRange.AttachDispatch(objSheet.get_Rows());
objRange.put_RowHeight(_variant_t((long)22));//设置行高
6、写入数据
objRange.AttachDispatch(objSheet.get_Cells(),TRUE);
objRange.put_Item(_variant_t((long)1),_variant_t((long)1),_variant_t(_T(“数学系研究生课程统计”))); objRange.put_Item(_variant_t((long)2),_variant_t((long)1),_variant_t(_T(“课程名”))); objRange.put_Item(_variant_t((long)2),_variant_t((long)2),_variant_t(_T(“课时”)));
7、根据需要设置表的格式
/设置表格文本对齐方式/
objRange.AttachDispatch(objSheet.get_UsedRange());//加载已使用单元格
objRange.put_WrapText(_variant_t((long)1));//设置单元格自动换行
///水平对齐:默认=1,居中=-4108,左=-4131,右=-4152/
///* 垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107*/
objRange.put_VerticalAlignment(_variant_t((long)-4108));
objRange.put_HorizontalAlignment(_variant_t((long)-4108));
///设置第一行表头字体和加粗/
objRange.AttachDispatch(objSheet.get_Range(_variant_t(“A1”),_variant_t(“A1”)));
objRange.put_RowHeight(_variant_t((long)20));
8、保存文件
CString strSaveAsName = _string_file_path;
book.SaveAs(_variant_t(strSaveAsName),vtMissing, vtMissing, vtMissing, vtMissing,
vtMissing, 0, vtMissing, vtMissing, vtMissing,
vtMissing, vtMissing);
9、释放资源
objRange.ReleaseDispatch();
objSheet.ReleaseDispatch();
objSheets.ReleaseDispatch();
objBook.ReleaseDispatch();
objBooks.ReleaseDispatch();
objApp.Quit();
objApp.ReleaseDispatch();
2、选中以下几项_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然后导入;
3、导入后自动在工程中添加CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange这些类; 并将把这些类的头文件中的第一句话 #import “…….EXCEL.EXE” nonamespace 删除;
4、编译时会遇到问题Not enough actual parameters for macro ‘DialogBoxW’.
解决的方法:在CRange类中找到VARIANT DialogBox(){}并将DialogBox其改成_DialogBoxW
大致操作流程
定义变量
CApplication objApp;
CWorkbooks objBooks;
CWorkbook objBook;
CWorksheets objSheets;
CWorksheet objSheet;
CRange objRange,usedRange;
LPDISPATCH lpDisp;
COleVariant vResult;
CString temppath= _T(“e:\excel.xlsx”);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
1、初始化COM组件
if(::CoInitialize(NULL)==E_INVALIDARG)
{
AfxMessageBox(L”初始化Com失败!”);
return ;
}
if(!objApp.CreateDispatch(L”Excel.Application”))
{
AfxMessageBox(L”无法启动服务器!”);
::CoUninitialize();//主要做Com相关资源的释放,清理工作.
return ;
}
2、得到得到工作簿容器
objBooks.AttachDispatch(objApp.get_Workbooks());
3、打开工作簿
lpDisp=objBooks.Open(strBookPath,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);
objBook.AttachDispatch(lpDisp);
4、获得sheet容器
objSheets.AttachDispatch(objBook.get_Sheets());
5、在写入数据之前要根据需要对单元格做一定的处理,比如合并单元格、设置单元格格式、设置列宽和高;
objRange.AttachDispatch(objSheet.get_Range(_variant_t(“A1”),_variant_t(BTT1)),TRUE);
objRange.Merge(_variant_t((long)0));//合并单元格
objRange.AttachDispatch(objSheet.get_Range(_variant_t(“A1”),_variant_t(“A1”)),TRUE);
objRange.put_ColumnWidth(_variant_t((long)22));//设置列宽
objRange.AttachDispatch(objSheet.get_Rows());
objRange.put_RowHeight(_variant_t((long)22));//设置行高
6、写入数据
objRange.AttachDispatch(objSheet.get_Cells(),TRUE);
objRange.put_Item(_variant_t((long)1),_variant_t((long)1),_variant_t(_T(“数学系研究生课程统计”))); objRange.put_Item(_variant_t((long)2),_variant_t((long)1),_variant_t(_T(“课程名”))); objRange.put_Item(_variant_t((long)2),_variant_t((long)2),_variant_t(_T(“课时”)));
7、根据需要设置表的格式
/设置表格文本对齐方式/
objRange.AttachDispatch(objSheet.get_UsedRange());//加载已使用单元格
objRange.put_WrapText(_variant_t((long)1));//设置单元格自动换行
///水平对齐:默认=1,居中=-4108,左=-4131,右=-4152/
///* 垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107*/
objRange.put_VerticalAlignment(_variant_t((long)-4108));
objRange.put_HorizontalAlignment(_variant_t((long)-4108));
///设置第一行表头字体和加粗/
objRange.AttachDispatch(objSheet.get_Range(_variant_t(“A1”),_variant_t(“A1”)));
objRange.put_RowHeight(_variant_t((long)20));
8、保存文件
CString strSaveAsName = _string_file_path;
book.SaveAs(_variant_t(strSaveAsName),vtMissing, vtMissing, vtMissing, vtMissing,
vtMissing, 0, vtMissing, vtMissing, vtMissing,
vtMissing, vtMissing);
9、释放资源
objRange.ReleaseDispatch();
objSheet.ReleaseDispatch();
objSheets.ReleaseDispatch();
objBook.ReleaseDispatch();
objBooks.ReleaseDispatch();
objApp.Quit();
objApp.ReleaseDispatch();
相关文章推荐
- VC编程中利用ADO方式访问SQL Server 2012数据库(1)- 连接数据库
- warning C4819: The file contains a character that cannot be represented in the current code page
- 双缓冲技术解决屏幕刷新闪烁
- 用筛法求之N内的素数。
- c++中介者模式
- 用迭代法求 。求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001。 输出保留3位小数
- C语言:一个球从 100 米落下,每次落地后反跳回原一半,再落下,再反弹。求第10次高度?sum?
- C++ const 限定符
- RAII惯用法:C++资源管理的利器
- c++多线程编程
- 1009. 说反话 (20)
- C语言:有一个分数序列,2/1+3/2+5/3+8/5+13/8+…求出这个数列前 20 项的和
- C++中尖括号和引号的区别---转载
- C++学习——模板与异常处理
- C++ 中捕获整数除零错误
- C++学习——继承
- c语言中预编译
- c++学习——类
- C++学习——函数
- 1012. 数字分类 (20)