已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最近刚完成一个例子,受益不菲,和大家分享一下。VC的Excel编程操作,总结:(结合网络资源)利用VC操作Excel的方法至少有两种1 .利用ODBC把Excel文件当成数据库文件,来进行读、写、修改等操作,网上有人编写了CSpreadSheet类,提供支持。(不太能理解CSpreadSheet)2. 利用Automation(OLD Automation)方法。将Excel当成组件服务器,利用VBA。又分为基于MFC的和SDK两种。(制作报表适用) 主要研究了一下第二种基于MFC的OLE编程方法。一、Excel的对象模型 Application:代表应用程序本身。即Excel应用程序 Workbooks:是Workbook 的集合,代表了工作薄。 Worksheets:是Worksheet的集合,是Workbook的子对象。 Range:是Worksheet的子对象,可以理解为Sheet中一定范围的单元格。 Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。二、VC操作Excel的初始化过程1、导入Excel库文件。 使用VC6.0的同志们可进行一下操作获取Excel库文件:1. 启动VC 6.0,打开新建对话框,新建一个MFC AppWizard(exe)工程,这里工程明设置为TestExcel。2. 进入MFC 应用程序向导,选择 基本对话框,直接点击完成,工程文件结构如下图: 3. 打开MFC ClassWizard窗口(查看建立类向导),选择Automation,单击Add Class按钮,选择From a type library.,弹出文件选择对话框,之后定位到Microsoft Office的安装目录(通常为C:Program FilesMicrosoft OfficeOffice),选择(excel.exe适用于Excel2003;EXCEL9.OLB适用于Excel2000),确定后,弹出Confirm Classes窗口,(在不知道会使用到哪些类的情况下,)选择列表中的所有类,单击OK按钮。4.返回编辑器,查看工程文件,可发现多了EXCEL9.H及EXCEL9.CPP两个文件。 使用VS2005的同志们可从百度文库直接下载我已上传的Excel库文件(excel.h和excel.cpp)。将Excel库文件加入到项目后,进行如下操作:1. 打开stdafx.h头文件确保包含如下头文件: #include #include excel.h2. 打开TestExcel.cpp文件,修改CTestExcelApp:InitInstance(),加入如下代码: BOOL CTestExcelApp:InitInstance() /初始化COM组件 if( !AfxOleInit() ) AfxMessageBox(初始化Ole出错!); return FALSE; AfxEnableControlContainer(); . . return FALSE;为保证编译时不产生重复定义错误,打开excel.h文件,在文件开始位置加入如下代码: #if !defined _HEAD_FILE_EXCEL_ #define _HEAD_FILE_EXCEL_ 相应的,在文件末尾加入: #endif2、操作EXCEL文件1. 选择ResourceView工作区,打开IDD_TESTEXCEL_DIALOG,在对话框中添加一个按钮控件Button1,双击它,生成一个Button1 Click事件的处理函数:void CTestExcelDlg:OnButton1() / TODO: Add your control notification handler code here 2. 在OnButton1()函数中,添加代码:void CTestExcelDlg:OnButton1() / 制单CComboBox *pCmb = (CComboBox *)GetDlgItem(IDC_COMBO1);int pos = pCmb-GetCurSel();if (pos = 0)MessageBox(TEXT(请选择销售订单号!), TEXT(注意);return ;else/参数定义不再赘述CEdit *pEdt = (CEdit *)GetDlgItem(IDC_EDIT1); pCmb-GetLBText(pos,m_oOrderID);/订单号pEdt-GetWindowTextW(m_oDeliveryDate);/交货日期pEdt = (CEdit *)GetDlgItem(IDC_EDIT2);pEdt-GetWindowTextW(m_oOrderTime);/接单日期pEdt = (CEdit *)GetDlgItem(IDC_EDIT3);pEdt-GetWindowTextW(m_oOrderCode);/编号pEdt = (CEdit *)GetDlgItem(IDC_EDIT4);pEdt-GetWindowTextW(m_oCompanyName);/pEdt = (CEdit *)GetDlgItem(IDC_EDIT5);pEdt-GetWindowTextW(m_oDept);/pEdt = (CEdit *)GetDlgItem(IDC_EDIT6);pEdt-GetWindowTextW(m_oLinkman);/pEdt = (CEdit *)GetDlgItem(IDC_EDIT7);pEdt-GetWindowTextW(m_oRecorder);/pEdt = (CEdit *)GetDlgItem(IDC_EDIT8);pEdt-GetWindowTextW(m_oAddress);/pEdt = (CEdit *)GetDlgItem(IDC_EDIT9);pEdt-GetWindowTextW(m_oPhone);/pEdt = (CEdit *)GetDlgItem(IDC_EDIT10);pEdt-GetWindowTextW(m_oPostCode);/pEdt = (CEdit *)GetDlgItem(IDC_EDIT11);pEdt-GetWindowTextW(m_oSalesman);/ /绝对路径/ / OrderReport.xls文件放在项目生成文件夹(Debug文件夹或Release /文件夹内),发布时,别忘记添加到发布文件中。GetModuleFileName/方法获取的是项目生成文件的根目录.CString fileName(LOrderReport.xls);TCHAR exeFullPathMAX_PATH; CString strPath; GetModuleFileName(NULL,exeFullPath,MAX_PATH); strPath=(CString)exeFullPath; int position=strPath.ReverseFind(); strPath=strPath.Left(position+1); fileName=strPath+fileName;/_Application app; Workbooks books;_Workbook book;Worksheets sheets;_Worksheet sheet;Range range;Font font;Range cols;LPDISPATCH lpDisp; /接口指针COleVariant covOptional(long)DISP_E_PARAMNOTFOUND, VT_ERROR); if( !app.CreateDispatch(LExcel.Application) )this-MessageBox(L无法创建Excel应用!);return;books=app.GetWorkbooks();lpDisp = books.Open(fileName,covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);book.AttachDispatch(lpDisp);sheets=book.GetSheets();/生成报表页数/ / m_list1为Gridview,每页报表之存放十个记录行int itemCount = m_list1.GetItemCount();int sheetCount = 0;if (itemCount%10) = 0)sheetCount = itemCount/10;elsesheetCount = itemCount/10 + 1;/for ( int i = 1; i = sheetCount; i+ )sheet=sheets.GetItem(COleVariant(short)i);/获取工作表页 /设置报表表头/range=sheet.GetRange(COleVariant(LM1),COleVariant(LN1);range.SetColumnWidth(_variant_t(long)10);/设置列宽从上往下range=sheet.GetRange(COleVariant(LB2),COleVariant(LC2);range.SetValue2(COleVariant(m_oOrderTime);range=sheet.GetRange(COleVariant(LG2),COleVariant(LG2);range.SetValue2(COleVariant(m_oOrderID);range=sheet.GetRange(COleVariant(LM2),COleVariant(LM2);range.SetValue2(COleVariant(m_oOrderCode);range=sheet.GetRange(COleVariant(LB3),COleVariant(LB3);range.SetValue2(COleVariant(m_oCompanyName);range=sheet.GetRange(COleVariant(LF3),COleVariant(LI3);range.SetValue2(COleVariant(m_oDept);range=sheet.GetRange(COleVariant(LK3),COleVariant(LL3);range.SetValue2(COleVariant(m_oLinkman);range=sheet.GetRange(COleVariant(LN3),COleVariant(LN3);range.SetValue2(COleVariant(m_oRecorder);range=sheet.GetRange(COleVariant(LB4),COleVariant(LB4);range.SetValue2(COleVariant(m_oAddress);range=sheet.GetRange(COleVariant(LF4),COleVariant(LI4);range.SetValue2(COleVariant(m_oPhone);range=sheet.GetRange(COleVariant(LK4),COleVariant(LL4);range.SetValue2(COleVariant(m_oPostCode);range=sheet.GetRange(COleVariant(LN4),COleVariant(LN4);range.SetValue2(COleVariant(m_oSalesman); /对记录行进行分页填充/CString num;for (int j = (i-1)*10; j 10*i; j+)num.Format(L%d,(j%10 + 7);m_oProductName = m_list1.GetItemText(j,0);if (m_oProductName = _T()break;m_oProductType = m_list1.GetItemText(j,1);m_oNum = m_list1.GetItemText(j,2);m_oRemark = m_list1.GetItemText(j,3);range=sheet.GetRange(COleVariant(LA+num),COleVariant(LA+num);range.SetValue2(COleVariant(m_oProductName);range=sheet.GetRange(COleVariant(LC+num),COleVariant(LC+num);range.SetValue2(COleVariant(m_oProductType);range=sheet.GetRange(COleVariant(LE+num),COleVariant(LE+num);range.SetValue2(COleVariant(m_oNum);/range=sheet.GetRange(COleVariant(LG+num),COleVariant(LG+num);/range.SetValue2(COleVariant();/价格range=sheet.GetRange(COleVariant(LI+num),COleVariant(LI+num);range.SetValue2(COleVariant(m_oDeliveryDate);range=sheet.GetRange(COleVariant(LL+num),COleVariant(LL+num);range.SetValue2(COleVariant(m_oRemark);cols=range.GetEntireColumn();cols.AutoFit(); app.SetVisible(TRUE); app.SetUserControl(TRUE);结果如下图所示:注:Excel模板需要在Excel中手动制作,且制作完成后制作多个副本,根据情况修改副本名称。Worksheet从左往右排列1,2,3/ 465465465.cpp : Defines the entry point for th
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园日常活动设计及安全管理
- 高校电子资源管理使用指南
- 工作失误责任认定及改进措施报告范文
- 金融机构信贷风险控制措施
- 小学语文写作缩句专项训练题库解析
- 行政助理工作流程与效率提升指南
- 大型商超人员调度与排班管理方案
- 初中三年级语文期末复习试题
- 高校科研项目资金申报流程解读
- 餐饮企业员工培训方案
- 玄武湖主题公园项目运营管理方案
- 减少我们的碳排放-课件(17张)
- 创伤后应激障碍课件
- 体能训练概论(NSCA)
- Q∕SY 1736-2014 评标方法选择和评标标准编制规范
- 油套管主要技术标准、检测项目与尺寸公差范围
- 食品风味化学-6食品风味的调整和香味料
- 国家开放大学电大专科《美学与美育》简答题综合论述题题库及答案
- 闵行区加强住宅小区综合治理三年行动计划(2015-2017)
- ZZG22高频开关整流器 - 图文-
- 珍珠棉技术参数
评论
0/150
提交评论