首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

word搜索替换,CCRUN快来

2013-03-06 
求助word搜索替换,CCRUN快来下面是复制了一段妖哥的代码,应该没什么错误,搜索执行也正常,但文本并没有被替

求助word搜索替换,CCRUN快来
下面是复制了一段妖哥的代码,应该没什么错误,搜索执行也正常,但文本并没有被替换,是何原因呢?


void __fastcall TForm1::Button2Click(TObject *Sender)
{
    String File = "C:\\test.doc"; //按照模板文件的格式来显示
    Variant vWordApp;
    try
    {
        vWordApp = Variant::CreateObject("Word.Application");
    }
    catch(...)
    {
        MessageBox(0, "启动 Word 出错, 可能是没有安装Word.","提示", MB_OK | MB_ICONERROR);
        vWordApp = Unassigned;
        return;
    }
    // 隐藏Word界面
  vWordApp.OlePropertySet("Visible", false);
  vWordApp.OlePropertyGet("Documents").OleFunction("Open", File.c_str());
  Variant vSelect = vWordApp.Exec(PropertyGet("Selection"));
  String strText = "测试"; // 查找字符串   
  Variant vFind = vSelect.OlePropertyGet("Find");  
  vFind.OleProcedure("ClearFormatting");   
  vFind.OlePropertySet("Text", strText.c_str());
  vFind.OlePropertyGet("Replacement").OlePropertySet("Text", "已替换");  //这句为什么没有动作??
  vFind.OlePropertySet("Forward", true);  
  vFind.OlePropertySet("Wrap", false);  
  vFind.OlePropertySet("Format", false); 
  vFind.OlePropertySet("MatchCase", false);
  vFind.OlePropertySet("MatchWholeWord", false);
  vFind.OlePropertySet("MatchByte", false);
  vFind.OlePropertySet("MatchWildcards", false);
  vFind.OlePropertySet("MatchSoundsLike", false);
  vFind.OlePropertySet("MatchAllWordForms", false);
  bool bResult = vFind.OleFunction("Execute");

  if (bResult)
      ShowMessage("搞定的说");
  else
      ShowMessage("木有找到关键字");

  vWordApp.OlePropertyGet("ActiveDocument").OleProcedure("Close");
  Application->ProcessMessages();
  vWordApp.OleProcedure("Quit");
  Application->ProcessMessages();
  vWordApp = Unassigned;
}
//---------------------------------------

[解决办法]
String 用WideString代替试试
[解决办法]
使用CreateOleObject方式调用Word相比Service控件的最大缺点就是不支持代码的自动生成,
但是我们充分的利用VBA代码就可以弥补这个功能。
Word作为一个功能强大的Com,可以很容易被编程工具调用,成为办公自动化系统中处理文档
的强有力的嵌套工具,尤其是充分Word本身的录制宏的功能,更进一步减轻了编程的负担。
下面就如何在Delphi里面利用Word的VBA代码进行一些总结。
1、  生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现
的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看
到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是
选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能,
此时Word一边执行你要实现功能,一边将你的操作生成了一个宏,在实现功能后,可以选择
“工具->宏->VisualBasic编辑器”,查看生成的宏代码。
 
例如:我们要将文档中的“讨论”全部替换成“研讨”。
a.  点击“工具->宏->录制新宏”,直接点击确定,默认的宏保存到了Normal.dot系统公
用模板里面。
b.  点击“编辑->查找”,出现弹出对话框,输入查找和替换的字,点确定。进行替换。
c.  结束宏的录制,点击结束按钮。
d.  按F11或者“工具->宏->Visual Basic 编辑器”,查看宏代码。缺省查看Normal里面


的模块里面的NewMacros模块。
以下是生成的宏代码:
Sub Macro1()
'
' Macro1 Macro
' 宏在 2002-2-1 由 yzhshi 录制
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "讨论"
        .Replacement.Text = "研讨"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
2、  精简宏代码。通常,生成的宏代码有很多语句对你要实现的功能来说都是多余的。我们要
做的就是如何找到我们需要的代码。此时我们查看具体的代码,剔除明显没有用途的代码,然后光
标停留在宏上面,按F5执行,看是否实现功能,逐步精简,得到最小代码。此步骤可参考Word的
VBA帮助来判断代码是否有用。
 
如上例,精简下来,剩下以下代码。
Sub Macro1()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "讨论"
        .Replacement.Text = "研讨"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
 
3、  转换成Delphi代码。这一步其实很简单,对于VBA代码,只需要在前面添加Word的句柄或者
文档的句柄或者文档的句柄.Application就可以直接操作了。
例:逐句翻译:(Word_Handle是Word的句柄)
(VB)     Selection.Find.ClearFormatting
(Delphi)  Word_Handle.Selection.Find.ClearFormatting;
 
(VB)     Selection.Find.Replacement.ClearFormatting
(Delphi)  Word_Handle.Selection.Find.Replacement.ClearFormatting;
以上两句简单添加上Word的句柄就可以了。
 
(VB)     With Selection.Find
              Text = "讨论"
              Replacement.Text = "研讨"
End With
(Delphi)  Word_Handle.Selection.Find.Text := '讨论';
  Word_Handle.Selection.Find.Replacement.Text := '研讨';
以上几句因为Delphi不支持Variant的With结构,所以分开写。同时转换成Delphi语法。
 
(VB)    Selection.Find.Execute Replace:=wdReplaceAll
(Delphi) Word_Handle.Selection.Find.Execute(Replace:=2);
上面一句存在一个小技巧,如何找到常量wdReplaceAll的数值为2?
这里有几个办法,
一:直接use Word2000或者word97单元,那么直接使用常量wdReplaceAll就可以了;
二:到Word2000.pas或者Word97.pas里面查找wdReplaceAll的数值;
三:直接使用VBA代码见wdReplaceAll的数值显示出来。办法是写一个小过程,然后执行,如下:
Sub ShowValue()
  MsgBox wdReplaceAll
End Sub
 
最后补充一下,很多关于Word的东西可以从Word的VBA帮助里面获得。具体文件在
?:"Program files"Microsoft Office"Office10"2052(XP)下,VBAWD10.CHM,其他版本路径基本类似。

热点排行