Como utilizar a automatização do Word para contar o número de páginas em cada secção de um documento

Resumo

Este artigo descreve como pode utilizar a automatização com o Word para determinar o número de páginas em cada secção de um documento.

Mais Informações

O seguinte código de exemplo utiliza um documento guardado no C:\Mydoc.doc. Para testar o código de exemplo, crie um novo documento com múltiplas secções e múltiplas páginas e guarde-o como C:\Mydoc.doc ou altere o caminho do documento no código para referenciar um dos seus documentos existentes do Word.

NOTA: o código de exemplo parte do princípio de que uma quebra de secção força uma nova quebra de página e que cada página não contém mais do que uma secção. Assim, quando inserir quebras de secção ao criar o documento C:\Mydoc.doc Word para testar o código de exemplo, deve selecionar Página Seguinte como o tipo Quebra de Secção.

Exemplo do Visual Basic

  1. No Visual Basic, crie um novo projeto EXE Padrão. O formulário1 é criado por predefinição.

  2. Adicione um botão de comando ao Formulário1 e adicione o seguinte código ao evento Click do botão:

        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. Prima F5 para executar a aplicação e clique no botão no formulário. O código apresenta a contagem de páginas para cada secção na janela Imediato.

Exemplo MFC

  1. Siga os passos 1 a 12 no seguinte artigo na Base de Dados de Conhecimento Microsoft para criar um projeto de exemplo que utilize as interfaces IDispatch e funções de membros definidas na biblioteca de tipos MSWord9.olb.

  2. Tem de remover a biblioteca de automatização do Excel.

    Na parte superior de AutoProjectDlg.cpp, adicione uma das seguintes linhas:

    • No Word 2002 e em versões posteriores do Word, adicione a seguinte linha:

      #include "MSWord.h"
      
    • No Word 2000, adicione a seguinte linha:

      #include "MSWord9.h"
      
  3. Adicione o seguinte código a CAutoProjectDlg::OnRun() no 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 e execute o projeto.

  5. Quando a caixa de diálogo aparecer, clique em Executar. Os resultados da contagem são apresentados na janela Depurar. Tem de arrastar a variável NumPages para a janela Depurar.

(c) Microsoft Corporation 2001, Todos os Direitos Reservados. Contribuições de Lori B. Turner, Microsoft Corporation.

Referências

Para obter mais informações, consulte os seguintes Sites do Microsoft Developer Network (MSDN):

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

Centro de Programadores do Microsoft Office https://msdn.microsoft.com/office

Para obter informações adicionais, veja o artigo na Base de Dados de Conhecimento Microsoft:

220911 Como Automatizar o Microsoft Word para efetuar uma Mensagem de Correio Utilizando Visual C++ e MFC