Como automatizar o Excel a partir do MFC e Visual C++ .NET ou Visual C++ 2005 para preencher ou obter os dados em um intervalo usando matrizes

Traduções deste artigo Traduções deste artigo
ID do artigo: 308407 - Exibir os produtos aos quais esse artigo se aplica.
Para obter uma Microsoft translation from VPE for Csharp .NET versão deste artigo, consulte 302096.
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 302094.
Observação Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 e Microsoft Visual C++ .NET 2002 oferecem suporte o modelo de código gerenciado fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações contidas neste artigo se aplicam somente ao Visual C++ não gerenciado código.
Expandir tudo | Recolher tudo

Neste artigo

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 recuperar valores em um intervalo multi-cell usando matrizes.

Criar um cliente de automação para o Excel

Para preencher um intervalo multi-cell sem preenchendo células uma vez, você pode definir a propriedade Value de um objeto de intervalo em uma matriz bidimensional. Da mesma forma, você pode recuperar uma matriz bidimensional de valores para várias células ao mesmo tempo, usando a propriedade Value . As seguintes etapas demonstram este processo para definir e recuperar dados usando matrizes bidimensionais.
  1. Siga as etapas na seção "Criar um cliente de automação" do seguinte artigo da Base de dados de Conhecimento da Microsoft para criar um cliente de automação básico:
    307473Como usar uma biblioteca de tipos de automação do Office do Visual C++ .NET
    Na etapa 3, adicione um segundo botão e uma caixa de seleção para o formulário. Altere a identificação do botão para IDC_GETVALUES e a legenda para Obter valores . Altere a identificação da caixa de seleção para IDC_CHECK e a legenda para preencher com seqüências de caracteres .

    Na etapa 4 do artigo, selecione "Microsoft Excel 10.0 Object Library" Se você estiver automatizando o Excel 2002 pelo Office XP. O local padrão para o Excel 2002 é C:\Program Files\Microsoft Office\Office10\Excel.exe. Ou, selecione "Microsoft Excel 11.0 Object Library" Se você estiver automatizando o Microsoft Office Excel 2003. O local padrão para o Excel 2003 é C:\Program Files\Microsoft Office\Office11\Excel.exe. Selecione as interfaces do Microsoft Excel a seguir:
    • _Application
    • _Workbook
    • _Worksheet
    • Intervalo
    • Pastas de trabalho
    • Planilhas
    Na etapa 6, adicione as seguintes instruções # include diretamente após a diretiva # pragma uma vez na Autoprojectdlg.h:
    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    					
  2. Adicione duas variáveis de membro público a seguir à classe CAutoProjectDlg :
    CApplication oExcel;
    CWorkbook oBook;
    					
  3. Na caixa de diálogo, clique com o botão direito do mouse IDC_CHECK e selecione Adicionar variável . Nome m_bFillWithStrings variável e clique em Concluir .
  4. Na sua caixa de diálogo, clique duas vezes em Executar e substitua o código a seguir
    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));
    }
    					
    Observação Visual C++ 2005, você deve adicionar a opção de compilador de suporte de tempo de execução idioma comum ( / CLR: oldSyntax ) para compilar o exemplo de código anterior com êxito. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum, siga estas etapas:
    1. Clique em projeto e, em seguida, clique em propriedades ProjectName.

      Observação ProjectName é um espaço reservado para o nome do projeto.
    2. Expanda Configuration Properties e, em seguida, clique em Geral .
    3. No painel direito, clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) nas configurações de projeto oferece suporte a Common Language Runtime .
    4. Clique em Aplicar e em seguida, clique em OK .
    Para obter mais informações sobre common language runtime oferece suporte às opções de compilador, visite o seguinte site da Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
    Estas etapas se aplicam o artigo inteiro.
  5. Retorne à sua caixa de diálogo e clique duas vezes em Obter valores . Substitua o código a seguir
    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);
    }
    					

O cliente de automação de teste

  1. Pressione F5 para compilar e executar o programa de exemplo.
  2. Clique em Executar . O programa inicia o Excel com uma nova pasta de trabalho e preenche A1:E5 células da primeira planilha com dados numéricos em uma matriz.
  3. Clique em obter valores . O programa recupera os dados em células A1:E5 em uma nova matriz e exibe os resultados em uma caixa de mensagem.
  4. Selecione o Preenchimento com seqüências e clique em Executar para preencher células A1:E5 com dados de seqüência de caracteres.
  5. Clique em Obter valores a serem exibidos os valores de seqüência de caracteres em uma caixa de mensagem.

Solução de problemas

Se você adicionar classe invólucros para a biblioteca de objetos do Excel, usando a opção arquivo no Assistente de classe de TypeLib para adicionar, você receberá uma mensagem de erro ao navegar para a biblioteca de objetos. Para evitar esse problema, digite o nome arquivo e caminho completo para a biblioteca de objeto em vez de navegar para o arquivo. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
311408Erro: 'Somente leitura' aviso ao adicionar classe do MFC de biblioteca
Se você receber a seguinte mensagem de erro quando você cria seu aplicativo de exemplo, altere "DialogBox Variant" na CRange.h para "Variant _DialogBox":
Aviso C4003: não há parâmetros reais para a macro 'DialogBoxA'
Para obter mais informações sobre a causa desse erro, consulte o seguinte artigo da Base de dados de Conhecimento:
311407Erro: O MFC Wizard não resolve de nomenclatura conflitos com macros de API

Referências

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

Propriedades

ID do artigo: 308407 - Última revisão: quarta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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