主题:VFP的GRID特别显示和操作WORD-EXCEL示例
labxj0769
[专家分:21070] 发布于 2005-11-30 18:43:00
曾有编程爱好者多次求我帮做Word模板,填写资料。当时也找不到资料。只告诉他
要写资料的那一页用EXCEL,因EXCEL的参考资料多。后见他在多个论坛求助,未见解决。
刚好闲点,花点时间研究了一下WORD,终于知道怎样如控制EXCEL一样来控制WORD。
写成例子贴出来与大家共享,都有两方法,一是直接用代码编程创建文档,另是在WORD或
EXCEL中作好模板,用模板创建,添写资料。我中意后者。
另附 GRID 模仿DELPHI的显示
总结以下几点,就可更加发挥:
一、要实现的目的,先在WORD或EXCEL中录制宏。然后根据宏来修改做成VFP的代码。
二、对象的属性不同。
a、WORD ,
1、 凡有selection的为应用程序属性
OleWord=CREATEOBJECT('word.application') &&创建word目标
OleWord.Selection
**** Word多数用它**********
OleWord.quit &&退出word
2、OleWord.Documents
OleWord.Documents.add() &&增加新的word文档,有路径文件名是以它作模板打开
OleWord.Documents.open("D:\test.doc") &&打开指定的文件
OleWord.Documents.close(.F.) &&关闭所有打开的文档不保存,不要.F.,调出对话框
3、页面设置OleWord.ActiveDocument.PageSetup
4、OleWord.ActiveDocument
OleWord.ActiveDocument.Save &&保存
OleWord.ActiveDocument.SaveAs("D:\test.doc") &&最简单的另存
OleWord.ActiveDocument.close &&关闭当前word文档
b、EXCEL
1、凡有selection的为应用程序属性
XLApp=CREATEOBJECT('Excel.application')
XLApp.Selection
XLApp.quit &&退出Excel
2、XLApp.WorkBooks
XLApp.WorkBooks.Add( ) &&增加新的EXCEL,加有路径文件名是以它作模板打开
XLApp.Workbooks.Open("D:\test.xls") && 打开指定工作簿
XLApp.Workbooks.close(.F.) &&关闭所有打开的工作簿不保存,不要.F.,调出对话框
3、页面设置 XLApp.ActiveSheet.PageSetup
4、XLApp.ActiveSheet
********Excel多数用它与Word不同**********
5、XLApp.ActiveWorkbook
XLApp.ActiveWorkbook.Save &&保存
XLApp.ActiveWorkbook.SaveAs("D:\ABC\22.xls") &&另存为
XLApp.ActiveWorkbook.close &&关闭当前工作簿
三、WORD/EXCEL宏与VFP表示方法不同
a、WORD打开
OleWord.Documents.open("D:\test.doc",.F.,.F.,.F.,'456','123',.F.,'','',.F.) &&根据宏函数改,与保存不同方式,456为打开密码,123为只读密码
*宏函数 Documents.Open FileName:="temp.doc", ConfirmConversions:=False, ReadOnly:= _
* False, AddToRecentFiles:=False, PasswordDocument:="456", PasswordTemplate _
* :="123", Revert:=False, WritePasswordDocument:="123", WritePasswordTemplate _
* :="", Format:=wdOpenFormatAuto
b、EXCEL只读保护
XLApp.ActiveSheet.protect('123') &&用123密码锁起只读
XLApp.ActiveSheet.unprotect('123') &&用123密码解锁
*宏函数(用123密码只读锁) ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
* 用123密码解锁 ActiveSheet.Unprotect
徐 军 xj@meyerdyeing.com
2005/11/06
示例:
http://upload.programfan.com/upfile/20051122194626.rar
回复列表 (共37个回复)
沙发
labxj0769 [专家分:21070] 发布于 2005-11-05 14:34:00
部分代码:
*用WORD创建新文档,再根据DBF的资料创建自几所需要的表格文档
Thisform.chnagedbf &&转表查询生成新表、公用变量k,arrcolor[j,k],arrWash[1],arrCrock[1]
WAIT windows("起动WORD制做文档,请稍等....") NOWAIT AT MROW(Thisform.Name,3),MCOL(Thisform.Name,3)
OleWord=CREATEOBJECT('word.application') &&创建word目标
OleWord.Visible=.F. &&word隐藏,为.F.可在后台操作
OleWord.Documents.add() &&增加新的word文档
*-- 页面设置
WITH OleWord.ActiveDocument.PageSetup
*1.设置顶边距为2厘米
.TopMargin=2/0.035
*2.设置底边距为4厘米
.BottomMargin=4/0.035
*3.设置左边距为2厘米
.LeftMargin=2/0.035
*4.设置右边距为2厘米
.RightMargin=2/0.035
*页面0为纵向,1为横向
.Orientation=1
ENDWITH
**********************************************************************************
WITH OleWord.Selection
.TypeParagraph &&回车符
.Text="致" &&加完是选定状态
.Font.size=20 &&字体大小
.Moveright(3,1) &&加完是选定状态,移动一次才不覆盖,3是右移参数,左移1字节。
.TypeParagraph
.insertafter(SPACE(4)+"兴启")
.Font.size=20
.Moveright(3,1)
.TypeParagraph
.Moveright(3,1)
.insertafter(SPACE(6)+"多谢贵公司的支持,贵公司在我厂所配COT样办牢度如下:")
.Font.size=14
.Moveright(3,1)
.TypeParagraph
ENDWITH
******创建表格*******************************
OleWord.Selection.TypeParagraph
OleWord.Selection.TypeParagraph
OleWord.Selection.Moveup(5,1) &&第一个5是上移参数,第二个数字是上移1行,留一空行在格表下面
otemp=OleWord.Selection.Range
OleWord.ActiveDocument.Tables.Add(otemp,k+3,6,5,0) &&插入k+3行6列表格
OleWord.Selection.SelectRow
&&光标在第一格,要移动用Moveright() 等
WITH OleWord.Selection
.Tables(1).Rows.Height=0.77/0.035 &&选定表格所有行高0.77CM
.Tables(1).Columns.PreferredWidth=2.5/0.035 &&选定表格所有列宽 1.9cm
.Tables(1).Columns(1).PreferredWidth=4.73/0.035 &&选定表格第一列宽 4.73cm
*添加数据,表格合并后就不能用此方法加资料
.Tables(1).rows(3).cells(3).range.insertafter("颜色变化")
.Tables(1).rows(3).cells(4).range.insertafter("颜色沾色")
.Tables(1).rows(3).cells(5).range.insertafter("干 擦")
.Tables(1).rows(3).cells(6).range.insertafter("湿 擦")
FOR i=1 TO k
FOR j=1 TO 6
.Tables(1).rows(i+3).cells(j).range.insertafter(arrcolor[i,j])
ENDFOR
ENDFOR
**选定合并
.MoveLeft(3,1) &&左移去掉选定.第一个3是左移参数,第二个数字是左移1字节
.MoveDown(5,2,1) &&下移两格,5是下移参数,2是移两格,1是按SHIFT,选择3格
.Cells.Merge &&合并选定的三格
.MoveRight(3,1) &&右移去掉选定.第一个3是右移参数,第二个数字是右移1格
.MoveDown(5,2,1)
.Cells.Merge &&合并选定的三格
.MoveRight(3,1) &&右移一格去掉选定
.Moveright(3,2,1) &&3是右移参数,右移1格,最后1是按SHIFT键,变成选定二格。
.Cells.Merge &&合并选定的两格
.MoveDown(5,1)
.Moveright(3,2,1) &&3是右移参数,左移1格,最后1是按SHIFT键,变成选定二格。
.Cells.Merge &&合并选定的两格
.Moveright(3,1) &&右移一格去掉选定
.Moveright(3,2,1) &&3是右移参数,左移1格,最后1是按SHIFT键,变成选定二格。
.Cells.Merge &&合并选定的两格
.Moveup(5,1) &&上移一格,5是下移参数,2是移两格,1是按SHIFT,选择3格
.Moveright(3,2,1)
.Cells.Merge
***加入资料,因要合并不方便操作,所以合并后加放标题资料
.insertafter("摩 擦")
.MoveDown(5,1)
.insertafter(arrCrock[1])
.MoveLeft(3,2)
.insertafter(arrWash[1])
.Moveup(5,1)
.insertafter("耐 洗")
.MoveLeft(3,2)
.insertafter("颜 色")
.MoveLeft(3,2)
.insertafter("色 号")
.MoveDown(5,k,1) &&5是下移参数,下移k+2格,最后1是按SHIFT键,变成选定多格。
.MoveRight(3,5,1) &&3是右移参数,右移5格,最后1是按SHIFT键,变成选定多格。
.ParagraphFormat.Alignment=1 && 1居中 2左对齐,3右对齐,4分散对齐
.MoveDown(5,1)
.TypeParagraph
.insertafter(SPACE(4)+"祝")
.MoveRight(3,1)
.TypeParagraph
.insertafter("生意兴隆!")
.MoveRight(3,1)
.TypeParagraph
.insertafter(SPACE(25)+"先科有限公司")
.Font.size=20
.Moveright(3,1)
.TypeParagraph
.insertafter(SPACE(30)+DTOC(DATE()))
.Moveright(3,1)
ENDWITH
MESSAGEBOX("制作文档完毕!",64,"提示")
OleWord.Visible=.T.
板凳
wuzhouhong [专家分:10890] 发布于 2005-11-05 19:46:00
顶
3 楼
hhxcr [专家分:1520] 发布于 2005-11-05 22:12:00
顶~~~~~
好贴~~~~~
4 楼
labxj0769 [专家分:21070] 发布于 2005-11-06 10:03:00
表格特别显示图:
[img]http://upload.programfan.com/upfile/200511171850780.rar[/img]
5 楼
labxj0769 [专家分:21070] 发布于 2005-11-06 10:09:00
在表格的init:
STORE RGB(195,195,195) TO THISFORM.Grid1.GridLineColor,THISFORM.Grid1.BackColor
THISFORM.Grid1.SetAll("BackColor",RGB(255,255,255),"TextBox")
ThisForm.Grid1.SetAll("DynamicBackColor", "IIF(MOD(RECNO( ), 2)=0, RGB(248,243,252),RGB(255,255,255))", "Column") && Alternate color
IF TYPE("gnCurrRec")="U"
PUBLIC gnCurrRec
ENDIF
STORE 1 TO gnCurrRec
ThisForm.Grid1.SetAll("DynamicForeColor","IIF(RECNO()=gnCurrRec,RGB(255,0,0),IIF(MOD(RECNO(),2)=0,RGB(0,0,255),This.ForeColor))","Column")
在表格的afterRowColChange:
LPARAMETERS nColIndex
gnCurrRec=RECNO()
This.Refresh
6 楼
飞扬988 [专家分:580] 发布于 2005-11-06 10:46:00
谢谢大哥,真的太漂亮了,已经达到效果了,这样的好贴不收藏可说不过去了。
7 楼
wuzhouhong [专家分:10890] 发布于 2005-11-06 11:15:00
顶一个
[img]http://upload.programfan.com/upfile/200511061114217.rar[/img]
8 楼
huangdehua [专家分:5730] 发布于 2005-11-14 12:50:00
看了你的示例,你的主程序中
cPath=SYS(5)+SYS(2003)
SET DEFAULT TO &cPath
把你的程序放在路径中有空格的目录中运行 如我的文档,会提示出错,如果你改为
cPath=SYS(5)+SYS(2003)
SET DEFAULT TO (cPath)
可解决问题
另外,导出WORD还有一种方法就是先设计一个WORD表格,用VFP数据填入
这样对处理复杂的表格代码比较简捷
9 楼
labxj0769 [专家分:21070] 发布于 2005-11-14 22:00:00
空路径的问题知道,谢谢。至于第二个问题我的示例中就是第二方法,你可能没看,我也是中意在WORD、EXCEL中作好模板,再在VFP中调用。
10 楼
lwh1188 [专家分:25840] 发布于 2005-11-15 10:12:00
很好!顶!
我来回复