pc操作系统情况:
Windows XP,office 2003,vc6
经过半下午的搜索发现了vc操作Excel的几种方法
1、ODBC。
暂时还没有试。
2、OLE,即com的方式。
这种方法可能和Excel的版本有关系。
在网上下载了一个基于office2000的代码,在自己的电脑上编译后,可以运行。
自己建立一个工程,
1)按ctrl-w,add class,from a type library,选择目录C:/Program Files/Microsoft Office/OFFICE11/XL5EN32.OLB,在Confirm Classes中选择Application,Range,Workbook,Workbooks,Worksheet,Worksheets后确认。
2)在App::InitInstance()中增加com初始化。
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持库失败!");
exit(1);
}
com的释放
CoUninitialize();
3)在dlg.cpp中添加
#include "xl5en32.h"
4)将如下代码(office 2000 可用代码)
Application ExcelApp;
Workbooks wbsMyBooks;
Workbook wbMyBook;
Worksheets wssMysheets;
Worksheet wsMysheet;
Range rgMyRge;
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
exit(1);
}
//ExcelApp.SetVisible(false);
VARIANT tmp;
tmp.boolVal=false;
ExcelApp.SetVisible(tmp);
//利用模板文件建立新文档
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CString strPath = path;
strPath += "//template1";
wbsMyBooks.AttachDispatch(ExcelApp.GetActiveWorkbook(),true);
wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strPath)));
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
//添加模板个数
for(int i=0;i<4;i++){
wsMysheet.Copy(vtMissing,_variant_t(wsMysheet));
}
CString str1;
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
str1 = "第1页";
wsMysheet.SetName(str1);
for(i=0;i<wssMysheets.GetCount()-1;i++){
wsMysheet = wsMysheet.GetNext();
str1.Format("第%d页",i+2);
wsMysheet.SetName(str1);
}
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("第1页")),true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
//设置1行1列的单元的值
CString str=_TEXT("21:12");
rgMyRge.SetItem(_variant_t((long)7),_variant_t((long)3),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)9),_variant_t((long)3),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)7),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)8),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)9),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)10),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)11),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)12),_variant_t((long)4),_variant_t(str));
//将表格保存
strPath = path;
strPath += "//ylhexcel.xls";
wsMysheet.SaveAs(strPath,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing);
ExcelApp.SetVisible(true);
wbMyBook.PrintPreview(_variant_t(false));
//释放对象
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
这样之后会有很多异常。
验证了和office 的版本有关系。
3、基于Excel文件格式的控制。
暂时还没有试。
Windows XP,office 2003,vc6
经过半下午的搜索发现了vc操作Excel的几种方法
1、ODBC。
暂时还没有试。
2、OLE,即com的方式。
这种方法可能和Excel的版本有关系。
在网上下载了一个基于office2000的代码,在自己的电脑上编译后,可以运行。
自己建立一个工程,
1)按ctrl-w,add class,from a type library,选择目录C:/Program Files/Microsoft Office/OFFICE11/XL5EN32.OLB,在Confirm Classes中选择Application,Range,Workbook,Workbooks,Worksheet,Worksheets后确认。
2)在App::InitInstance()中增加com初始化。
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持库失败!");
exit(1);
}
com的释放
CoUninitialize();
3)在dlg.cpp中添加
#include "xl5en32.h"
4)将如下代码(office 2000 可用代码)
Application ExcelApp;
Workbooks wbsMyBooks;
Workbook wbMyBook;
Worksheets wssMysheets;
Worksheet wsMysheet;
Range rgMyRge;
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
exit(1);
}
//ExcelApp.SetVisible(false);
VARIANT tmp;
tmp.boolVal=false;
ExcelApp.SetVisible(tmp);
//利用模板文件建立新文档
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CString strPath = path;
strPath += "//template1";
wbsMyBooks.AttachDispatch(ExcelApp.GetActiveWorkbook(),true);
wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strPath)));
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
//添加模板个数
for(int i=0;i<4;i++){
wsMysheet.Copy(vtMissing,_variant_t(wsMysheet));
}
CString str1;
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
str1 = "第1页";
wsMysheet.SetName(str1);
for(i=0;i<wssMysheets.GetCount()-1;i++){
wsMysheet = wsMysheet.GetNext();
str1.Format("第%d页",i+2);
wsMysheet.SetName(str1);
}
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("第1页")),true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
//设置1行1列的单元的值
CString str=_TEXT("21:12");
rgMyRge.SetItem(_variant_t((long)7),_variant_t((long)3),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)9),_variant_t((long)3),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)7),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)8),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)9),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)10),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)11),_variant_t((long)4),_variant_t(str));
rgMyRge.SetItem(_variant_t((long)12),_variant_t((long)4),_variant_t(str));
//将表格保存
strPath = path;
strPath += "//ylhexcel.xls";
wsMysheet.SaveAs(strPath,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing);
ExcelApp.SetVisible(true);
wbMyBook.PrintPreview(_variant_t(false));
//释放对象
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
这样之后会有很多异常。
验证了和office 的版本有关系。
3、基于Excel文件格式的控制。
暂时还没有试。