在Word中按某个格式查找一段文字(150分)

  • 主题发起人 主题发起人 aupt
  • 开始时间 开始时间
A

aupt

Unregistered / Unconfirmed
GUEST, unregistred user!
想法是这样的,要在一个word文档里查找包含‘参考文献’字样的文字
而且这些文字的格式是Heading 3的。并且要返回这个文字的位置。
比如第几行,第几段等等。
查了vba的帮助,有用的一段:

本示例查找活动文档中的所有“标题 1”样式,并将其替换为“标题 2”样式。
With ActiveDocument.Content.Find
.ClearFormatting
.Style = wdStyleHeading1
.Replacement.ClearFormatting
.Replacement.Style = wdStyleHeading2
.Execute FindText:="", ReplaceWith:="", _
Replace:=wdReplaceAll, Format:=True
End With

但怎么改写成delphi的呢?还有查找的时候要查某个格式的某段话。
最后怎么返回查出文字的位置?请给出程序段。
 
为什么没人回复啊,up..
 
对了,我用的是CreateOleObject('Word.Application')
难道没有人关注么?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1429787
 
我也这样用:参考一下我的代码:
procedure ImpDataToWord(DataSet: TDataSet; sFileName, sTitle: string; const
Fields: array of string; fOther: TField = nil);
{连接Ole对象}
function My_GetActiveOleObject(const ClassName: string; out
Ole_Handle: IDispatch): Boolean;
var
//IDispatch
ClassID: TCLSID;
Unknown: IUnknown;
l_Result: HResult;
begin
Result := False;
l_Result := CLSIDFromProgID(PWideChar(WideString(ClassName)),
ClassID);
if (l_Result and $80000000) = 0 then
begin
l_Result := GetActiveObject(ClassID, nil, Unknown);
if (l_Result and $80000000) = 0 then
begin
l_Result := Unknown.QueryInterface(IDispatch, Ole_Handle);
if (l_Result and $80000000) = 0 then
Result := True;
end;
end;
end;

{创建OLE对象}
function My_CreateOleObject(const ClassName: string; out
Ole_Handle: IDispatch): Boolean;
var
ClassID: TCLSID;
l_Result: HResult;
begin
Result := False;
l_Result := CLSIDFromProgID(PWideChar(WideString(ClassName)),
ClassID);
if (l_Result and $80000000) = 0 then
begin
l_Result := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER
or
CLSCTX_LOCAL_SERVER, IDispatch, Ole_Handle);
if (l_Result and $80000000) = 0 then
Result := True;
end;
end;
//替换指定的数据
procedure ReplaceData(ObjH: Variant; const SourceText, DestText: string);
begin
ObjH.Selection.Find.Replacement.ClearFormatting;
ObjH.Selection.Find.Text := SourceText;
ObjH.Selection.Find.Replacement.Text := DestText;
ObjH.Selection.Find.Forward := True;
ObjH.Selection.Find.Wrap := 1;
ObjH.Selection.Find.Format := False;
ObjH.Selection.Find.MatchCase := False;
ObjH.Selection.Find.MatchWholeWord := False;
ObjH.Selection.Find.MatchByte := True;
ObjH.Selection.Find.MatchWildcards := False;
ObjH.Selection.Find.MatchSoundsLike := False;
ObjH.Selection.Find.MatchAllWordForms := False;
ObjH.Selection.Find.Execute(Replace := 1);
end;
//----------------------ImpDataToWord Begin------------------------------//
const
Obj_Name = 'Word.Application';
ErrMsg = '启动Word失败,可能没有安装Word!';
var
l_Excel_Handle: IDispatch;
ObjH: Variant;
i: integer;
begin
if not My_GetActiveOleObject(Obj_Name, l_Excel_Handle) then
if not My_CreateOleObject(Obj_Name, l_Excel_Handle) then
begin
raise exception.Create(ErrMsg);
Exit;
end;
ObjH := l_Excel_Handle;

ObjH.Documents.Open(FileName := vp_SystemPath + '/' + sFileName);
for i := 0 to High(Fields) do
ReplaceData(ObjH, Fields, DataSet.FieldByName(Fields).AsString);

//指定特殊的字段数据
if fOther <> nil then
ReplaceData(ObjH, fOther.FieldName, fOther.AsString);

ObjH.ActiveDocument.SaveAs(FileName := vp_DesktopPath + '/' + sTitle);
ObjH.ActiveDocument.PrintPreview;
ObjH.Visible := True;
ObjH.ActiveWindow.ActivePane.View.Zoom.Percentage := 100;
end;
//----------------------ImpDataToWord End----------------------------------//
 
我的问题是我希望检索到的是某个格式的文字
比如Heading 3,Style属性怎么加呢?
 
查找的问题解决了,Format要设成True,下面是我的代码,将
Heading3格式的'Abstract'换成Heading1格式的'Delphi'
但我不是要进行替换,只要找出来就可以了,但找出来之后怎么定
位?如果找出多个怎么定位呢?

Word_Handle.Selection.Find.Replacement.ClearFormatting;
Word_Handle.Selection.Find.Text := 'Abstract';
Word_Handle.Selection.Find.Style := wdStyleHeading3;
Word_Handle.Selection.Find.Replacement.Text := 'Delphi';
Word_Handle.Selection.Find.Replacement.Style := wdStyleHeading1;
Word_Handle.Selection.Find.Forward := True;
Word_Handle.Selection.Find.Wrap := 1;
Word_Handle.Selection.Find.Format := True;
Word_Handle.Selection.Find.MatchCase := False;
Word_Handle.Selection.Find.MatchWholeWord := False;
Word_Handle.Selection.Find.MatchByte := True;
Word_Handle.Selection.Find.MatchWildcards := False;
Word_Handle.Selection.Find.MatchSoundsLike := False;
Word_Handle.Selection.Find.MatchAllWordForms := False;
Word_Handle.Selection.Find.Execute(Replace := 1);
 
这样吧,你先在Word中录制你要实现功能的宏,
然后把他变为Delphi的代码就可以了。
 
我查到了一个方法得到位置信息
Selection.Information(wdActiveEndSectionNumber)

edit1.Text := Word_Handle.Selection.Information(wdActiveEndSectionNumber);
时报错说'informaation'is not a method
那我该如何使用呢?
(Word_Handle := GetActiveOleObject('Word.Application');)
 
后退
顶部