首页 「VC从excel读取数据打印到固定位置」

「VC从excel读取数据打印到固定位置」

举报
开通vip

「VC从excel读取数据打印到固定位置」                  广丰鄂摘要:            程序利用微软提供的excel操作的库函数读入数据,再调用MFC中的CDC类进行固定位置打印。内容:程序主要分两步:第一步从excel读取数据。第二步把excel读入的数据打印到纸张的固定位置。从excel读取数据一:准备工作开始新建基于对话框的工程,记得在第四个向导中选择作为静态链接库导入。新建好之后导入excel操作库函数,依次选择View->ClassWizard->Add NewClass->From atypelibrary。在弹出的对...

「VC从excel读取数据打印到固定位置」
                  广丰鄂摘要:            程序利用微软提供的excel操作的库 关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函 数读入数据,再调用MFC中的CDC类进行固定位置打印。内容:程序主要分两步:第一步从excel读取数据。第二步把excel读入的数据打印到纸张的固定位置。从excel读取数据一:准备工作开始新建基于对话框的工程,记得在第四个向导中选择作为静态链接库导入。新建好之后导入excel操作库函数,依次选择View->ClassWizard->Add NewClass->From atypelibrary。在弹出的对话框中选择装excel的安装目录,选择excel.exe,然后添加类,主要类型有_Applicaiton,Workbooks, _Workbook,Worksheets,_Wordsheet,Range类,其他类型可根据需要自己添加。Excel接口类中层次如下所示:  -_Application -Workbooks工作薄集合ﻫ-_Workbook 工作薄ﻫ -Worksheets工作 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 集合 -_Worksheet工作表ﻫ     -Range单元格区域(在程序中可能还会使用到word类库,导入步骤一样,添加的类有_Application, Documents,_Document,Selection, 因为word中的类可能与excel中的类名有冲突,可以在冲突的类中添加命名空间,在头文件和源文件中重复的类都包含到一个命名空间,这样就可以有效解决导入两个不同库而出现的类同名的问题)导入excel库后,可以先看下导入的类提供的函数有哪些,一般可以根据其名字判断该函数的作用,如果不清楚你要做的步骤应该包含哪些函数,可以试下excel中提供的宏:先打开excel应用程序,点击工具->宏->录制宏,开始录制。进行你想要的操作,比如多打开工作博,或者添加工作簿,或者其他操作,操作结束后,点击结束宏。查看录制的宏,点击工具->宏->宏。。。查看宏,本操作是一个已存在的文件,得到的宏如图1所示:图1打开存在文件的宏 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 宏,发现打开文件是在Wordbooks类的操作,使用的是Workbooks中的Open函数,然后可以查看导入的库中的Workbooks下的Open函数,选择正确的参数,即可执行打开文件操作。Workbooks下的Open函数原型如下:PDISPATCHWorkbooks::Open(LPCTSTR,constVARIANT&UpdateLinks, constVARIANT&ReadOnly,const VARIANT&Format,constVARIANT&Password,const VARIANT&WriteResPassword,constVARIANT&IgnoreReadOnlyRecommended,constVARIANT&Origin,constVARIANT& Delimiter,constVARIANT& Editable, constVARIANT&Notify,const VARIANT&Converter,constVARIANT&AddToMru,constVARIANT& Local,constVARIANT&CorruptLoad);会发现类中函数的参数几乎都是VARIANT类型的参数,Variant 是一种特殊的HYPERLINK""数据类型,除了定长HYPERLINK""String数据及用户定义类型外,可以包含任何种类的数据。Variant也可以包含HYPERLINK""Empty、Error、HYPERLINK""Nothing及HYPERLINK""Null等特殊值。可以用HYPERLINK""VarType函数或HYPERLINK""TypeNameHYPERLINK ""函数来决定如何处理 Variant中的数据。可能会对这些类型不太了解,不过也没关系,碰到不明白的参数,不知道要填什么的时候,可以使用默认参数,默认参数可定义为如下:COleVariant vTrue((short)TRUE);COleVariant vFalse((short)FALSE);COleVariantvOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);准备工作就算完成了,接着就是正式使用编写代码操作excel了。二:正式操作:首先打开工程名+Dlg结尾的对话框源文件,在头部添加#include“excel.h”和#include“atlbase.h”,要在文件中使用excel库函数,首先必须在此文件包含excel的头文件,atlbase是为了操作简单。在功成名+App结尾的源文件中的InitInstance中加入如下代码:if(!AfxOleInit()){ﻩAfxMessageBox("初始化Ole失败!");returnFALSE;}在想要执行excel操作的程序函数或消息响应代码中添加对excel的代码。首先定义类的对象:spaceExcel::_ApplicationexcelApp;WorkbooksexcelWorkBooks;_WorkbookexcelWorkBook;ﻩWorksheetsexcelWorkSheets;ﻩ_WorksheetexcelWorkSheet;ﻩRangeexcelRange,usedRange;在_Application类中添加了一个命名空间并把此类包含在命名空间中。B.打开excel应用程序:if(excelApp == NULL){ﻩif(!excelApp.CreateDispatch(_T("Excel.Application")))ﻩﻩ{ﻩﻩAfxMessageBox("系统检测到您的电脑尚未安装excel!,请先安装excel");ﻩﻩreturn;}ﻩ}如果想要看到此excel表格,可以在花括号后面添加:excelApp.SetVisible(TRUE);excelApp.SetUserControl(TRUE);//和word的区别。如果不加这句excel一闪就关C.获得工作簿集合,工作簿,工作表集合,和工作表:excelWorkBooks=excelApp.GetWorkbooks();excelWorkBook=excelWorkBooks.Open(m_excelPathName,vOpt,vTrue,vOpt, vOpt,vOpt,vOpt, vOpt,vOpt,vFalse,vOpt,vOpt,vOpt,vOpt,vOpt);excelWorkSheets=excelWorkBook.GetWorksheets();excelWorkSheet=excelWorkSheets.GetItem(COleVariant((short)1));具体参数和函数可参考类库。D.获得已使用的行,列,得到行列的使用数目:usedRange =excelWorkSheet.GetUsedRange();excelRange =usedRange.GetRows();longiRowNum= excelRange.GetCount();excelRange=usedRange.GetColumns();longiColumnNum= excelRange.GetCount();E.获得每个单元格的值:VARIANTret;ret= excelRange.GetValue(vOpt);COleSafeArraysa(ret);ﻩlonglNumRows;long lNumCols;ﻩsa.GetUBound(1,&lNumRows);ﻩsa.GetUBound(2, &lNumCols);long index[2];ﻩVARIANTval;CStringstr="";introw,column;for(row=m_startLocation;row <=iRowNum; row++){ﻩﻩfor(column=1;column <=iColumnNum;column++){ﻩﻩindex[0]=row;index[1]=column;ﻩﻩﻩsa.GetElement(index,&val);ﻩswitch(val.vt){ﻩcaseVT_R8:ﻩstr.Format("%.2f", val.dblVal);ﻩﻩbreak;ﻩcaseVT_BSTR:ﻩstr = (CString)val.bstrVal;ﻩbreak;ﻩﻩcaseVT_EMPTY:ﻩﻩstr ="";ﻩﻩbreak;ﻩ}ﻩstringArray.Add(str);ﻩ//以CString保存单元格值ﻩ}}读取操作完成,如果要保存读取数据,可以使用CStringArray类型保存。打印部分:刚开始,不知道如何打印,网上百度,对于基于文档类型的工程实现打印很简单,但是基于对话框打印的就蛮复杂,看不怎么懂,网上代码也比较少。因此跑到学校图书馆去借书看,发现书上的简单也容易多了。通过CDC类自己编写打印功能。准备工作分辨率:分辨率是一个表示平面图像惊喜程序的概念,通常以横向和纵向点的数量来衡量的,表示水平点*垂直点的形式,在一个平面内,显示的点越多,分辨率就越高,显示的图像越细致,分辨率的种类有很多,主要了解下屏幕分辨率和设备分辨率。屏幕分辨率:觉得出现在屏幕上的信息数量(以像素为单位)的设置,低分辨率能使屏幕上项目大一些,但屏幕区域会变小,高分辨率扩大了整个屏幕区域,但单个项目会变小。设备分辨率:又称输出分辨率,指的是各类输出设备每英寸可产生的点数,如显示器,喷墨打印机,激光打印机,绘图仪的分辨率。这种分辨率通过DPI衡量,PC显示器的设备分辨率一般在60~120DPI之间,而打印设备的分辨率在360~1440DPI之间。映射模式:因为分辨率的不同,因此需要一种映射模式来解决这个问题,使打印效果和屏幕上显示的相同。映射模式反映了逻辑设备单位与实际物理坐标单位之间的对应转换关系,映射模式可通过设备环境类的一个成员函数SetMapMode来设置。VirtualintSerMapMode(intnMapMode);具体参数可参见MSDN。正式操作:添加一个按键,响应打印操作。在响应函数内部进行如下操作:获取设备上下文。如果已经知道打印机的设备名称,可通过CDC类中的CreateDC方法创建打印机的设备上下文。CDCtempdc;tempdc.CreateDC(“”,“HP LaserJet 1020”,“”,“”);具体参数可参见msdn。B. 如果想要使用打印机设备而不知道设备名称,可以调用打印对话框使用户选择打印机,然后调用CPrintDialog类的GetPrinterDC方法获得设备上下文。DWORD dwflags=PD_PAGENUMS|PD_HIDEPRINTTO;CPrintDialogdlg(false, dwflags,NULL);If(dlg.DoModal()==IDOK){  CDC dc; dc.Attatch(dlg.GetPrinterDC());}C.如果不想选择打印机,也可以使应用程序调用当前机器默认的打印机,可以通过CPritDialog类的GetPrinterDC方法来实现,或者在构造打印机对话框时设置其具有PD_RETURNDEFAULT风格。DWORDdwflags=PD_PAGENUMS|PD_HIDEPRINTTOFILE |PD_RETURNDEFAULT;CPrintDialogdlg(false,dwflags,NULL);dlg.GetDefaults();dlg.GetPrinterDC();获得了设备上下文,接下来打印文本信息就很简单了。直接调用设备上下文类中提供的TextOut函数直接打印输出字符就可以了。不过为了准确定位,还得有一个好的映射:首先定义个CDC* pDC =GetDC();用于获得对话框的的大小。然后用打印设备上下文CDCdc;获得他们之间的映射关系:doubleratex=dc.GetDeviceCaps(LOGPIXELSX)/pDC->GetDeviceCaps(LOGPIXELSX);double ratey= dc.GetDeviceCaps(LOGPIXELSY)/pDC->GetDeviceCaps(LOGPIXELSY);这个程序采用的是打印编辑框,把所有的编辑框ID设置为1,2,3。。。便于操作,定义两个CRect对象:一个是打印区域的大小,一个是编辑框的大小,获得他们的大小,并根据编辑框的位置在固定位置上打印编辑框的文本信息,具体代码如下:CRectrect,framerect;m_printFrame.GetWindowRect(&framerect);ﻩchar classname[255];ﻩfor(inti=1;i<=18;i++)ﻩ{ﻩCWnd*control =this->GetDlgItem(i);if(NULL!=control)ﻩﻩ{ﻩCStringstr;ﻩ//CFontfont;control->GetWindowText(str);ﻩcontrol->GetWindowRect(&rect);GetClassName(control->GetSafeHwnd(),classname,255);ﻩﻩﻩﻩif(strcmp(classname,"Edit")==0)ﻩ{ﻩﻩﻩﻩﻩ//ﻩfont.CreatePointFont(200* ratex,"宋体");ﻩﻩﻩdc.TextOut((rect.left-framerect.left)*ratex,(rect.top - framerect.top) * ratey,str);ﻩﻩ}ﻩﻩ}ﻩﻩ}ﻩﻩm_font.DeleteObject();ﻩdc.EndDoc();可以使用DEVMODE结构控制打印。DEVMODE结构可以在msdn中查看。如改变文字方向:DWORDdwflags=PD_ALLPAGES| PD_NOPAGENUMS |PD_USEDEVMODECOPIES|PD_SELECTION|PD_HIDEPRINTTOFILE|PD_RETURNDEFAULTCPrintDialogdlg(false,dwflags,NULL);If(dlg.DoModal()==IDOK){LPDEVMODEdv=dlg.GetDevMode();If(isHengXiang){ dv->dmOrientation=DMORIENT_LANDSCAPE;}else{dv->dmOrientation=DMORIENT_PORTRAIT;}CDCdc;dc.Attach(dlg.GetPrinterDC());dc.Reset(dv);}总结:有这两个操作再加上MFC的一些基本操作和控件处理,就可以完成从excel中读出数据并以特定格式打印到打印纸上。其实,如果要把excel数据用特定格式打印到纸面上,可以不用这么复杂,可以直接用excel直接完成上面的两个步骤。不过excel不怎么熟悉。没有具体步骤。参考:从excel读数据主要参考百度出来的各种网页上的代码,很详细,也很简单。打印操作参考书:VisualC++开发实战宝典, 宋珅等编著,清华大学出版社2010年1月第1版。ISBN:9787302209058
本文档为【「VC从excel读取数据打印到固定位置」】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
洛衣含
暂无简介~
格式:doc
大小:33KB
软件:Word
页数:7
分类:生活休闲
上传时间:2022-02-09
浏览量:2