在VFP中直接来操作Excel

在VFP中直接来 操作Excel

VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大 大方便我们的工作。比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功能进行报表打印。这就需要我们在VFP中直接来控制Excel。下 面就在开发VFP应用项目时对Excel的控制作一下介绍:

 

 

 

oExcel=Createobject(“Excel.application”)&&创建Excel对象

 

**对象属性

 

 

 

1、添加

Sheets.Add before:=Sheets(1) ‘在第1工作表前添加新工作表

Sheets.Add after:=Sheets(Sheets.Count) ‘在最后工作表后添加新工作表

2、移动

ActiveSheet.Move before:=Sheets(2) ‘将当前工作表移动至第2工作表之前

3、命名

ActiveSheet.Name=”工作表名” ‘将当前工作表命名为”工作表名”

4、删除

可以用以下语句删除当前工作表。

ActiveSheet.Delete

但在删除前Excel会自动弹出提示框,需在用户确认后方可执行删除。为避免这一干扰,可以先用以下语句关闭Excel的警告提示。

Application.DisplayAlerts = False

在删除完成后,再重新打开Excel的警告提示

 

oExcel.Visible=.T.&&显示Excel窗口

 

oExcel.Caption=”VFP应用程序调用MicrosoftExcel”&&更改Excel标题栏

 

oExcel.DisplayAlerts=.F.&&关闭提示和警告消息,运行结束后,应将本属性设置回True值

 

oExcel.cells(1,4).Value=XM(XM为数据库字段名)&&给单元格赋值

 

**Workbooks属性

 

oExcel.Workbooks.Add&&添加新工作簿

 

oExcel.Workbooks.Open(“c:\temp\ll.xls”)&&打开指定工作簿

 

oExcel.Workbooks.Close&&关闭工作簿

 

oExcel.Quit&&退出Excel

 

ReleaseoExcel&&只有释放对象变量,EXCEL进程才会完全关闭

 

**Worksheets属性

 

oExcel.Worksheets(“sheet3”).Activate&&设置第3个工作表为激活工作表

 

oExcel.Worksheets(“Sheet1”).Rows(18).PageBreak=1&&在第18行之前插入分页符

 

oExcel.WorkSheet(“Sheet2”).Range(“A1”).PasteSpecial&&粘贴

 

**ActiveWorkbook属性

 

oExcel.ActiveWorkbook.SaveAs(“c:\temp\22.xls”)&&工作表另存为

 

oExcel.ActiveWorkbook.saved=.T.&&放弃存盘,避免出现保存对话框

 

oExcel.ActiveWorkbook.Save&&存盘

 

oExcel.ActiveWorkbook.Close(.F.)&&关闭工作簿

 

oExcel.ActiveWorkbook.Protect(‘密码’,.T.,.T.)&&保护工作薄(第一个.T.:保护工作簿结构,第二个.T.:保护工作簿窗口)

 

**ActiveSheet属性

 

oExcel.ActiveSheet.UsedRange.Copy&&拷贝整个工作表

 

oExcel.ActiveSheet.PrintPreview&&打印预览工作表

 

oExcel.ActiveSheet.PrintOut&&打印输出工作表

 

oExcel.ActiveSheet.Protect(‘密码’,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.)&&保护工作表

 

oExcel.ActiveSheet.Protection.AllowEditRanges.Add(“3”,oExcel.ActiveSheet.Range(“A2:D5”))&&设置允许用户编辑区域

 

**表格列属性

 

oExcel.ActiveSheet.Columns(2).Insert&&在第2列之前插入一列

 

oExcel.ActiveSheet.Columns(1).ColumnWidth=5&&设置指定列的宽度(单位:字符个数)

 

oExcel.ActiveSheet.Columns(4).PageBreak=0&&在第4列之前删除分页符

 

oExcel.ActiveSheet.Columns(1).Font.Bold=.T.&&设置整列字体为粗体

 

**表格行属性

 

oExcel.ActiveSheet.Rows(2).Insert&&在第2行之前插入一行

 

oExcel.ActiveSheet.Rows(1).RowHeight=1&&设置指定行的高度(单位:磅)(设定行高为1磅,1磅=0.035厘米)

 

oExcel.ActiveSheet.Rows(“50:100”).RowHeight=1&&设置第50行至100行的高度

 

**表格范围属性

 

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=分散对齐)

 

oExcel.Range(“A4:C4”).WrapText=.F.&&文本自动换行

 

oExcel.ActiveSheet.Range(“A4:B5”).Merge=.T.&&合并单元格

 

oExcel.ActiveSheet.Range(“A1:E2”).Copy&&拷贝指定区域

 

oExcel.ActiveSheet.Range(“b3:d3”).BorderS(2).Weight=3&&指定边框线宽度(Borders参数如下)

 

oExcel.ActiveSheet.Range(“b3:d3″).BorderS(2).LineStyle=1&&设置四个边框线条的类型

 

&&(其中Borders参数:1-左、2-右、3-顶、4-底、5-斜、6-斜/;LineStyle值:1与7-细实、2-细虚、4-点虚、9-双细实线)

 

**页面设置

 

WITHoExcel.ActiveSheet.PageSetup

 

.CenterHeader=”报表1″&&设置页眉

 

.CenterHeader=”&50报表1″&&设置页眉(字体大小),’&’后面的50可以自定义,表示字体的大小

 

.CenterFooter=”第&P页”

 

&&设置页脚(LeftFoot:居左,CenterFooter:居中,RightFooter:居右)

 

.CenterFooter=”&28第&P页共&N页”

 

&&设置页脚(字体大小),’&’后面的28可以自定义,表示字体的大小

 

.HeaderMargin=2/0.035&&设置页眉到顶端边距为2厘米

 

.FooterMargin=3/0.035&&设置页脚到底边距为3厘米

 

.TopMargin=2/0.035&&设置顶边距为2厘米

 

.BottomMargin=4/0.035&&设置底边距为4厘米

 

.LeftMargin=2/0.035&&设置左边距为2厘米

 

.RightMargin=2/0.035&&设置右边距为2厘米

 

.CenterHorizontally=.T.&&设置页面水平居中

 

.CenterVertically=.T.&&设置页面垂直居中

 

.Papersize=1&&设置页面纸张大小(1-窄行851139-宽行14119:A4)

 

.Orientation=1&&设置纸张方向(1-竖向,2-横向)

 

.PrintTitleRows=”$1:$2″&&设置顶端标题行,(每页都打印行标头(每页顶部出现的单元格的行))

 

.PrintGridlines=.T.&&打印单元格网线

 

.Zoom=75&&设置缩放比例为75%

 

ENDWITH

 

**单元格设置

 

WITHoExcel.ActiveSheet.Cells(1,1)&&第一行第一列单元格

 

.Font.Name=”黑体”&&字体名字

 

.Font.Size=25&&大小

 

.Font.Italic=.T.&&为斜体(Bold-粗体)

 

.Value=”数值”&&给单元格赋值

 

.ClearContents&&清除单元格公式

 

ENDWITH

 

*以下为一些过程

 

*检测当前目录是否有同名的EXCEL表,如果有先删除,再另存

 

If!File(Sys(5)+Curdir()+”result.xls”)

 

oExcel.ActiveWorkbook.SaveAs(Sys(5)+Curdir()+”result.xls”)

 

Else

 

lcFileName=loExcel.GetSaveAsFilename(“result”,”Excel(*.xls),

 

*.xls”)

 

If!Empty(lcFileName)

 

IfFile(lcFileName)

 

DeleteFile(lcFileName)

 

Endif

 

oExcel.ActiveWorkbook.SaveAs(lcFileName)

 

Endif

 

Endif

 

*!*拷贝整个工作表(含格式)

 

oExcel.activesheet.cells.Copy&&拷贝

 

oExcel.sheets(1).Select&&选择第一工作表

 

oExcel.ActiveSheet.Paste&&粘贴

 

oExcel.ActiveSheet.Cells(3,4).Value&&ActiveSheet

 

为当前的Sheet工作薄名字,Cells(3,4).value为第3行第4列的值

 

*!*显示某个单元格的批注内容

 

oExcel=Createobject(“Excel.application”)

 

oExcel.Workbooks.Open(“d:\TEST\testa.xls”)

 

oExcel.Visible=.T.

 

?oExcel.Range(“B5”).Comment.Text&&显示B5单元格的批注内容

 

oExcel.Workbooks.Close

 

oExcel.Quit

 

ReleaseoExcel

 

*!*将当前工作表中的已用区域(只读)存入数组。

 

strPath=’D:\TEST\123.xls’

 

LocaloExcel

 

oExcel=Createobject(“Excel.Application”)

 

oExcel.WorkBooks.Open(strPath)

 

arrTableInfo=oExcel.ActiveSheet.UsedRange.Value

 

&&将当前工作表中的已用区域(只读)存入数组。

 

oExcel.Quit

 

ReleaseoExcel

 

InsertInto表名FromarrTableInfo

 

*!*设置excel批注的字体(excel2000实现了,如下:)

 

ole.Range(“a3″).Comment.Shape.Select&&此命令要求批注的Visible=.t.

 

ole.Selection.Font.Size=9

 

ole.Selection.Font.Name=”黑体”

 

ole.Selection.Font.bold=.F.

 

注:该组命令要求先选中批注框,否则写成ole.Range(“a3”).Comment.Shape.Font.Size=9

 

则出错,不知为何!

 

*!*如何取得当前EXCEL表中工作表的数目及各工作表的名称?

 

Clear

 

LocallnSheetCount

 

oExcel=Createobject(“EXCEL.APPLICATION”)&&创建Excel对象

 

oExcel.WORKBOOKS.Open(“c:\111\321.xls”)&&打开指定工作簿

 

WithoExcel

 

lnSheetCount=.WorkBooks(1).Sheets.Count&&统计工作表数量

 

Endwith

 

?’当前EXCEL表中工作表的数目为:’+Alltrim(Str(lnSheetCount))

 

ForEachoMyVarInoExcel.sheets

 

?’当前EXCEL表中工作表的名称分别为’+oMyVar.Name&&显示Excel表中所有工作表

 

NextoMyVar

 

oExcel.WORKBOOKS.Close&&关闭工作簿

 

oExcel.Quit&&退出Excel

 

*!*如何用编程的方法打开有密码的Excel文件?

 

*Excel文件加了密码,如何在VFP中用编程的方式把密码输入,使Excel文件打开

 

oExcel=Createobject(‘Excel.application’)

 

oExcel.Workbooks.Open(“d:\22.xls”)

 

*!*这样还有一个密码的对话框出来,需要输入密码才能打开文件。

 

*!*如何用编程的方法直接打开有密码的Excel文件?

 

oExcel.Workbooks.Open(“d:\22.xls”,.F.,.F.,,”123″,”456″)

 

“123”表示打开权限的密码,

 

“456”表示修改权限的密码.

 

*!*如何将一个已知路径的图片插入到excel中.

 

oExcel.ActiveSheet.PictureS.Insert(“图片文件名”)

 

*!*能不能指定在某一位置或区域放置图片并控制图片显示大小呢?

 

oExcel.SHEETS(1).Select

 

oExcel.Range(“位置”).Select

 

oExcel.ActiveSheet.PictureS.Insert(“图片文件名”)).Select

 

oExcel.Selection.ShapeRange.LockAspectRatio=.T.

 

oExcel.Selection.ShapeRange.Height=57

 

*!*类型为字符型的字段输出到excel中,前面的零被自动去掉,例如“009877”变为“9877”,怎么解决?

 

*!*方法1.在字符串前面加半角单引号“’”,

 

*!*例如:

 

oExcel.Cells(1,1).Value=”‘0123″

 

*!*或用变量

 

cString=”‘”+”0123″&&其中0123可以取自表中一个字段

 

oExcel.Cells(1,1).Value=cString&&o.Range(“A1:A1”).value=cString

 

*!*方法2.

 

oExcel.CELLS(1,1).Select&&或eole.Range(“A1:E1”).Select

 

oExcel.Selection.NumberFormatLocal=”@”&&把被选定的单元格设为文本格式

 

oExcel.Cells(1,1).Value=”0123″&&给所选单元格覆值

 

*!*获取Excel记录数

 

loXls=Createobject(“excel.application”)

 

bookExcel=loXls.Application.Workbooks.Open(“f:\pz.xls”)

 

nrows=bookExcel.Worksheets(‘pz’)

 

UsedRange=nrows.UsedRange

 

r=UsedRange.Rows.Count&&有数据的总行数

 

c=UsedRange.Columns.Count&&有数据的总列数

 

loXls.Workbooks.Close

 

loXls.Quit

 

*!*在EXCEL中如何在打开文件的同时自动执行一个宏命令。

 

只要将宏的命名为AUTO_OPEN即可。

 

如果要在文件关闭时运行,则命名为auto_close。

 

*!*在VFP中可以执行EXCEL的选择性粘贴吗?

 

.Range(“A2”).PasteSpecial(“xlPasteValues”)&&会出错

 

.Range(“A2”).PasteSpecial(3)&&也会出错

 

.Range(“A2”).PasteSpecial&&只好这样了

 

*!*如何才能只粘贴值呢?

 

xlPasteValues=-4163

 

oExcel.Range(“A1”).Select

 

oExcel.Selection.Copy

 

oExcel.Range(“B1”)._PasteSpecial(xlPasteValues)

 

*注意:在Excel中,”xlPasteValues”是一个常量,它的值是一个数值型的:-4163

 

oExcel.Range(“A1”).Copy

 

oExcel.Range(“B3”).PasteSpecial(8)&&粘贴行、列宽

 

oExcel.Range(“B3”).PasteSpecial(-4122)&&粘贴格式

 

*!*本程序通过将原dbf表拷成excel格式,然后导入并设置报表格式

 

Paratablename

 

Localhb1Asexcel.Application

 

Wait”正在导出数据,请稍侯……”WindowAt20,30Timeout1

 

bhaveerror=.F.&&定义一个变量判断是否发生错误

 

Try

 

hb1=Createobject(“excel.application”)

 

Catch

 

Messagebox(“请检查你是否已安装microsoftexcel应用程序!”,0,”提示”)

 

bhaveerror=.T.

 

Endtry

 

Ifbhaveerror=.T.

 

Return

 

Endif

 

IfRight(curr_path,1)<>’\’

 

curr_path=curr_path+”\”

 

Endif

 

ctablename=tablename+”_excel”

 

filepath=curr_path+”temp\sheet1.xls”

 

*filepath=”temp\sheet1.xls”

 

If!File(filepath)

 

Messagebox(“数据源的excel文件未生成,报表生成被终止!”)

 

Return

 

Endif

 

HB1.workbooks.Open(filepath)

 

HB1.SHEETS(“sheet1″).Select

 

hb1.sheets(1).Rows(1).entirerow.Insert

 

hb1.sheets(1).Rows(1).entirerow.Insert

 

Sele(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=0&&??

 

HB1.Selection.AddIndent=.F.&&??

 

HB1.Selection.ShrinkToFit=.F.&&??

 

HB1.Selection.MergeCells=.T.&&??

 

HB1.Range(hbdygs).FormulaR1C1=”请输入报表标题”

 

HB1.Range(hbdygs).Characters.Font.Name=”隶书”

 

HB1.Range(hbdygs).Characters.Font.FontStyle=”常规”

 

HB1.Range(hbdygs).Characters.Font.ColorIndex=1&&字符颜色

 

***根据数据源表结构的宽度设置列的宽度********

 

CopyStruExteTotemp\term_stru

 

Sele0

 

Usetemp\term_stru

 

Select(ctablename)

 

Fori=1Tonfieldcount

 

cvalue=Allt(Field(i))

 

Selectterm_stru

 

LocaForLower(Allt(field_name))==cvalue

 

IfFound()

 

columnname=Chr(i+64)+”:”+Chr(i+64)

 

hb1.Columns(columnname).ColumnWidth=field_len

 

Endif

 

Sele(ctablename)

 

Endfor

 

Seleterm_stru

 

Use

 

activecellname=Chr(nfieldcount+64)+Allt(Str(nreccount+3))

 

*************设置数据区域的字体格式***************

 

HB1.Range(“A3:”+activecellname).Characters.Font.Name=”宋体”

 

HB1.Range(“A3:”+activecellname).Characters.Font.Size=9

 

HB1.Range(“A3:”+activecellname).Select

 

hb1.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:\你的Excel表名.XLS’

 

oExcel=Createobject(“Excel.application”)

 

oExcel.Workbooks.Open(“&EFILENAME”)

 

oExcel.Visible=.T.

 

oExcel.SHEETS(1).Select

 

oExcel.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_f

 

Mike546

 

kyle200

 

想将这个内容转到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.Paste

 

Endwith

 

VF有专门检测字段是否存在的函数 Fsize(字段名)

 

sele a

if fsize(‘bbb’)=0

? ‘字段 bbb 不存在’

endif

 

 

 

excel有时候列比较多或者每列比较宽的话,打印预览时就会有一两列位于打印区域外,从而使宽出的列单独再打印一张。请问excel有没有这样的设置:使选定的打印区域自动调整来适应纸张的宽度。

那么就要将页面设置-〉缩放-〉调整为1页宽,空页高

具体代码如下:

ef.ActiveSheet.PageSetup.Zoom= .F. && 若选择调整页面,此项必须为False,且与下面两项一起出现。

 

ef.ActiveSheet.PageSetup.FitToPagesWide=1 &&设为1页宽

 

ef.ActiveSheet.PageSetup.FitToPagesTall=.F. &&而空页高 则其值要设为.F.

 » 本站地址:http://www.gomoth.com

标签: ,