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
No Visual Basic, crie um novo projeto EXE Padrão. O formulário1 é criado por predefinição.
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
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
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.
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"
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);
Compile e execute o projeto.
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