mas*_*che 10 com mfc ole office-automation visual-c++
我有一个完美的工作函数来查找和替换word文档中的文本变量.
HRESULT CMSWord::FindReplace( CString szVar, CString szText, bool bOnlyOnce/*=false*/ )
{
if(m_pWApp==NULL || m_pActiveDocument==NULL) return E_FAIL;
IDispatch *pDocApp;
{
VARIANT result;
VariantInit(&result);
OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
pDocApp= result.pdispVal;
}
IDispatch *pSelection;
{
VARIANT result;
VariantInit(&result);
OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
pSelection=result.pdispVal;
}
IDispatch *pFind;
{
VARIANT result;
VariantInit(&result);
OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"Find", 0);
pFind=result.pdispVal;
}
OLEMethod(DISPATCH_METHOD, NULL, pFind, L"ClearFormatting",0);
szText.Replace(_T("\r\n"), _T("\v"));
COleVariant sVariable(szVar);
COleVariant sReplaceText(szText);
COleVariant replace((long)2);
COleVariant varBoolTrue;
varBoolTrue.boolVal = true;
COleVariant varBoolFalse;
varBoolFalse.boolVal = false;
COleVariant wdContinue((long)1);
bool bFound=false;
IDispatch *pExecute = NULL;
{
for(;;) {
VARIANT result;
VariantInit(&result);
if(OLEMethod(DISPATCH_METHOD, &result, pFind, L"Execute", 8, wdContinue, varBoolTrue, varBoolFalse, varBoolFalse, varBoolFalse, varBoolTrue, varBoolFalse, sVariable)==S_OK) {
pExecute=result.pdispVal;
if(!pExecute) break;
bFound = true;
if(szText.IsEmpty()) DeleteChar(false); else SetSelectionText(szText);
}
else break;
if(bOnlyOnce) break;
}
}
pDocApp->Release();
pSelection->Release();
pFind->Release();
if(!bFound) return E_FAIL;
else return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
问题是,此代码不会触及页眉或页脚中的任何文本.
也许pFind执行方法有一个参数?
老实说,自周一以来,我一直在关注这个问题.我的大多数搜索结果都是VB,C#,.NET和VBA文档,但是很少有关于VC++ OLE的文档,几行代码,但没有任何帮助.我甚至开始创建和翻译一些Word宏,没有任何作用.
在Stack Overflow上,我发现了许多与此主题相关的问题.其中一些看起来很有希望,但似乎他们正在使用一些我不知道的框架,如果我要求提供示例代码或链接,人们就没有留下任何回复.
如果有人可以帮我解决这个问题,那就太棒了,我非常感谢关于OLE Word自动化一般主题的文档和代码的链接(除了这个代码项目文章).
提前致谢!
这是一个在标题中搜索和替换的 Delphi 函数。我知道这是一个 C++ 问题,但你可以从函数中看到你需要做什么。
我总是发现在工作中做某事的最简单方法是使用 MacroRecorder 并查看 word 如何执行此操作,然后从您的应用程序调用该代码。
我很遗憾你用 C++ 进行 COM 编程
Procedure Find_ReplaceText(find, ReplaceWith: String; Header : Boolean = false);
var
tmpText: String;
spos , epos : Integer;
begin
{Start on first page.}
fWordApp.Selection.Goto(wdGoToPage,wdGotoFirst);
{Extra code is needed if I'm trying to replace text in the header}
if Header then
begin
fWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
If fWordApp.Selection.HeaderFooter.IsHeader = False Then
begin
fWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
end;
tmpText := fWordApp.ActiveDocument.sections.item(1).Headers.item(wdHeaderFooterPrimary).Range.text;
spos := pos('[' ,tmptext);
epos := pos(']' , tmpText);
tmptext := copy(tmptext,1, spos);
tmptext := tmptext + ReplaceWith + ']';
fWordApp.ActiveDocument.sections.item(1).Headers.item(wdHeaderFooterPrimary).Range.text := tmptext;
fWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
end
else
begin
fWordApp.Selection.Find.Text := find;
fWordApp.Selection.Find.Execute;
fWordApp.Selection.typeText(' ');
fWordApp.Selection.InsertAfter(ReplaceWith);
end;
end;
Run Code Online (Sandbox Code Playgroud)