A: 从classwizard中add class处from type library,去office的安装目录下引入excel.exe(这是office 2003的选择,其他版本都是用olb文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着excel文件的一个个部分,常用的有这几个_application,workbooks,_workbook,worksheets,_worksheet,Range,它们分别代表不同的意义._application代表了EXCEL服务器,workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks), _workbook就是一个表,相当于MDI中的一个视窗, worksheets表示所有的表单,每个表都可能有很多表单(建立一个Excel文件之后,打开,可以看到有sheet1,sheet2等,所有这些sheetn就组成了worksheets), _worksheet就表示一个表单, range表示元素的集合. 搞清楚上面这几个名词的意思非常重要.
B,在dlg.h中声明下面几个变量:
_Application exlapp; //组件服务器的各个classes _Workbook wbk; Workbooks wbks; _Worksheet wht; Worksheets whts; LPDISPATCH lpDisp; 并在app.cpp的InitInstance方法中加入下面两句AfxInitOle(); AfxEnableControlContainer();
C,这里我没有像上面一样完全用程序来生成一个Excel文件,而是在开始时就在当前目录下生成了一个Excel文件,在对话框上我设置了两个按钮,下面是"显示"按钮的代码: //创建Excel服务器 if(!exlapp.CreateDispatch("Excel.Application")) { AfxMessageBox("无法启动Excel服务器!"); return; } COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR); exlapp.SetVisible(TRUE);//使Excel可见 exlapp.SetUserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝. //Open an excel file char path[MAX_PATH]; GetCurrentDirectory(MAX_PATH,path); CString strPath = path; strPath += "\\VCOpExcel";
wbks.AttachDispatch(exlapp.GetWorkbooks()); lpDisp=wbks.Open(strPath, avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar); wbks.ReleaseDispatch(); exlapp.ReleaseDispatch();
D,与上面第一种方法一样,可以插入记录:
UpdateData(); //读入数据 if (""==m_name) //判断名字输入有效 { MessageBox("Please input a right name"); return; } if (0>=m_age||100<=m_age) //判断年龄输入有效 { MessageBox("Please input a right age"); return; }
char *p=strupr(_strdup(m_gener)); if (strcmp(p,"FEMALE")&&strcmp(p,"MALE")) //判断性别输入有效 { MessageBox("Please input a right gener"); return; }
Range range; Range usedRange; COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR); if(!exlapp.CreateDispatch("Excel.Application")) //启动服务器 { AfxMessageBox("无法启动Excel服务器!"); return; } char path[MAX_PATH]; GetCurrentDirectory(MAX_PATH,path); CString strPath = path; strPath += "\\VCOpExcel"; wbks.AttachDispatch(exlapp.GetWorkbooks()); lpDisp=wbks.Open(strPath, //初始化. avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar); wbk.AttachDispatch(lpDisp); whts.AttachDispatch(wbk.GetWorksheets()); lpDisp=wbk.GetActiveSheet(); wht.AttachDispatch(lpDisp); usedRange.AttachDispatch(wht.GetUsedRange()); range.AttachDispatch(usedRange.GetRows()); long iRowNum=range.GetCount();//已经使用的行数 range.AttachDispatch(wht.GetCells()); range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(1)),COleVariant(m_name)); range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(2)),COleVariant(m_age)); range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(3)),COleVariant(m_gener)); wbk.Save(); wbk.Close(avar,COleVariant(strPath),avar); wbks.Close(); exlapp.Quit();
(完)
|