Como automatizar o Excel a partir de MFC e Visual C++ 2005 ou Visual C++ .NET para preencher ou obter dados num intervalo utilizar matrizes

Traduções de Artigos Traduções de Artigos
Artigo: 308407 - Ver produtos para os quais este artigo se aplica.
Para obter uma Microsoft C# .NET versão deste artigo, consulte 302096.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 302094.
Nota Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 e Microsoft Visual C++ .NET 2002 suportam o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações contidas neste artigo aplicam-se apenas ao Visual C++ não gerido código.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo demonstra como automatizar o Microsoft Excel a partir do Visual C++ 2005 ou Visual C++ .NET para preencher e obter valores num intervalo multi-cell através da utilização de matrizes.

Criar um cliente de automatização do Excel

Para preencher um intervalo multi-cell sem preencher células um ao mesmo tempo, pode definir a propriedade de valor de um objecto de intervalo para uma matriz bidimensional. Do mesmo modo, é possível obter uma matriz bidimensional de valores de várias células ao mesmo tempo utilizando a propriedade de valor . Os passos seguintes demonstram este processo para definir e obter dados utilizando matrizes bidimensionais.
  1. Siga os passos descritos na secção "Criar um cliente de automatização" do seguinte artigo da base de dados de conhecimento da Microsoft para criar um cliente de automatização básico:
    307473Como utilizar uma biblioteca de tipos de automatização do Office a partir do Visual C++ .NET
    No passo 3, adicione um segundo botão e uma caixa de verificação ao formulário. Alterar o ID do botão IDC_GETVALUES e a legenda para Obter valores . Alterar o ID da caixa de verificação para IDC_CHECK e a legenda para preencher com cadeias .

    No passo 4 do artigo, seleccione "Microsoft Excel 10.0 Object Library" Se estiver a automatizar o Excel 2002 a partir do Office XP. A localização predefinida para o Excel 2002 é C:\Program Files\Microsoft Office\Office10\Excel.exe. Ou, seleccione "Microsoft Excel 11.0 Object Library" Se estiver a automatizar o Microsoft Office Excel 2003. A localização predefinida para o Excel 2003 é C:\Program Files\Microsoft Office\Office11\Excel.exe. Seleccione as seguintes interfaces de Microsoft Excel:
    • _Application
    • _Workbook
    • _Worksheet
    • Intervalo
    • Livros
    • Folhas de cálculo
    No passo 6, adicione as seguintes instruções # include imediatamente a seguir a directiva # pragma uma vez no Autoprojectdlg.h:
    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    					
  2. Adicione as seguintes duas variáveis de membro público à classe CAutoProjectDlg :
    CApplication oExcel;
    CWorkbook oBook;
    					
  3. A caixa de diálogo, clique com o botão direito do rato IDC_CHECK e seleccione Adicionar variável . Atribua um nome de variável m_bFillWithStrings e clique em Concluir .
  4. No caixa de diálogo, faça duplo clique em Executar e substitua o seguinte código
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    com:
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	CWorkbooks oBooks;
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// If you have not created Excel, create a new instance.
    	if (oExcel.m_lpDispatch == NULL) {
    		oExcel.CreateDispatch("Excel.Application");
    	}
    	// Show Excel to the user.
    	oExcel.put_Visible(TRUE);
    	oExcel.put_UserControl(TRUE);
    
    	// Add a new workbook and get the first worksheet in that book.
    	oBooks = oExcel.get_Workbooks();
    	oBook = oBooks.Add(covOptional);
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    
    	// Get a range of data.
    	oRange = oSheet.get_Range(COleVariant("A1"),covOptional);
    	oRange = oRange.get_Resize(COleVariant((short)5),COleVariant((short)5));
    
    	COleSafeArray saRet;
    	DWORD numElements[2];
    	numElements[0] = 5;
    	numElements[1] = 5;
    
    	long index[2];
    	// Create a BSTR or double safe array.
    	if (m_bFillWithStrings.GetCheck())
    		saRet.Create(VT_BSTR,2,numElements);
    	else
    		saRet.Create(VT_R8,2,numElements);
    
    	// Fill the array with data.
    	for (int iRow = 1; iRow <= 5; iRow++) {
    		for (int iCol = 1; iCol <= 5; iCol++) {
    			index[0]=iRow-1;
    			index[1]=iCol-1;
    			if (m_bFillWithStrings.GetCheck()) {
    				CString szTemp;
    				szTemp.Format("%d|%d",iRow,iCol);
    				BSTR bstr = szTemp.AllocSysString();
    				saRet.PutElement(index,bstr);
    				SysFreeString(bstr);
    			} else {
    				double d = iRow * iCol;
    				saRet.PutElement(index,&d);
    			}
    		}
    	}
    	// Send the array to Excel.
    	oRange.put_Value(covOptional,COleVariant(saRet));
    }
    					
    Nota no Visual C++ 2005, terá de adicionar a opção de compilador do suporte de tempo de execução idioma comum ( / clr:oldSyntax ) para compilar com êxito o anterior exemplo de código. Para adicionar a opção de compilador do suporte de tempo de execução idioma comum, siga estes passos:
    1. Clique em projecto e, em seguida, clique em propriedades ProjectName.

      Nota ProjectName é um marcador para o nome do projecto.
    2. Expanda Propriedades de configuração e, em seguida, clique em Geral .
    3. No painel direito, clique para seleccionar Runtime do idioma comum suporte, sintaxe antigo (/ clr:oldSyntax) no Common Language Runtime suporta definições do projecto.
    4. Clique em Aplicar e, em seguida, clique em OK .
    Para mais informações sobre o common language runtime suporta opções de compilador, visite o seguinte Web site da Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
    Estes passos aplicam-se para o artigo completo.
  5. Regresse à caixa de diálogo e faça duplo clique em Obter valores . Substitua o seguinte código
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    com:
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// Make sure that Excel has been started.
    	if (oExcel.m_lpDispatch == NULL) {
    		AfxMessageBox("Excel has not been started.  Press button1 to start Excel.");
    		return;
    	}
    	// Get the first worksheet.
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    	// Set the range of data to retrieve
       	oRange = oSheet.get_Range(COleVariant("A1"),COleVariant("E5"));
    
    	// Get the data.
    	COleSafeArray saRet(oRange.get_Value(covOptional));
    
            long iRows;
            long iCols;
            saRet.GetUBound(1, &iRows);
            saRet.GetUBound(2, &iCols);
    
    	CString valueString = "Array Data:\r\n";
    	long index[2];
    	// Loop through the data and report the contents.
    	for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {
    		for (int colCounter = 1; colCounter <= iCols; colCounter++) {
    			index[0]=rowCounter;
    			index[1]=colCounter;		   
    			COleVariant vData;
    			saRet.GetElement(index,vData);
    			CString szdata(vData);
                valueString += szdata;
    			valueString += "\t";		
    		}
    		valueString += "\r\n";
    	}
    	AfxMessageBox(valueString,MB_SETFOREGROUND,NULL);
    }
    					

Testar o cliente de automatização

  1. Prima F5 para compilar e executar o programa de exemplo.
  2. Clique em Executar . O programa inicia o Excel com um novo livro e povoa células A1:E5 da primeira folha de cálculo com dados numéricos de uma matriz.
  3. Clique em obter valores . O programa obtém os dados em células A1:E5 para uma nova matriz e apresenta os resultados numa caixa de mensagem.
  4. Seleccione o Preenchimento com cadeias e clique em Executar para preencher células A1:E5 com dados de cadeia.
  5. Clique em Obter valores a apresentar os valores de cadeia numa caixa de mensagem.

Resolução de problemas

Se adicionar wrappers de classe da biblioteca de objectos do Excel utilizando a opção ficheiro de classe de TypeLib Assistente para adicionar, poderá receber uma mensagem de erro quando navega para a biblioteca de objectos. Para evitar este problema, escreva o nome ficheiro e caminho completo para a biblioteca de objecto em vez de navegar para o ficheiro. Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
311408Erro: 'Só de leitura' aviso quando adicionar classes MFC de biblioteca
Se receber a seguinte mensagem de erro ao criar a aplicação de exemplo, altere "Variante falha" em CRange.h para "Variante _DialogBox":
aviso C4003: insuficiente parâmetros reais para a macro 'DialogBoxA'
Para obter mais informações sobre a causa deste erro, consulte o seguinte artigo da base de dados de conhecimento:
311407Erro: Assistente de MFC não resolve conflitos com macros de API de atribuição de nomes

Referências

Para mais informações, consulte o Microsoft Developer seguinte Web site Network (MSDN):
Desenvolvimento do Microsoft Office com o Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Para mais informações sobre como utilizar matrizes para definir e obter dados com versões anteriores do Visual Studio do Excel, consulte os seguintes artigos base de dados de conhecimento:
186120Como utilizar MFC para automatizar o Excel e preencher um intervalo com uma matriz
186122Como utilizar MFC para automatizar o Excel e obter uma matriz a partir de um intervalo
247412INFO: Métodos para transferir dados para o Excel a partir do Visual Basic

Propriedades

Artigo: 308407 - Última revisão: 17 de janeiro de 2007 - Revisão: 6.3
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
Palavras-chave: 
kbmt kbautomation kbhowtomaster KB308407 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 308407

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com