que poner pie pagina nombre insertar hoja encabezado diferente como capitulo cada archivo visual-c++ com mfc ole office-automation

visual-c++ - poner - nombre del capitulo en encabezado word



Buscar y reemplazar en la automatización de Word OLE: ¿cómo cubrir el encabezado y el pie de página? (1)

Tengo una función que funciona perfectamente para encontrar y reemplazar una variable con texto en documentos de 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; }

El problema es que este código no tocará ningún texto en el encabezado o pie de página.

Tal vez hay un parámetro para el método de ejecución pFind?

Honestamente, he estado investigando este problema desde el lunes. La mayoría de mis resultados de búsqueda son documentación VB, C #, .NET y VBA, pero hay poca documentación sobre VC ++ OLE, algunas líneas de código, pero nada útil. Incluso comencé a crear y traducir algunas macros de Word, nada funciona.

Aquí, en Stack Overflow, encontré muchas preguntas relacionadas con este tema. Algunos de ellos parecían prometedores, pero parece que están usando algún marco que no conozco y las personas no han dejado respuesta si he pedido código de muestra o enlaces.

Si alguien me puede ayudar en este asunto sería increíble y realmente agradecería los enlaces a la documentación y el código sobre el tema general de la automatización de Word OLE (además de este artículo del proyecto de código).

¡Gracias por adelantado!


Aquí hay una función Delphi que busca y reemplaza en el encabezado. Sé que esta es una pregunta de C ++, pero puede ver en las funciones lo que necesita hacer.

Siempre encuentro que la forma más sencilla de hacer algo en el trabajo es utilizar el MacroRecorder y ver cómo lo hace, luego llamar ese código desde tu aplicación.

Lamento que hagas la programación COM en C ++

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;