




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VisualFoxpro中如何实现对EXCEL表格的操作VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作。比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功能进行报表打印。这就需要我们在VFP中直接来控制Excel。下面就在开发VFP应用项目时对Excel的控制作一下介绍:1.创建Excel对象oExcel=CREATEOBJECT("Excel.application")2.添加新工作簿oExcel.Workbooks.add3.设置第3个工作表为激活工作表oExcel.Worksheets("sheet3").Activate4.打开指定工作簿oExcel.Workbooks.Open("c:\temp\ll.xls")5.显示Excel窗口oExcel.visible=.t.6.更改Excel标题栏oExcel.Caption="VFP应用程序调用MicrosoftExcel"7.给单元格赋值oExcel.cells(1,4).value=XM(XM为数据库字段名)8.设置指定列的宽度(单位:字符个数)oExcel.ActiveSheet.Columns(1).ColumnWidth=59.设置指定行的高度(单位:磅)oExcel.ActiveSheet.Rows(1).RowHeight=1(设定行高为1磅,1磅=0.035厘米)oExcel.ActiveSheet.Rows("50:100").RowHeight=1&&设置第50行至100行的高度10.在第18行之前插入分页符oExcel.Worksheets("Sheet1").Rows(18).PageBreak=111.在第4列之前删除分页符oExcel.ActiveSheet.Columns(4).PageBreak=012.指定边框线宽度(Borders参数如下)ole.ActiveSheet.Range("b3:d3").Borders(2).Weight=313.设置四个边框线条的类型oExcel.ActiveSheet.Range("b3:d3").Borders(2).LineStyle=1(其中Borders参数:1-左、2-右、3-顶、4-底、5-斜、6-斜/;LineStyle值:1与7-细实、2-细虚、4-点虚、9-双细实线)14.设置页眉oExcel.ActiveSheet.PageSetup.CenterHeader="报表1"14.设置页眉(字体大小)oExcel.ActiveSheet.PageSetup.CenterHeader="&50报表1"&&'&'后面的50可以自定义,表示字体的大小15.设置页脚oExcel.ActiveSheet.PageSetup.CenterFooter="第&P页"15.设置页脚(字体大小)oExcel.ActiveSheet.PageSetup.CenterFooter="&28第&P页"&&'&'后面的28可以自定义,表示字体的大小16.设置页眉到顶端边距为2厘米oExcel.ActiveSheet.PageSetup.HeaderMargin=2/0.03517.设置页脚到底边距为3厘米oExcel.ActiveSheet.PageSetup.FooterMargin=3/0.03518.设置顶边距为2厘米oExcel.ActiveSheet.PageSetup.TopMargin=2/0.03519.设置底边距为4厘米oExcel.ActiveSheet.PageSetup.BottomMargin=4/0.03520.设置左边距为2厘米oExcel.ActiveSheet.PageSetup.LeftMargin=2/0.03521.设置右边距为2厘米oExcel.ActiveSheet.PageSetup.RightMargin=2/0.03522.设置页面水平居中oExcel.ActiveSheet.PageSetup.CenterHorizontally=.t.23.设置页面垂直居中oExcel.ActiveSheet.PageSetup.CenterVertically=.t.24.设置页面纸张大小(1-窄行851139-宽行14119:A4)oExcel.ActiveSheet.PageSetup.PaperSize=125.打印单元格网线oExcel.ActiveSheet.PageSetup.PrintGridlines=.t.26.拷贝整个工作表oExcel.ActiveSheet.UsedRange.Copy27.拷贝指定区域oExcel.ActiveSheet.Range("A1:E2").Copy28.粘贴oExcel.WorkSheet("Sheet2").Range("A1").PasteSpecial29.在第2行之前插入一行oExcel.ActiveSheet.Rows(2).Insert30.在第2列之前插入一列oExcel.ActiveSheet.Columns(2).Insert31.设置字体oExcel.ActiveSheet.Cells(2,1).Font.Name="黑体"32.设置字体大小oExcel.ActiveSheet.Cells(1,1).Font.Size=2533.设置字体为斜体oExcel.ActiveSheet.Cells(1,1).Font.Italic=.t.34.设置整列字体为粗体oExcel.ActiveSheet.Columns(1).Font.Bold=.t.35.清除单元格公式oExcel.ActiveSheet.Cells(1,4).ClearContents36.打印预览工作表oExcel.ActiveSheet.PrintPreview37.打印输出工作表oExcel.ActiveSheet.PrintOut38.oExcel.CommandBars(1).Controls(1).accChild(18).Execute&&打印(菜单序号18为Excel2003的‘打印’项)&&不同版本Excel的菜单序号可以通过以下程序取得*(需要在VFP7.0以上运行)oXls=GETOBJECT("","excel.sheet")XlApp=oXLS.APPLICATIONXlSheet=XlApp.ActiveSheetbars=xlapp.CommandBars.COUNTSTR=''FORi=1TObarsSTR=STR+CHR(13)+ALLTRIM(STR(i))+'、'+xlapp.CommandBars(i).accName+'(NAME:'+xlapp.CommandBars(i).NAME+'INDEX:'+ALLTRIM(STR(xlapp.CommandBars(i).INDEX))+')'bars2=mandbars(i).accChildCountFORj=1TObars2TRYobj=mandbars(i).CONTROLS(j)STR=STR+CHR(13)+''+ALLTRIM(STR(j))+'、'+mandbars(i).CONTROLS(j).accname+'(ID:'+ALLTRIM(STR(xlapp.CommandBars(i).CONTROLS(j).ID))+')'FORk=1TOobj.accChildCountTRYIFNOTEMPTY(obj.CONTROLS(k).accname)STR=STR+CHR(13)+''+ALLTRIM(STR(k))+'、'+obj.CONTROLS(k).accName+'(ID:'+ALLTRIM(STR(obj.CONTROLS(k).ID))+')'ENDIFCATCHEXITENDTRYENDFORCATCHEXITENDTRYENDFORWAITWINDOWSALLTRIM(STR(i))+'/'+ALLTRIM(STR(bars))+''+STR(i/bars*100,10,2)+'%'NOWAITENDFORSAVETOXLS.txtALLLIKESTRMODIFYCOMMANDXLS.txtRETURN39.工作表另存为oExcel.ActiveWorkbook.SaveAs("c:\temp\22.xls")检测当前目录是否有同名的EXCEL表,如果有先删除,再另存IF!FILE(SYS(5)+CURDIR()+"result.xls")oExcel.ActiveWorkbook.SaveAs(SYS(5)+CURDIR()+"result.xls")ELSElcFileName=loExcel.GetSaveAsFilename("result","Excel(*.xls),*.xls")IF!EMPTY(lcFileName)IFFILE(lcFileName)DELETEFILE(lcFileName)ENDIFoExcel.ActiveWorkbook.SaveAs(lcFileName)ENDIFENDIF40.放弃存盘&&避免出现保存对话框oExcel.ActiveWorkbook.saved=.t.41.存盘oExcel.ActiveWorkbook.save42.关闭工作簿oExcel.Workbooks.close43.退出ExceloExcel.quitRELEASEoExcel&&只有释放对象变量,EXCEL进程才会完全关闭44.合并单元格oExcel.ActiveSheet.Range("A4:B5").MergeCells=.t.45.下列设置大家自己理解Withcrfole.ActiveSheet.PageSetup.LeftHeader=chr(13)+"左页眉".CenterHeader="中页眉".RightHeader="右页眉".LeftFooter="左页脚".CenterFooter="中页脚".RightFooter="右页脚".orientation=1&&1竖排,2横排EndWithWithcrfole.Range("A4:C4").MergeCells=.t..WrapText=.f..Orientation=0.AddIndent=.f..ShrinkToFit=.f.EndWith46.文本对齐oExcel.range("A4:c4").HorizontalAlignment=1&&水平(1-默认、2-靠左、3-居中、4-靠右、5-填充、6=两端对齐、7=跨列居中、8=分散对齐)oExcel.range("A4:c4").VerticalAlignment=2&&垂直(1=靠上、2=居中、3=靠下、4=两端对齐、5=分散对齐)47.拷贝整个工作表(含格式)oExcel.activesheet.cells.copyoExcel.sheets(1).select&&拷贝&&选择第一工作表&&粘贴oExcel.ActiveSheet.PasteoExcel.ActiveSheet.Cells(3,4).value&&ActiveSheet为当前的Sheet工作薄名字,Cells(3,4).value为第3行第4列的值以上控制调用语句在中文VFP5.0企业版下运行通过,运行环境为Excel97及中文Windows9848.显示某个单元格的批注内容oExcel=CREATEOBJECT("Excel.application")oExcel.Workbooks.OPEN("d:\TEST\testa.xls")oExcel.VISIBLE=.T.?oExcel.Range("B5").Comment.Text&&显示B5单元格的批注内容oExcel.Workbooks.CLOSEoExcel.QUITRELEASEoExcel49.oExcel.ActiveSheet.PageSetup.PrintTitleRows="$1:$1"&&每页都打印行标头(每页顶部出现的单元格的行)50.保护工作表:oExcel.ActiveSheet.PROTECT('密码',.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.)51.保护工作薄oExcel.ActiveWorkbook.PROTECT('密码',.T.,.T.)第一个.T.:保护工作簿结构第二个.T.:保护工作簿窗口52.设置允许用户编辑区域oExcel.ActiveSheet.Protection.AllowEditRanges.Add("区域3",oExcel.ActiveSheet.Range("A2:D5"))53.如果不想在宏运行时被无穷无尽的提示和警告消息所困扰,就将本属性设置为.F.oExcel.DisplayAlerts=.F.如果不想在宏运行时被无穷无尽的提示和警告消息所困扰,就将本属性设置为False;这样每次出现需用户应答的消息时,MicrosoftExcel将选择默认应答。如果将本属性设置为False,那么宏运行结束后,MicrosoftExcel并不自动将其设置回True。故当宏运行结束后,都应将本属性设置回True值。54.将当前工作表中的已用区域(只读)存入数组。strPath='D:\TEST\123.xls'LOCALoExceloExcel=CREATEOBJECT("Excel.Application")oExcel.WorkBooks.OPEN(strPath)arrTableInfo=oExcel.ActiveSheet.UsedRange.VALUE&&将当前工作表中的已用区域(只读)存入数组。oExcel.QUITRELEASEoExcelINSERTINTO表名FROMarrTableInfo55.设置excel批注的字体(excel2000实现了,如下:)ole.Range("a3").Comment.Shape.Select&&此命令要求批注的Visible=.t.ole.selection.Font.size=9ole.selection.F="黑体"ole.selection.Font.bold=.f.注:该组命令要求先选中批注框,否则写成ole.Range("a3").Comment.Shape.Font.size=9则出错,不知为何!如何取得当前EXCEL表中工作表的数目及各工作表的名称?CLEARLOCALlnSheetCountoExcel=CREATEOBJECT("EXCEL.APPLICATION")&&创建Excel对象oExcel.WORKBOOKS.OPEN("c:\111\321.xls")&&打开指定工作簿WITHoExcellnSheetCount=.WorkBooks(1).Sheets.Count&&统计工作表数量ENDWITH?'当前EXCEL表中工作表的数目为:'+ALLTRIM(STR(lnSheetCount))FOREACHoMyVarINoExcel.sheets?'当前EXCEL表中工作表的名称分别为'+oMyV&&显示Excel表中所有工作表NEXToMyVaroExcel.WORKBOOKS.CLOSE&&关闭工作簿oExcel.QUIT&&退出Excel获取工作表名称在以下示例中,创建了一个microsoftexcel实例,添加了一个新的工作簿。使用foreach语句显示工作簿中每个工作表的名称。此示例要求在运行示例的机器上正确安装microsoftexcel。oExcel=CREATE("Excel.Application")oExcel.Workbooks.ADDFOREACHoMyVarINoExcel.sheets?oMyVNEXToMyVarExcel报表巧生成巧让FoxPro数据生成Excel报表VisualFoxPro是应用广泛的前台数据库开发平台之一,因此在我们日常工作中时常会遇到DBF数据文件。然而随着办公自动化的普及,越来越多的时候需要将DBF文件转化为Excel电子文档。常用转化方法是在FoxPro中用Copy命令进行格式转化或直接用Excel打开DBF文件。这两种方式虽然都能达到目的,却不能得到格式规范、可以直接打印输出的报表,且输出的Excel文件中,无法对数据类型进行有效转换,极易出现数据统计错误。有没有更好的方法呢?这里有一个更加通用的方法,在VFP中调用Excel,可以由DBF文件直接生成格式如下图所示一样复杂的Excel报表(如图1)。Excel报表具体过程如下:编辑推荐文章●新鲜接触Excel2000XP●Excel2000公式应用的几条经验●Excel2000函数应用之信息函数假设我们要将表Agcallop.dbf文件输出为Excel格式文档,报表形如图1所示。为使通用性更强,页面采用A4纸横向输出,默认字体为宋体10号,页脚处添加页号。部分程序代码如下:m.outfilename=putfile('输出结果','agcallop','xls')&&取导出文件名称ef=CREATEOBJECT('Excel.application')&&调用Excel程序ef.Workbooks.add&&添加工作簿ef.Worksheets("sheet1").Activate&&激活第一个工作表ef.visible=.t.&&显示Excel界面ef.Cells.Select&&选择整张表ef.Selection.Font.Size=10&&设置整表默认字体大小为10select0useagcallop&&选择被导出的表num=reccount()&&求导出总记录数gotopi=5ef.range("F1:K1").Select&&选择标题栏所在单元格ef.Selection.Merge&&合并单元格withef.range("F1")&&设置标题及字体属性.value='客户服务部业务代表工作量情况统计表'.Font.Name="黑体".Font.size=18endwithef.Rows(2).RowHeight=1/0.035&&设置第二行高度为1cmef.range("H2:O2").Select&&选定统计条件栏所在单元格ef.Selection.Merge&&合并单元格ef.range("H2").Font.size=10ef.range("H2").HorizontalAlignment=4&&设置内容对齐方式为右对齐,3为居中,4为右对齐ef.range("H2").value='统计时间:'+dtoc(date())+'打印日期:'+dtoc(date())ef.Rows("3:4").Selectwithef.Selection.HorizontalAlignment=3&&设置3、4行为水平对齐.VerticalAlignment=2&&垂直居中.NumberFormatLocal="@"&&设置3、4行为字符型内容endwithef.Range("A3:A4").Selectef.Selection.Merge&&纵向合并第一列3、4行ef.Range("A3").value='工号'&&设置第一列标题内容ef.Columns("A").Select&&整列选择ef.Selection.HorizontalAlignment=3&&水平居中ef.Columns("A:B").Selectef.Selection.NumberFormatLocal="@"&&设置A、B列为字符型内容ef.Range("B3:B4").Selectef.Selection.Merge&&纵向合并第二列3、4行ef.Range("B3").value='姓名'&&设置第二列标题内容ef.Columns("B").Select&&整列选择ef.Selection.HorizontalAlignment=3&&水平居中ef.Range("C3:E3").Select&&横向合并第三行C-E列ef.Selection.Mergeef.Range("C3").value='话务总量'&&第三行大标题为“话务总量”的列ef.Range("C4").value='电话呼入量'&&“话务总量”下第1个小标题“电话呼入量”ef.Range("D4").value='电话呼出量'&&“话务总量”下第2个小标题“电话呼出量”ef.Range("E4").value='合计'&&“话务总量”下第3个小标题“合计”ef.Range("F3:H3").Selectef.Selection.Mergeef.Range("F3").value='话务总时间'ef.Range("F4").value='呼入时间'ef.Range("G4").value='呼出时间'ef.Range("H4").value='合计'ef.Range("I3:K3").Selectef.Selection.Mergeef.Range("I3").value='单个话务平均时间'ef.Range("I4").value='呼入时间'ef.Range("J4").value='呼出时间'ef.Range("K4").value='合计'ef.Range("L3:L4").Selectef.Selection.Mergeef.Range("L3").value='累计工作时间'ef.Range("M3:M4").Selectef.Selection.Mergeef.Range("M3").value='无效时间'ef.Range("N3:N4").Selectef.Selection.Mergeef.Range("N3").value='录入量'ef.Range("O3:O4").Selectef.Selection.Mergeef.Range("O3").value='有效时间比'接下来通过scan语句,依次为每一行每一列单元格赋值。为了获得更好的打印效果,还需进行页面设置,如标题行、页面居中、横向排版等,还可以加边框线。以上程序在VFP6+Excel2000+Windows2000下调试通过。实际应用中可根据需要对各项参数设置进行相应调整。VFP控制EXCL文件另存为DBF(EXCEL后台运行)fil=Thisform.List1.Value&&其值为一个包含路径的文件名oExcel=CREATEOBJECT('Excel.application')oExcel.Workbooks.Open(fil)&&打开文件oExcel.Selection.AutoFilter&&关闭(如果无则打开)自动筛选oExcel.Range("A1:F1000").Select&&选中从第1行到1000行的前6列数据(另存后只有这些数据)asfil=STRTRAN(UPPER(STRTRAN(fil,SUBSTR(fil,1,RAT('\',fil)),'c:\windows\desktop\cphz\')),'.XLS','.dbf')&&要保存的文件名IFFILE(asfil)DELETEFILE&asfilENDIFoExcel.ActiveWorkbook.SaveAs(asfil,8)&&另存为DBFoExcel.ActiveWorkbook.saved=.t.&&不保存当前EXCEL表oExcel.Workbooks.close&&关闭表oExcel.quit&&退出EXCELRELEASEoExcel&&释放变量*************例子******************lcFileName='D:\TEST.XLS'oExcel=CREATEOBJECT('Excel.application')oExcel.Workbooks.Open('&lcFileName')&&打开文件R=oExcel.SHEETS(1).UsedRange.ROWS.COUNT&&有数据的总行数C=oExcel.SHEETS(1).UsedRange.COLUMNS.COUNT&&有数据的总列数oExcel.Cells(R,C).Select&&选中数据oExcel.Columns.AutoFit&&让所有的列宽都自动调整oExcel.DisplayAlerts=.F.oExcel.ActiveWorkbook.SaveAs('D:\TEST.DBF',8)&&另存为DBFoExcel.ActiveWorkbook.saved=.t.&&不保存当前EXCEL表oExcel.Workbooks.close&&关闭表oExcel.quit&&退出EXCELRELEASEoExcel&&释放变量MESSAGEBOX('Excel文件:D:\TEST.XLS另存为D:\TEST.DBF完成!',64,'信息提示')***********************************虽然用APPENDFROMtx.xlsTYPEXL8可以更简单的追加数据,但有时会导致程序非法错误退出(除非先另存为Excel5.0)'以下我做的一个简单例子,你参考一下'功能:VB调用Excel,将一个Excel文件另存为Dbf。'前提:要安装ExcelDimoExcelAsObjectlcSFileName="D:\test.xls"'源Excel文件名lcDFileName="D:\test1.dbf"'目标Dbf文件名SetoExcel=CreateObject("Excel.Application")'创建Excel对象oExcel.Workbooks.Open(lcSFileName)'打开Excel表R=oExcel.SHEETS(1).UsedRange.ROWS.Count'有数据的总行数C=oExcel.SHEETS(1).UsedRange.Columns.Count'有数据的总列数oExcel.Cells(R,C).Select'选中数据oExcel.Columns.AutoFit'让所有的列宽都自动调整oExcel.DisplayAlerts=Flase'不显示提示框oExcel.ActiveWorkbook.SaveAsFileName:=lcDFileName,FileFormat:=8oExcel.ActiveWorkbook.saved=Ture'不保存当前EXCEL表oExcel.Workbooks.Close'关闭表oExcel.quit'退出EXCELSetoExcel=Nothing'释放对象MsgBox("Excel文件:"&lcSFileName&"另存为"&lcDFileName&"完成!")实用的VFP与EXCEL交互编程摘要:本文介绍了几种实用的VFP与EXCEL交互编程的方法与实例,将VFP强大的数据处理功能与EXCEL优异的制表功能有机地结合起来,大大增强了软件的应用效果。关键词:VFP、EXCEL、DDE、OLE、交互编程。SomeCross_ProgrammingMethodsBetweenVFPandEXCELZouyiming(GansuLanzhouSectionofInstrumentsLanzhouPetrochemicalStaffCollege)Abstract:Theauthorintroducesusinthispapersomepracticalmethodsandinstanceofcross_programmingbetweenVFPandEXCEL.ItextremelyimprovestheirperformancesbycombiningVFP'sdataprocessingfunctionswithEXCEL'sexcellenttabulationfunctions.KeyWords:VFP、EXCEL、OLE、DDE、Cross-ProgrammingVFP(VisualFoxpro)是一种关系型数据库管理系统,由于其强大的数据处理能力及良好的兼容性,使其成为数据库应用程序开发人员的强有力工具,而EXECL则是一种优秀的电子表格处理软件,在兼容性、操作界面、公式运算、图表等方面有着独到的优势。上述两种软件在各自的应用领域均得到广泛的应用,同时上述两种软件还具有良好的交互编程能力,为两者相辅相成、取长补短奠定了良好的基础。本文将结合具体实例介绍几种VFP与EXCEL交互编程的方法,每种方法虽然实现手段各异,但功能相仿。其功能可简述如下:VFP数据表“学生成绩表.DBF”中含“学生姓名”、“语文”、“数学”......等字段,示例程序将从EXCEL工作簿“VFP交互.XLS”之工作表“查询”中用书签“课程名”指定的单元取得欲查询的课程名称,然后在数据表“学生成绩表.DBF”中自动搜索,以找到该门课程不及格的同学名单,最后传送至原EXCEL工作薄形成新的工作表单,同时,新工作表还将以该课程名命名。下列程序均在VFP5.0与EXCEL97中调试通过。因篇幅所限,程序中的错误处理部分略去。一、EXECL驱动VFPEXECL内置的VBA语言(VisualBasicForApplication)为EXECL功能的扩展提供了便利的手段,用户可使用该语言直接驱动VFP完成数据检索等功能。程序首先生成一个VFP对象,然后用VFP的DoCmd方法执行VFP摸索命令串,其摸索结果再借助于VFP的DateToClip方法拷贝至剪切板,最后VBA将其粘贴至工作表的正确位置。SubFoxTest()DimoFoxAsObjectDimSLessonAsStringDimSCommandAsStringSetoFox=CreateObject("VisualFoxPro.Application")'启动VFP,生成VFP对象Sheets("查询").SelectSLesson=Range("课程名")'在名为“课程名”的单元格中得到欲查询的课程名称Sheets.Add'产生新的工作表单ActiveSheet.Name=Slesson'指定工作表单的名称与课程名称相同SCommand="SELECT学号,语文,数学FROMd:\vfp\学生成绩表WHERE"+SLesson+"<60INTOCURSORTEMP"'形成VFP查询命令串oFox.DoCmdScommand'执行VFP命令串oFox.DataToClip"temp",,3'将搜索结果以文本方式拷贝至剪切板Range("a1:a1").Select'指向拷贝目标区域左上角单元ActiveSheet.Paste'粘贴搜索结果EndSub为便于使用,作者在EXECL中自制了一名为“搜索”的工具栏及一名为“开始搜索”的按钮,并将上述宏程序段与自制按钮相关联,按下此按钮即可运行程序并在EXCEL中得到要求的数据。制作工具栏及按钮的方法如下:1.选“工具”/“自定义”菜单,出现自定义对话框;2.选择“工具栏”页框,然后按下“新建”按钮;3.在工具栏对话框中输入“搜索”作为新建工具栏的名称;4.选择“命令”页框,在“类别”列表中选“宏”,在“命令”列表中选“自定义按钮”并将其拖放至新建的“搜索”工具栏;5.按下“更新所选内容”按钮,首先在“命名”栏中填入按钮名称“开始搜索”,然后选择“指定宏”,在随后出现的“指定宏”列表中选择上述宏程序FoxTest()即可实现为该宏指定一个工具栏按钮。二、VFP使用OLE功能驱动EXECLOLE(ObjectLinkingandEmbedding)对象链接与嵌入,是WINDOWS应用程序间相互传递和共享数据的一种有效方法。VFP借助于OLE不仅可共享其它应用程序的数据,而且还能以对象方式直接控制其它应用程序的运行,从而进一步扩展VFP的功能。VFP支持直接在程序中创建、使用和控制OLE对象,实现OLE自动化。作为OLE客户VFP与作为OLE服务器的EXCEL具有良好的编程接口,下述程序段用OLE方式实现所要求的功能。程序首先生成一个EXCEL的OLE对象OleApp以便对其进行操作,然后利用OLE功能从EXCEL表单中获取欲查询的课程名,并控制EXCEL生成新的工作表,VFP的查询结果仍然使用剪切板的方式传递至EXCEL工作表。OleApp=CREATEOBJECT("Excel.Application")&&打开EXCEL,产生OLE对象OleApp.Application.Caption="VFP交互编程"&&指定标题栏名称OleApp.Application.Visible=.T.&&置EXCEL可见OleApp.Application.WorkBooks.Open("d:\vfp\VFP交互.xls")&&打开EXCEL工作簿DOWHILE.T.WITHOleApp.ApplicationnAnswer=MESSAGEBOX("开始搜索?",32+4,"搜索指定数据")&&产生信息框IF(.NOT.(nAnswer=6))&&如按下“Yes"按钮,则开始搜索,反之退出EXITENDIF.Sheets("查询").Select&&选择“查询”工作表单SLesson=OleApp.Application.Range("课程名").Value&&得到欲查询的课程名称.Sheets.Add&&新建一工作表单.ActiveSheet.Name=Slesson&&指定工作表单的名称SCommand="SELECT学号,语文,数学FROMd:\vfp\学生成绩表WHERE"+ALLTrim(SLesson)+"<60INTOCURSORTEMP"&&形成VFP查询命令串&Scommand&&执行VFP命令串_VFP.DataToClip("TEMP",,3)&&将搜索结果以文本方式拷贝至剪切板.Range("a1:a1").Select&&指向拷贝目标区域左上角单元.ActiveSheet.Paste&&粘贴搜索结果ENDWITHENDDOOleApp.Quit&&关闭EXCEL,保存更新后的工作簿文件****************************************objexcel.activeworkbook.close(.f.)那个是关闭excel啊~~不是存盘~关闭了就不能存盘了设置打印参数:问:用Excel做报表,可打印时怎么选择打印机,即.ActiveWindow.SelectedSheets.PrintOut的参数有哪些?答:expression.PrintOut(From,To,Copies,Preview,ActivePrinter,PrintToFile,Collate,PrToFileName)expression必选。该表达式返回“应用于”列表中的某个对象。FromVariant类型,可选。打印的开始页号。如果省略该参数,将从起始位置开始打印。ToVariant类型,可选。打印的终止页号。如果省略该参数,将打印至最后一页。CopiesVariant类型,可选。要打印的份数。如果省略该参数,将只打印一份。PreviewVariant类型,可选。如果为True则MicrosoftExcel打印指定对象之前进行打印预览。如果为False,或者省略此参数则立即打印该对象。ActivePrinterVariant类型,可选。设置活动打印机的名称。PrintToFileVariant类型,可选。如果为True则打印输出到文件。如果没有指定PrToFileName,则MicrosoftExcel将提示用户输入要输出文件的文件名。CollateVariant类型,可选。如果为True则逐份打印每份副本。PrToFileName可选,Variant类型。如果将PrintToFile设置为True,则本参数指定要打印到的文件名。说明From参数和To参数所描述的“页”指的是要打印的页,并非指定工作表或工作簿中的全部页。如何用编程的方法打开有密码的Excel文件?问题:Excel文件加了密码,如何在VFP中用编程的方式把密码输入,使Excel文件打开如:oExcel=CREATEOBJECT('Excel.application')oExcel.Workbooks.Open("d:\22.xls")这样还有一个密码的对话框出来,需要输入密码才能打开文件。如何用编程的方法直接打开有密码的Excel文件?答:oEle.Workbooks.Open("d:\22.xls",.f.,.f.,,"123","456")"123"表示打开权限的密码,"456"表示修改权限的密码.问题一:如何将一个已知路径的图片插入到excel中.答:oexcel1.ActiveSheet.Pictures.Insert("图片文件名")问题二:能不能指定在某一位置或区域放置图片并控制图片显示大小呢?答:OLEAPP.SHEETS(1).SELECToleapp.Range("位置").Selectoleapp.ActiveSheet.Pictures.Insert("图片文件名")).Selectoleapp.Selection.ShapeRange.LockAspectRatio=.T.oleapp.Selection.ShapeRange.Height=57问题:类型为字符型的字段输出到excel中,前面的零被自动去掉,例如“009877”变为“9877”,怎么解决?答:1.在字符串前面加半角单引号“'”,例如:o.Cells(1,1).Value="'0123"或用变量cString="'"+"0123"&&其中0123可以取自表中一个字段o.Cells(1,1).value=cString&&o.Range("A1:A1").value=cString2.oExcel.CELLS(1,1).Select&&或eole.Range("A1:E1").SelectoExcel.Selection.NumberFormatLocal="@"&&把被选定的单元格设为文本格式oExcel.Cells(1,1).Value="0123"&&给所选单元格覆值在Excel中插入行和列:objExcel.Rows(1).Insert()&&在第一行前面插入一行objExcel.Columns(2).Insert()&&在第二列前面插入一列获取Excel记录数loXls=CREATEOBJECT("excel.application")bookExcel=loXls.APPLICATION.Workbooks.OPEN("f:\pz.xls")nrows=bookExcel.Worksheets('pz')UsedRange=nrows.UsedRanger=UsedRange.ROWS.COUNT&&有数据的总行数c=UsedRange.COLUMNS.COUNT&&有数据的总列数loXls.Workbooks.closeloXls.quit问:在EXCEL中如何在打开文件的同时自动执行一个宏命令。答:只要将宏的命名为AUTO_OPEN即可。如果要在文件关闭时运行,则命名为auto_close。问:在VFP中可以执行EXCEL的选择性粘贴吗?.Range("A2").PasteSpecial("xlPasteValues")&&会出错.Range("A2").PasteSpecial(3).Range("A2").PasteSpecial如何才能只粘贴值呢?答:&&也会出错&&只好这样了xlPasteValues=-4163oExcel.Range("A1").SelectoExcel.Selection.copyoExcel.Range("B1")._PasteSpecial(xlPasteValues)注意:在Excel中,"xlPasteValues"是一个常量,它的值是一个数值型的:-4163oExcel.Range("A1").CopyoExcel.Range("B3").PasteSpecial(8)&&粘贴行、列宽oExcel.Range("B3").PasteSpecial(-4122)&&粘贴格式如何从excel读取数据*******建立一个excel对象*******LOCALhb1asexcel.applicationcsheetname=TRIM(thisform.text2.value)&&读取用户要读取excel的sheet名***读取数据源所在的EXCEL文件名****IFEMPTY(TRIM(thisformset.filepath))MESSAGEBOX("请先选择要导入的excel文件!",0,"提示")RETURNENDIFIFEMPTY(TRIM(csheetname))MESSAGEBOX("请先选择要导入的工作表sheet名称!",0,"提示")RETURNENDIFtryhb1=createobject("excel.application")catchmessagebox("请检查你是否已安装microsoftexcel应用程序!",0,"提示")endtry***打开EXCEL对象,开始读取数据********HB1.workbooks.open(TRIM(thisformset.filepath))hb1.Sheets(csheetname).selectselestore&&这是要读取的数据存放的表zapisend=.f.&&用于判断是否记录已到底i=1DOWHILEisend=.f.APPENDBLANKcrq=DTOC(drq)cdh=hb1.Cells(i,1).ValueIFISNULL(cdh)cdh=""ENDIF**用于判断数据类型,数据类型一定要判断是否为NULL,****然后如果不是指定的类型,还要进行转换*************IFTYPE("cdh")<>'C'cdh=ALLTRIM(STR(cdh))endifcdwmc=TRIM(hb1.Cells(i,2).Value)IFISNULL(cdwmc)cdwmc=""endifcgg=hb1.Cells(i,3).ValueIFISNULL(cgg)cgg=""ELSEIFTYPE("cgg")<>'C'cgg=ALLTRIM(STR(cgg))ENDIFendifcjldw=hb1.Cells(i,4).ValueIFISNULL(cjldw)cjldw=""endifcjldw=IIF(TYPE("jldw")<>"C",ALLTRIM(STR(cjldw)),ALLTRIM(cjldw))nsl=hb1.Cells(i,5).ValueIFISNULL(nsl)nsl=0endifcch=TRIM(hb1.Cells(i,6).Value)IFISNULL(cch)cch=''endifcxh=hb1.Cells(i,8).ValueIFISNULL(cxh)cxh=""ELSEIFTYPE("cxh")<>'C'cxh=TRIM(STR(cxh))ELSEcxh=TRIM(cxh)endifENDIFccpmc=hb1.Cells(i,9).ValueIFISNULL(ccpmc)ccpmc=''endifIFTYPE("ccpmc")<>'C'ccpmc=ALLTRIM(STR(ccpmc))ELSEccpmc=TRIM(ccpmc)ENDIFSELECTstoreREPLACErqWITHcrq,dhWITHcdh,dwmcWITHcdwmc,ggWITHcgg,jldwWITHcjldw,slWITHnsl,chWITHcch,cpbhWITHcxh,cpmcWITHccpmci=i+1&&如果一行全为空,记作记录到底,如果中间存在多行的问题,我没有做考虑****IFEMPTY(cxh)ANDnsl=0ANDEMPTY(cch)ANDEMPTY(cjldw)ANDEMPTY(cdh)ANDEMPTY(cgg)isend=.t.ENDIFENDDOdele&&最后一行为空行,删除WAIT"共转换得到"+ALLTRIM(STR(RECCOUNT()))+"条记录!"WINDOWTIMEOUT2hb1.quit***********************************************本程序通过将原dbf表拷成excel格式,然后导入并*设置报表格式**********************************************paratablenameLOCALhb1asexcel.applicationWAIT"正在导出数据,请稍侯……"WINDOWAT20,30TIMEOUT1bhaveerror=.f.&&定义一个变量判断是否发生错误tryhb1=createobject("excel.application")catchmessagebox("请检查你是否已安装microsoftexcel应用程序!",0,"提示")bhaveerror=.t.endtryifbhaveerror=.t.returnendififright(curr_path,1)<>'\'curr_path=curr_path+"\"endifctablename=tablename+"_excel"filepath=curr_path+"temp\sheet1.xls"*filepath="temp\sheet1.xls"if!file(filepath)messagebox("数据源的excel文件未生成,报表生成被终止!")returnendifHB1.workbooks.open(filepath)HB1.SHEETS("sheet1").selecthb1.sheets(1).rows(1).entirerow.inserthb1.sheets(1).rows(1).entirerow.insertsele(ctablename)nfieldcount=fcount()nreccount=reccount()hbdygs="A1:"+chr(nfieldcount+64)+"2"HB1.range(hbdygs).select****合并两行作为报表标题*************HB1.selection.HorizontalAlignment=3&&水平方向2左对齐,3居中,4右对齐HB1.selection.VerticalAlignment=2&&垂直方向1靠上,2居中,3靠下HB1.selection.WrapText=.f.HB1.selection.orientation=0HB1.selection.AddIndent=.f.HB1.selection.ShrinkToFit=.f.HB1.selection.MergeCells=.t.&&??&&??&&??&&??&&??HB1.range(hbdygs).FormulaR1C1="请输入报表标题"HB1.range(hbdygs).C="隶书"HB1.range(hbdygs).Characters.font.FontStyle="常规"HB1.range(hbdygs).Characters.font.ColorIndex=1&&字符颜色***根据数据源表结构的宽度设置列的宽度********copystruextetotemp\term_strusele0usetemp\term_strusele(ctablename)fori=1tonfieldcountcvalue=allt(field(i))seleterm_strulocaforlower(allt(field_name))==cvalueiffound()columnname=chr(i+64)+":"+chr(i+64)hb1.columns(columnname).columnwidth=field_lenelseendifsele(ctablename)endforseleterm_struuseactivecellname=chr(nfieldcount+64)+allt(str(nreccount+3))*************设置数据区域的字体格式***************HB1.range("A3:"+activecellname).C="宋体"HB1.range("A3:"+activecellname).Characters.font.size=9HB1.range("A3:"+activecellname).selecthb1.selection.Borders(1).LineStyle=.t.hb1.selection.Borders(2).linestyle=.t.hb1.selection.Borders(3).linestyle=.t.hb1.selection.Borders(4).linestyle=.t.hb1.ActiveWorkbook.SaveAs("c:\aa.xls")hb1.application.visible=.t.*HB1.ACTIVEWORKBOOK.SAVE&&自动保存数据*HB1.ACTIVEWORKBOOK.CLOSE&&关闭当前工作簿*HB1.QUIT*如何修改sheet工作表名:EFILENAME='D:\TEST\TEMPA.XLS'oExcel=CREATEOBJECT("Excel.application")oExcel.Workbooks.OPEN("&EFILENAME")oExcel.VISIBLE=.T.oExcel.Worksheets("Sheet2").SelectoExcel.Worksheets("Sheet2").Name='NewSheet'&&这里的NewSheet为新的名字。*复制Sheet工作表EFILENAME='D:\你的Excel表名.XLS'oExcel=CREATEOBJECT("Excel.application")oExcel.Workbooks.OPEN("&EFILENAME")oExcel.VISIBLE=.T.oExcel.SHEETS(1).SELECToExcel.SHEETS(1).COPY(NULL,oExcel.SHEETS(1))&&&&把第1个工作表复制到第1个工作表之后oExcel.SHEETS(2).NAME='NewSheetName'&&设置第2个工作表名称*!*oExcel.SHEETS(1).COPY(oExcel.SHEETS(1),NULL)&&&&把第1个工作表复制到第1个工作表之前*!*oExcel.SHEETS(1).NAME='NewSheetName'&&设置第1个工作表名称*如何将DBF中内容COPY到EXCEL的指定区域例如我有一个DBF:Name_FSl_fMikekyle546200想将这个内容转到EXCEL里面的E1:F2区域!*******USE表名_VFP.DataToClip('表名',RECCOUNT(),3)&&将一组记录作为文本复制到剪贴板上,3使用制表符分隔字段。oexl=createobject('excel.application')&&创建电子表格oexl.visible=.t.&&使电子表格可见oexl.workbooks.add&&创建工作簿withoexl.range("E1:F2").select&&根据你的表中的记录数和字段数调整此项中的'F2'.ActiveSheet.PasteENDWITH*VFP调用EXCEL查询打印示例EFILENAME='查询打印.XLS'*LOCALoExceloExcel=CREATEOBJECT("Excel.application")oExcel.Workbooks.OPEN("&EFILENAME")oExcel.CAPTION="VFP应用程序调用MicrosoftExcel"oExcel.Worksheets("查询打印").ACTIVATEoExcel.VISIBLE=.T.nRows=oExcel.Worksheets('查询打印').UsedRange.ROWS.COUNTnColumns=oExcel.Worksheets('查询打印').UsedRange.COLUMNS.COUNToExcel.RANGE(oExcel.Cells(1,1),oExcel.Cells(nRows,nColumns)).BORDERS.LineStyle=1oExcel.RANGE(oExcel.Cells(1,1),oExcel.Cells(nRows,nColumns)).HorizontalAlignment=3&&水平(1-默认、2-靠左、3-居中、4-靠右、5-填充、6=两端对齐、7=跨列居中、8=分散对齐)oExcel.RANGE(oExcel.Cells(1,1),oExcel.Cells(nRows,nColumns)).VerticalAlignment=2&&垂直(1=靠上、2=居中、3=靠下、4=两端对齐、5=分散对齐)oExcel.ActiveSheet.PageSetup.RightFooter="第&P页/共&N页"oExcel.ActiveSheet.PageSetup.TopMargin=2/0.035&&设置顶边距为2厘米oExcel.ActiveSheet.PageSetup.BottomMargin=2/0.035&&设置左边距为2厘米oExcel.ActiveSheet.PageSetup.HeaderMargin=1/0.035&&设置页眉到顶端边距为1厘米oExcel.ActiveSheet.PageSetup.FooterMargin=1/0.035&&设置页脚到底边距为1厘米oExcel.ActiveSheet.PageSetup.LeftMargin=2/0.035&&设置左边距为2厘米oExcel.ActiveSheet.PageSetup.RightMargin=2/0.035&&设置右边距为2厘米oExcel.ActiveSheet.PageSetup.CenterHorizontally=.t.&&设置页面水平居中oExcel.ActiveSheet.PageSetup.CenterVertically=.t.&&设置页面垂直居中oExcel.Cells.SELECToExcel.Cells.EntireColumn.AUTOFIToExcel.SELECTION.AutoFilteroExcel.ActiveSheet.ROWS(1).INSERToExcel.RANGE("A2:BB2").ROWHEIGHT=37.5oExcel.RANGE("A2:BB2").WrapText=.T.oExcel.ActiveSheet.COLUMNS(1).COLUMNWIDTH=3oExcel.ActiveSheet.COLUMNS(1).COLUMNWIDTH=4oExcel.RANGE("A2:BB2").ROWHEIGHT=12.5*oExcel.RANGE("M1").VALUE='统计月份:'+ALLTRIM(STR(YEAR(KKS_DATE1)))+'年'+ALLTRIM(STR(MONTH(KKS_DATE1)))+'月-'+ALLTRIM(STR(YEAR(KKE_DATE1)))+'年'+ALLTRIM(STR(MONTH(KKE_DATE1)))+'月'oExcel.ActiveSheet.PageSetup.CenterHeader="&20部门出勤统计表"oExcel.ActiveSheet.PageSetup.CenterFooter="单位领导:"oExcel.ActiveSheet.PageSetup.LeftFooter="打印时间:&D-&T"oExcel.SELECTION.AutoFilteroExcel.ActiveSheet.RANGE('B2').SELECToExcel.ActiveSheet.PageSetup.PrintTitleRows="$1:$1"oExcel.ActiveSheet.PageSetup.ORIENTATION=2&&1:纵向打印2:横向打印oExcel.ActiveWorkbook.Save*在VFP中Disabled/EnabledEXCEL中的菜单项及按钮有时需要在VFP中控制EXCEL中的按钮及菜单项,以达到由VFP控制XLS文档的目的。可以控制XLS文档不能复制、不能另存、不能打印、不能以附档的形式发邮件。结合陆老师的在通用字段中存放文档的思路,完全可以用VFP开发文档发布系统,可以发布公司的守则、公告、管理办法、机密资料、图片资料等而不用担心用户复制、打印、以邮件传播资料。XLS中各个菜单项或按钮都有唯一的ID或序号,本例是利用序号来控制的(利用ID也可以控制)。对象大多只有三层,对应的控制方法是:对象.CommandBars(第一层序号).Controls(第二层序号).accChild(第二层序号).属性=值本例仅列出菜单项的部分控制,其它菜单项或按钮的序号可以用以下程序取得:*(需要在VFP7.0以上运行)oXls=GetObject("","excel.sheet")XlApp=oXLS.applicationXlSheet=XlApp.ActiveSheetbars=xlapp.CommandBars.Countstr=''FORi=1TObarsstr=str+CHR(13)+ALLTRIM(str(i))+'、'+xlapp.CommandBars(i).accName+'(NAME:'+xlapp.CommandBars(i).Name+'INDEX:'+ALLTRIM(STR(xlapp.CommandBars(i).Index))+')'bars2=mandbars(i).accChildCountFORj=1TObars2tryobj=mandbars(i).controls(j)str=str+CHR(13)+''+ALLTRIM(str(j))+'、'+mandbars(i).controls(j).accname+'(ID:'+ALLTRIM(STR(xlapp.CommandBars(i).controls(j).Id))+')'FORk=1TOobj.accChildCounttryIFNOTEMPTY(obj.controls(k).accname)str=str+CHR(13)+''+ALLTRIM(STR(k))+'、'+obj.controls(k).accName+'(ID:'+ALLTRIM(STR(obj.controls(k).Id))+')'ENDIFCATCHEXITendtryENDFORCATCHEXITendtryENDFORWAITwindowsALLTRIM(STR(i))+'/'+ALLTRIM(STR(bars))+''+STR(i/bars*100,10,2)+'%'nowaitENDFORSAVETOxls.txtALLLIKEstrMODIFYCOMMANDxls.txtreturn*oXLS=CREATEOBJECT('excel.application')oXLS.Workbooks.AddoXLS.visible=.t.1、工作表功能表列(NAME:WorksheetMenuBarID:1)&&禁用/不可见系统菜单mandbars(1).enabled=.f.1、档案(ID:30002)&&禁用菜单中的“档案”项oXLS.commandbars(1).controls(1).enabled=.f.12、打印...(ID:4)&&禁用“档案”菜单下的“打印”项oXLS.CommandBars(1).Controls(1).accChild(18).Enabled=.f.*以下为通过上面程序取得的Office2003菜单信息,如果Office版本不是2003,那就通过以上程序重新取得菜单信息1、工作表菜单栏(NAME:WorksheetMenuBarINDEX:1)1、文件(ID:30002)1、新建...(ID:18)2、打开...(ID:23)3、关闭(ID:106)4、更新(ID:3)5、副本另存为...(ID:748)6、另存为网页...(ID:3823)7、保存工作区...(ID:846)8、文件搜索...(ID:5905)9、权限...(ID:7994)10、权限(ID:31308)11、签出(ID:6127)12、签入...(ID:6128)13、版本记录...(ID:7799)14、网页预览(ID:3655)15、页面设置...(ID:247)16、打印区域(ID:30255)17、打印预览(ID:109)18、打印...(ID:4)19、发送(ID:30095)20、属性(ID:750)21、1\Test\查询打印.XLS(ID:831)22、2\慧指资料\Others\Apple\Monitor.xls(ID:831)23、3\Test\temp1.CSV(ID:831)24、4\工作\合同编号&用户统计表.xls(ID:831)25、此处为最近所用文件的名称(ID:831)26、此处为最近所用文件的名称(ID:831)27、此处为最近所用文件的名称(ID:831)28、此处为最近所用文件的名称(ID:831)29、此处为最近所用文件的名称(ID:831)30、签出(ID:5950)31、退出(ID:752)2、编辑(ID:30003)1、无法撤消(ID:128)2、重复新建(ID:37)3、剪切(ID:21)4、复制(ID:19)5、Office剪贴板...(ID:809)6、粘贴(ID:22)7、选择性粘贴...(ID:755)8、粘贴为超链接(ID:2787)9、填充(ID:30020)10、清除(ID:30021)11、删除...(ID:478)12、删除工作表(ID:847)13、移动或复制工作表...(ID:848)14、查找...(ID:1849)15、替换...(ID:313)16、定位...(ID:757)17、链接...(ID:759)18、对象(ID:961)19、对象(ID:30019)3、视图(ID:30004)1、普通(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村老宅分家合同范本
- 三角刮刀行业市场发展及发展趋势与投资战略研究报告
- 热电厂烟气脱硫除尘脱硝系统改造项目可行性研究报告
- 中国珠绣工艺项目投资可行性研究报告
- 中国汽车内饰材料市场运营趋势分析及投资潜力研究报告
- 2024-2030年中国镁氧氯水泥行业市场发展监测及投资前景展望报告
- 无铅热风回流焊机行业行业发展趋势及投资战略研究分析报告
- 科技创新助力传统零售业转型升级
- 2025年彩花熟食切板项目投资可行性研究分析报告
- 2025年双媒体播放机行业深度研究分析报告-20241226-205903
- 育婴员初级培训
- 医疗废物管理条例
- 新能源汽车三电系统培训教材
- 慢性乙型肝炎防治指南(2022年版)解读
- DB43T 578-2016 锑冶炼砷碱渣无害化处理技术规范
- 建筑与市政工程地下水控制技术规范 JGJ111-2016 培训
- 2024年汽车装调工技能竞赛理论考试题库(含答案)
- (新版)区块链应用操作员职业技能竞赛理论考试题库-上(单选题)
- 生猪屠宰兽医卫生检验人员理论考试题库及答案
- 高中英语课程设计目的
- 2024-2025学年北京一零一中学初三期初测试数学试题含解析
评论
0/150
提交评论