回 帖 发 新 帖 刷新版面

主题:VFP的GRID特别显示和操作WORD-EXCEL示例

曾有编程爱好者多次求我帮做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个回复)

沙发

部分代码:
*用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.

板凳


3 楼

顶~~~~~

好贴~~~~~

4 楼

表格特别显示图:

[img]http://upload.programfan.com/upfile/200511171850780.rar[/img]

5 楼

在表格的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 楼

谢谢大哥,真的太漂亮了,已经达到效果了,这样的好贴不收藏可说不过去了。

7 楼

顶一个
[img]http://upload.programfan.com/upfile/200511061114217.rar[/img]

8 楼

看了你的示例,你的主程序中
cPath=SYS(5)+SYS(2003)
    SET DEFAULT TO &cPath

把你的程序放在路径中有空格的目录中运行 如我的文档,会提示出错,如果你改为

cPath=SYS(5)+SYS(2003)
    SET DEFAULT TO (cPath)

可解决问题

另外,导出WORD还有一种方法就是先设计一个WORD表格,用VFP数据填入
这样对处理复杂的表格代码比较简捷

9 楼

空路径的问题知道,谢谢。至于第二个问题我的示例中就是第二方法,你可能没看,我也是中意在WORD、EXCEL中作好模板,再在VFP中调用。

10 楼

很好!顶!

我来回复

您尚未登录,请登录后再回复。点此登录或注册