Cómo usar la automatización de Word para contar el número de páginas de cada sección de un documento

Resumen

En este artículo se describe cómo puede usar la automatización con Word para determinar el número de páginas de cada sección de un documento.

Más información

En el código de ejemplo siguiente se usa un documento que se guarda en C:\Mydoc.doc. Para probar el código de ejemplo, cree un nuevo documento con varias secciones y varias páginas y guárdelo como C:\Mydoc.doc, o bien cambie la ruta de acceso del documento en el código para hacer referencia a uno de los documentos de Word existentes.

NOTA: El código de ejemplo supone que un salto de sección fuerza un nuevo salto de página y que cada página no contiene más de una sección. Por lo tanto, al insertar saltos de sección al crear la C:\Mydoc.doc documento de Word para probar el código de ejemplo, debe elegir Página siguiente como tipo de salto de sección.

Ejemplo de Visual Basic

  1. En Visual Basic, cree un nuevo proyecto EXE estándar. Form1 se crea de forma predeterminada.

  2. Agregue un botón de comando a Form1 y agregue el código siguiente al evento Click del botón:

        Dim oApp As Object
        Dim oDoc As Object
        Dim oTbl As Object
    
    'Start Word and open the document.
        Set oApp = CreateObject("Word.Application")
        'For Word 2007, change the path to "c:\mydoc.docx"
        Set oDoc = oApp.Documents.Open("c:\mydoc.doc")
    
    'Repaginate the document.
        oDoc.Repaginate
    
    'Iterate each section in the document to retrieve the end page of the
        'document and compute the page count in that section. The results are 
        'displayed in the Immediate window.
        Dim oSec As Object
        Dim nStartPg As Integer, nEndPg As Integer, nSecPages As Integer
        Dim NumSections As Integer
        NumSections = oDoc.Sections.Count
        nStartPg = 1
        For Each oSec In oDoc.Sections
           nEndPg = oSec.Range.Information(3) - 1  'wdActiveEndPageNumber=3
           'Account for the last page.
           If oSec.Index = NumSections Then nEndPg = nEndPg + 1
           nSecPages = nEndPg - nStartPg + 1
           Debug.Print "Section " & oSec.Index & " --", _
                       "StartPage: " & nStartPg, _
                       "EndPage: " & nEndPg, _
                       "TotalPages: " & nSecPages
           nStartPg = nEndPg + 1
        Next
    
    'Close the document without saving changes and quit Word.
        oDoc.Close False
        oApp.Quit
    
    
  3. Presione F5 para ejecutar la aplicación y haga clic en el botón del formulario. El código muestra el recuento de páginas de cada sección en la ventana Inmediato.

Ejemplo de MFC

  1. Siga los pasos del 1 al 12 del artículo siguiente de Microsoft Knowledge Base para crear un proyecto de ejemplo que use las interfaces IDispatch y las funciones miembro definidas en la biblioteca de tipos MSWord9.olb.

  2. Debe quitar la biblioteca de automatización de Excel.

    En la parte superior de AutoProjectDlg.cpp, agregue una de las líneas siguientes:

    • En Word 2002 y en versiones posteriores de Word, agregue la línea siguiente:

      #include "MSWord.h"
      
    • En Word 2000, agregue la línea siguiente:

      #include "MSWord9.h"
      
  3. Agregue el código siguiente a CAutoProjectDlg::OnRun() en AutoProjectDlg.cpp.

    COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
    //Start Word.
    _Application oWord;
    oWord.CreateDispatch("Word.Application");
    oWord.SetScreenUpdating(FALSE);
    
    //Open the document.
    Documents oDocs = oWord.GetDocuments();
    // For Word 2007, use:
    // _Document oDoc = oDocs.Open(COleVariant("c:\\mydoc.docx"),
    //     vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt, vOpt, vOpt,vOpt,vOpt,vOpt,vOpt);
    _Document oDoc = oDocs.Open(COleVariant("c:\\mydoc.doc"),
             vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt, vOpt, vOpt,vOpt,vOpt,vOpt,vOpt);
    
    //Repaginate the document.
    oDoc.Repaginate();
    
    //Iterate the collection of sections in the document to retrieve the page 
    //count for each section.
    Sections oSecs = oDoc.GetSections();
    long NumSections = oSecs.GetCount();
    long i;
    long StartPage=1; //Section start page.
    long EndPage=0;  //Section end page.
    long NumPages=0;  //Number of pages in the section.
    for(i=1;i<=NumSections;i++)
    {
    Section oSec = oSecs.Item(i);
    Range oSecRange = oSec.GetRange();
    VARIANT vInfo = oSecRange.GetInformation(3L);//wdActiveEndPageNumber=3
    //If oSec.Index = NumSections Then nEndPg = nEndPg + 1
    if(oSec.GetIndex()== NumSections) {EndPage++;}
    EndPage = vInfo.lVal-1;
    if(i==NumSections) {EndPage++;}  //Account for the last section.
    NumPages = EndPage - StartPage +1;
    char buf[5];
    sprintf(buf,"%d", NumPages);
    TRACE1("Section %d\n", oSec.GetIndex());
    TRACE3("   StartPage: %d  EndPage: %d   TotalPages: %d\n",
       StartPage, EndPage, NumPages);
    StartPage = EndPage + 1;
    }
    
    //Close the document without saving the changes, and then exit Word.
    oDoc.Close(COleVariant((short)false), vOpt, vOpt);
    oWord.Quit(COleVariant((short)false), vOpt, vOpt);
    
    
  4. Compile y ejecute el proyecto.

  5. Cuando aparezca el cuadro de diálogo, haga clic en Ejecutar. Los resultados del recuento se muestran en la ventana Depurar. Debe arrastrar la variable NumPages a la ventana Depurar.

(c) Microsoft Corporation 2001, Todos los derechos reservados. Contribuciones de Lori B. Turner, Microsoft Corporation.

Referencias

Para obtener más información, vea los siguientes sitios web de Microsoft Developer Network (MSDN):

Desarrollo de Microsoft Office con Visual Studio https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspx

Centro para desarrolladores de Microsoft Office https://msdn.microsoft.com/office

Para obtener más información, consulte el artículo en Microsoft Knowledge Base:

220911 Cómo automatizar Microsoft Word para realizar una combinación de correspondencia mediante Visual C++ y MFC