注册 登录
编程论坛 VFP论坛

如何用jsrkb20190101中的”班会”替换word文档中的”ABCDEF”

王咸美 发布于 2025-03-25 10:43, 151 次点击
下列程序中,如何添加代码,用jsrkb20190101中的”班会”替换word文档中的”ABCDEF”,请高手赐教,谢谢!
只有本站会员才能查看附件,请 登录

模板文件:
只有本站会员才能查看附件,请 登录

如何用jsrkb20190101中的“班会”替换ABCDEF
只有本站会员才能查看附件,请 登录


程序代码:
CLOSE DATABASES
CLEAR ALL
SET SAFETY OFF
* cPath=ADDBS(JUSTPATH(SYS(16)))
cPath="F:\temp19\班级课表"
SET DEFAULT TO (cPath)
wjm="F:\temp19\bjkbmb.doc"
PUBLIC cnj,cbj,cxkmc,i,j
wordApp=CREATEOBJECT("word.Application")
wordApp.Visible=.t.
USE F:\temp19\jsrkb20190101.dbf ALIAS jsrkb IN 0
SCAN  for RECNO()<5
  cnj=jsrkb.nj
  cbj=jsrkb.bj
  cxm=jsrkb.班会
  WAIT WINDOW '正在生成" '+cnj+cbj+' "的日课表...' nowait
  SELECT * FROM F:\temp19\rkzb20190101 WHERE nj=cnj AND bj=cbj  INTO CURSOR bjkb
  SELECT bjkb
  wordTable=wordApp.Application.Documents.Open(wjm)
  wordApp.Selection
  wordApp.Selection.InsertAfter(ALLTRIM("&cnj&cbj"))
  
  
  SELECT bjkb
  FOR i=1 to 5
    FOR j=1 to 6
      cxkmc=ALLTRIM(EVALUATE("bjkb."+"zhou"+TRANSFORM(i)+TRANSFORM(j)))
      wordTable.Tables.Item(1).Cell(j*2,i+2).range.Text=cxkmc
      SELECT jsrkb
      FOR k=1 to FCOUNT()
        IF FIELD(k)=cxkmc
          wordTable.Tables.Item(1).Cell(j*2+1,i+2).range.Text=EVALUATE(FIELD(k))
        ENDIF
      ENDFOR
    ENDFOR
  ENDFOR
  SELECT bjkb
  USE
  SELECT jsrkb
  WAIT clear
  cFileName=cPath+"\"+cnj+cbj+"课程表.doc"
  * wordApp.ActiveDocument.PrintOut
  wordApp.Documents(1).SaveAs(cFileName)
  wordApp.ActiveDocument.Close
 ENDSCAN
 wordApp.Application.Quit
 MESSAGEBOX("班级日课表的word文档生成完毕!",64,"提示:")
 RETURN


[此贴子已经被作者于2025-3-25 10:47编辑过]

6 回复
#2
wengjl2025-03-25 14:41
程序代码:
请给一句将WORD文档中指定字符“ABC”替换为“客观”二字的VFP代码

已深度思考(用时 17 秒)
好的,用户需要的是在VFP中将Word文档中的“ABC”替换为“客观”的代码。首先,我得确定VFP如何操作Word文档。VFP通常通过COM自动化来控制Office应用,所以应该使用CreateObject或者GetObject来连接Word。

接下来,用户可能希望打开指定的文档,或者当前打开的文档?这里可能需要明确是否需要打开特定文件,还是处理当前打开的文档。假设用户是要处理特定的文档,所以需要提供文件路径。不过原问题中没有提到路径,可能需要用户自己修改代码中的路径部分。

然后,替换操作在Word中可以通过Find和Execute方法来实现。需要用到Range对象的Find属性。正确的语法应该是设置查找的文本、替换的文本,以及各种参数如是否匹配大小写、全字匹配等。但用户可能只需要简单替换,所以默认参数可能就够了。

另外,是否需要保存文档?用户可能希望替换后保存,但原问题中没有说明,所以代码中可能不包含保存和退出的步骤,或者需要添加注释让用户自行决定是否保存。

还需要考虑错误处理,比如Word是否已经打开,文档是否存在等。不过用户可能只需要基础代码,所以这部分可能被省略,但最好提醒用户注意这些情况。

最后,确保代码示例正确,比如使用oWord.Selection.Find正确设置替换参数,使用Replace参数为2(wdReplaceAll)来替换所有实例。可能需要引用Word的常量,或者使用对应的数值,比如2代表全部替换。

总结步骤:创建Word对象,打开文档,执行替换,关闭文档。然后给出示例代码,并解释关键部分,让用户可以根据需要调整路径和其他参数。

可以使用VFP的COM自动化操作Word对象,以下是替换指定字符的代码示例:

foxpro
复制
LOCAL oWord, oDoc
oWord = CREATEOBJECT("Word.Application")
oWord.Visible = .T.  && 设置可见性(调试时可设为.T.)

* 打开指定文档(请修改实际路径)
oDoc = oWord.Documents.Open("D:\test.docx")

WITH oWord.Selection.Find
    .Text = "ABC"     && 查找内容
    .Replacement.Text = "客观"  && 替换内容
    .Execute(,,,,,,, 2)  && 参数2表示全部替换
ENDWITH

* 保存并关闭(按需取消注释)
* oDoc.[color=#0000FF]Save()[/color]
* oDoc.[color=#0000FF]Close()[/color]
* oWord.Quit()


deepseek 给的代码,测试没成功,不知道为什么
#3
王咸美2025-03-25 16:18
不能解决问题
#4
sam_jiang2025-03-25 16:59
求助DS,搞定。

程序代码:

CLEAR ALL
LOCAL oWord, oDoc
oWord = CREATEOBJECT("Word.Application")

TRY
    oDoc = oWord.Documents.Open("D:\Documents\test.docx")
    oWord.Visible = .T.

    * 2. 执行查找操作
    WITH oDoc.Content.Find
        .Text = "ABC"
        .Replacement.Text = "Sam_Jiang"
        .Execute(, , , , , , , , , , 2)
    ENDWITH

CATCH TO ex
    MESSAGEBOX("错误: " + ex.Message)

FINALLY
    * 3. 确保释放所有对象
    IF TYPE("oDoc") = "O" AND NOT ISNULL(oDoc)
        oDoc.Close(.T.)  && 保存关闭
        oDoc = .NULL.
    ENDIF
    IF TYPE("oWord") = "O" AND NOT ISNULL(oWord)
        oWord.Quit
        oWord = .NULL.
    ENDIF
ENDTRY



#5
王咸美2025-03-25 17:38
谢谢!

#6
wengjl2025-03-26 10:47

终于 测试成功了,语句次序问题,让人不知因果!!!

程序代码:


CLOSE DATABASES
CLEAR ALL
SET SAFETY OFF
cPath=ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
wjm=cpath+"bjkbmb.docx"
PUBLIC cnj,cbj,cxkmc,i,j
wordApp=CREATEOBJECT("word.Application")
wordApp.Visible=.t.
USE jsrkb20190101.dbf ALIAS jsrkb IN 0
SCAN  for RECNO()<5
  cnj=jsrkb.nj
  cbj=jsrkb.bj
  cxm=jsrkb.班会
  WAIT WINDOW '正在生成" '+cnj+cbj+' "的日课表...' nowait
  SELECT * FROM kb20190101 WHERE nj=cnj AND bj=cbj  INTO CURSOR bjkb
  SELECT bjkb
  wordTable=wordApp.Application.Documents.Open(wjm)
  wordApp.Selection
  *wordApp.Selection.InsertAfter(ALLTRIM("&cnj&cbj")) && 执行了此句,查找替换就不行了
  WITH WordApp.selection.Find
    .Text = "ABCDEF"        && 查找内容
    .Replacement.text= cxm  && 替换内容
    .Execute(,,,,,,,,,,2)   && 参数2表示全部替换
  ENDWITH
   wordApp.Selection.InsertAfter(ALLTRIM("&cnj&cbj")) && 放在替换后执行,结果正常。(未知因果)
   
  SELECT bjkb
  FOR i=1 to 5
    FOR j=1 to 6
      cxkmc=ALLTRIM(EVALUATE("bjkb."+"zhou"+TRANSFORM(i)+TRANSFORM(j)))
      wordTable.Tables.Item(1).Cell(j*2,i+2).range.Text=cxkmc
      SELECT jsrkb
      FOR k=1 to FCOUNT()
        IF FIELD(k)=cxkmc
          wordTable.Tables.Item(1).Cell(j*2+1,i+2).range.Text=EVALUATE(FIELD(k))
        ENDIF
      ENDFOR
    ENDFOR
  ENDFOR
  SELECT bjkb
  USE
  SELECT jsrkb
  WAIT clear
  cFileName=cPath+"\"+cnj+cbj+"课程表.doc"
  * wordApp.ActiveDocument.PrintOut
  wordApp.Documents(1).SaveAs(cFileName)
  wordApp.ActiveDocument.Close
ENDSCAN
wordApp.Application.Quit
MESSAGEBOX("班级日课表的word文档生成完毕!",64,"提示:")
RETURN

#7
王咸美2025-03-26 12:20
谢谢!
1