| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 271 人关注过本帖
标题:如何用VFP传递数据给WORD邮件文件中。
只看楼主 加入收藏
wangzhiyi
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:25
帖 子:324
专家分:590
注 册:2014-4-9
结帖率:100%
  已结贴   问题点数:20  回复次数:15   
如何用VFP传递数据给WORD邮件文件中。

问题描述:
word环境下已经做好邮件模板文件
VFP环境下做好了相应的表单文件,表单设有三个命令按钮,其中“打印”按钮的代码如下:
SET SAFETY off
wjm=SYS(5)+SYS(2003)+"\普通全日制学位证明.doc"  
WordApp=CREATEOBJECT("word.application")
COPY TO abc FOR ALLTRIM(xm)==ALLTRIM(thisform.text1.Value) AND UPPER(ALLTRIM(zjhm))==UPPER(ALLTRIM(thisform.text2.Value)) xl5
WordTable=WordApp.Application.Documents.Open(wjm)
WordApp.Visible =.t.
基本意思是按输入的姓名和身份证号码查找记录,然后将数据拷贝为EXCEL文件,并且打开已经写好的WORD邮件模板。现在的问题是WORD邮件模板可以打开,但是需要重新设置一次数据源。
不知道有没有办法可能在打开邮件的时候直接按原邮件模板设置的好数据源直接激活?
附件: 您没有浏览附件的权限,请 登录注册
2019-05-14 15:49
schtg
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:23
帖 子:650
专家分:936
注 册:2012-2-29
  得分:3 
提供一个我自己的思路,不是最优,但我自己经常使用,现在太忙,请你自己测试。
1.设置好打印模板,如:

2.利用查询获取的数据,如姓名、身份证号、入学时间、学院、专业、毕业时间等信息,替换模板中的变量即可:
在查找中找到条件下加(最好先设成全局变量):
   dyxm=ALLTRIM(xm)
   dysfzh=ALLTRIM(zjhm)
然后打开word模板进行替换即可,语句如下:
WordApp.ActiveDocument.Content.Find.Execute('XM',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,'&dyxm',2)

第二种,直接做成报表文件,也可以的。

[此贴子已经被作者于2019-5-14 16:43编辑过]

附件: 您没有浏览附件的权限,请 登录注册
2019-05-14 16:36
shenkj001
Rank: 3Rank: 3
来 自:河南安阳
等 级:论坛游侠
威 望:6
帖 子:325
专家分:132
注 册:2005-5-23
  得分:3 
参考一下这个:
_fnm=Alltrim(Thisform.text1.Value)
If Empty(_fnm)
    =Messagebox('请指定模板文件!',48,'')
    Return
ENDIF
If Empty(Thisform.text2.Value)
    =Messagebox('请指定保存文件所在文件夹!',48,'')
    Return
ENDIF
If Empty(Thisform.text3.Value)
    =Messagebox('请确定欲建立的文件!',48,'')
    Return
Endif
_nfnm=Thisform.text2.Value+Alltrim(Thisform.text3.Value)

wdrs=Createobject('word.application')  &&创建Word目标测试是否安装了word  *
wdrs.Visible=.T.  &&后台运行似乎快点。
If File(_nfnm)
    _yorn=Messagebox('文件: '+_fnm+"  已存在是否替换?",4+16+256,"提示")
    If _yorn<>6
        Return
    Endif
Endif
wdrs.documents.Open(_fnm)
wdrs.Selection.WholeStory()
wdrs.Selection.Copy()
wdrs.activedocument.SaveAs(_nfnm)
*_fnm=wdrs.activedocument.Name
SELECT * FROM hjmd.dbf INTO CURSOR hjmds READWRITE
SELECT hjmds
wdrs.WindowState=2  && 0 普通 1 最大化  2 最小化
wdrs.WindowState=1  &&一小一大的切换,就激活Word到最全面来了。
FOR i=1 TO RECCOUNT('hjmds')
GO i
_nj=ALLTRIM(年级)
_bj=ALLTRIM(班级)
_xm=ALLTRIM(姓名)
_lx=ALLTRIM(获奖类型)
wdrs.Selection.pasteandformat(19)  &&粘贴模板
wdrs.Selection.InsertBreak(7)   &&插入分页符
wdrs.ActiveDocument.Content.Find.Execute('nj',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_nj,2)
wdrs.ActiveDocument.Content.Find.Execute('bj',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_bj,2)
wdrs.ActiveDocument.Content.Find.Execute('xm',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_xm,2)
wdrs.ActiveDocument.Content.Find.Execute('lx',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_lx,2)
Endf
*wdrs.ActiveDocument.Fields.Update
wdrs.Visible=.T.
Release wdrs
CLOSE DATABASES

[此贴子已经被作者于2019-5-14 16:50编辑过]

附件: 您没有浏览附件的权限,请 登录注册

shenkj001@163.com
2019-05-14 16:48
shenkj001
Rank: 3Rank: 3
来 自:河南安阳
等 级:论坛游侠
威 望:6
帖 子:325
专家分:132
注 册:2005-5-23
  得分:0 
参考实例:

[此贴子已经被作者于2019-5-14 16:51编辑过]

附件: 您没有浏览附件的权限,请 登录注册

shenkj001@163.com
2019-05-14 16:48
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:385
专家分:891
注 册:2004-11-23
  得分:3 
我每年打印很多类似这样的东西,这个可以直接用word邮件合并和excel组合使用即可,现在几乎没有证书空白,自己随意打印了,所以主要是填空,因为每年的证书格式都不是完全一致,所以建议用word邮件合并主要可以随时调整格式或输出位置等,做程序确实有点麻烦。
2019-05-14 17:38
xuminxz
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:148
专家分:407
注 册:2011-5-8
  得分:3 
楼主要打印的是小批量的东西,而且可能还要留底。有时,一些使用证明的单位对格式还有一些要求。所以用WORD文档比较好。
如果是大批量的用报表可能好些(关键是打印快)。我一晚打过过,近万元份的的通知书+快递签(多台打印机通过网络调用同一数据库的),WORD的速度就太慢了。
用报表打印大批量毕业证要注意以下几个问题:
1.对多字姓名,如何处理。
2.对非常用字如何处理
有些领导对某种字体有偏爱,而这些字段可能并不全。报表不自动用其它字段替换,需要编程控制。当然,现在字库一般比较全可能不会大批量出现这一问题。

WORD套打一个小技巧:把要打印的动态数据放到文本框中,把套打模板的扫描件图片以文字下方的形式插入。很容易找到相对位置,到具体打印机上调整就很方便了。不要指望所有打印机用一个不变的模版,同一型号的打印机走纸也不完全相同。打印前删除图片就可以了。
如用报表打印,也可以用这个方法,而且不用删除图片(只需要将其打印条件设置为.f.即可)注意,这时报表文件,要排除在项目文件之外。

[此贴子已经被作者于2019-5-14 22:32编辑过]


dBase有人接盘了。
2019-05-14 22:31
gs2536785678
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:272
专家分:788
注 册:2017-7-16
  得分:3 
上面的,说话深合吾意,吾一般都是用VF自己的报表,
2019-05-15 08:32
wangzhiyi
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:25
帖 子:324
专家分:590
注 册:2014-4-9
  得分:0 
    感谢大家的回复。但大部分是使用wdrs.ActiveDocument.Content.Find.Execute('lx',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_lx,2)的方法来修改模板里的文字,这种方法确实可以解决问题,但我的问题最核心的内容是利用VFP激活WORD邮件文件时,有没有办法可以直接调用邮件文件的数据源,而不需要每次还重新设置一次数据源。
    VFP的报表文件确实也可以解决问题,但是报表第一不能解决水印,第二不能按照实际的相关数据(比如说专业名称)的长度来调整固定内容的位置,所以我放弃了报表,而使用WORD文档的邮件。

[此贴子已经被作者于2019-5-15 08:43编辑过]

2019-05-15 08:40
星光悠蓝
Rank: 8Rank: 8
来 自:山水甲天下
等 级:贵宾
威 望:35
帖 子:353
专家分:924
注 册:2010-1-11
  得分:3 
回复 3楼 shenkj001
如果WORD模板是满一页的,再插入一个分页符,就会多一页空白页,怎样处理?
2019-05-15 09:24
shenkj001
Rank: 3Rank: 3
来 自:河南安阳
等 级:论坛游侠
威 望:6
帖 子:325
专家分:132
注 册:2005-5-23
  得分:0 
回复 9楼 星光悠蓝
可做个判断:
IF i<RECCOUNT('hjmds')
wdrs.Selection.InsertBreak(0)   &&插入分页符
ENDIF
以下代码:
_fnm=Alltrim(Thisform.text1.Value)
If Empty(_fnm)
    =Messagebox('请指定模板文件!',48,'')
    Return
ENDIF
If Empty(Thisform.text2.Value)
    =Messagebox('请指定保存文件所在文件夹!',48,'')
    Return
ENDIF
If Empty(Thisform.text3.Value)
    =Messagebox('请确定欲建立的文件!',48,'')
    Return
Endif
_nfnm=Thisform.text2.Value+Alltrim(Thisform.text3.Value)
wdrs=Createobject('word.application')  &&创建Word目标测试是否安装了word  *
wdrs.Visible=.T.  &&后台运行似乎快点。
If File(_nfnm)
    _yorn=Messagebox('文件: '+_fnm+"  已存在是否替换?",4+16+256,"提示")
    If _yorn<>6
        Return
    Endif
Endif
wdrs.documents.Open(_fnm)
wdrs.Selection.WholeStory()
wdrs.Selection.Copy()
wdrs.activedocument.SaveAs(_nfnm)
*_fnm=wdrs.activedocument.Name
SELECT * FROM hjmd.dbf INTO CURSOR hjmds READWRITE
wdrs.WindowState=2  && 0 普通 1 最大化  2 最小化
wdrs.WindowState=1  &&一小一大的切换,就激活Word到最全面来了。
SELECT hjmds
FOR i=1 TO RECCOUNT('hjmds')
GO i
_nj=ALLTRIM(年级)
_bj=ALLTRIM(班级)
_xm=ALLTRIM(姓名)
_lx=ALLTRIM(获奖类型)
IF i<=RECCOUNT('hjmds')
wdrs.Selection.pasteandformat(19)  &&粘贴模板
 wdrs.ActiveDocument.Content.Find.Execute('nj',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_nj,2)
wdrs.ActiveDocument.Content.Find.Execute('bj',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_bj,2)
wdrs.ActiveDocument.Content.Find.Execute('xm',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_xm,2)
wdrs.ActiveDocument.Content.Find.Execute('lx',.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.,_lx,2)
ENDIF
IF i<RECCOUNT('hjmds')
wdrs.Selection.InsertBreak(0)   &&插入分页符
ENDIF
ENDFOR
 wdrs.Selection.Delete(1,1) && 第一个数字:1为下删一字,2为下删到下一个标点  第二个数字为数量
*wdrs.ActiveDocument.Fields.Update
wdrs.Visible=.T.
Release wdrs
CLOSE DATABASES

[此贴子已经被作者于2019-5-15 10:03编辑过]


shenkj001@163.com
2019-05-15 10:00







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054123 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved