Automatizzazione di Excel da MFC e Visual C++ 2005 o Visual C++ .NET per inserire o ottenere dati in un intervallo utilizzando matrici

Traduzione articoli Traduzione articoli
Identificativo articolo: 308407 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato precedentemente pubblicato con il codice di riferimento I308407
Per la versione di questo articolo relativa a Microsoft Visual C# .NET, vedere 302096.
Per la versione di questo articolo relativa a Microsoft Visual Basic .NET, vedere 302094.
Nota Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 e Microsoft Visual C++ .NET 2002 supportano sia il modello di codice gestito reso disponibile in Microsoft .NET Framework che il modello di codice non gestito nativo di Microsoft Windows. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene illustrata la procedura dettagliata per automatizzare Microsoft Excel da Visual C++ 2005 o Visual C++ .NET allo scopo di inserire e recuperare valori in un intervallo di pi¨ celle tramite matrici.

Creazione di un client di automazione per Excel

Per compilare un intervallo di pi¨ celle senza popolare le celle una alla volta, Ŕ possibile impostare la proprietÓ Value di un oggetto Range su una matrice bidimensionale. Allo stesso modo, Ŕ possibile recuperare una matrice bidimensionale di valori per pi¨ celle in una sola volta utilizzando la proprietÓ Value. Nella procedura seguente viene illustrato questo processo sia per l'impostazione che per il recupero di dati tramite matrici bidimensionali.
  1. Per creare un client di automazione di base, attenersi alla procedura "Creare un client di automazione" nel seguente articolo della Microsoft Knowledge Base:
    307473 How to: Utilizzare una libreria di tipi per l'automazione di Office da Visual C++ .NET
    Nel passaggio 3 aggiungere al form un secondo pulsante e una casella di controllo. Modificare l'ID del pulsante in IDC_GETVALUES e la didascalia in Get Values. Modificare l'ID della casella di controllo in IDC_CHECK e la didascalia in Fill with Strings.

    Nel passaggio 4 dell'articolo selezionare "Libreria oggetti di Microsoft Excel 10.0" se si automatizza Excel 2002 da Office XP. Il percorso predefinito di Excel 2002 Ŕ C:\Programmi\Microsoft Office\Office10\Excel.exe. In alternativa, selezionare "Libreria oggetti di Microsoft Excel 11.0" se si automatizza Microsoft Office Excel 2003. Il percorso predefinito per Excel 2003 Ŕ C:\Programmi\Microsoft Office\Office11\Excel.exe. Selezionare le seguenti interfacce di Microsoft Excel:
    • _Application
    • _Workbook
    • _Worksheet
    • Range
    • Workbooks
    • Worksheets
    Nel passaggio 6 aggiungere le istruzioni #include riportate di seguito direttamente dopo la direttiva #pragma once in Autoprojectdlg.h:
    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    					
  2. Aggiungere le due variabili membro pubbliche seguenti alla classe CAutoProjectDlg:
    CApplication oExcel;
    CWorkbook oBook;
    					
  3. Nella finestra di dialogo fare clic con il pulsante destro del mouse su IDC_CHECK e scegliere Aggiungi variabile. Denominare la variabile m_bFillWithStrings e scegliere Fine.
  4. Nella finestra di dialogo fare doppio clic su Esegui e sostituire il codice seguente
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    con:
    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 In Visual C++ 2005 Ŕ necessario aggiungere l'opzione del compilatore per il supporto di Common Language Runtime (/clr:oldSyntax) per compilare correttamente l'esempio di codice precedente. A tale scopo, attenersi alla seguente procedura:
    1. Fare clic su Progetto, quindi scegliere ProprietÓ Nomeprogetto.

      Nota Nomeprogetto Ŕ il segnaposto del nome del progetto.
    2. Espandere ProprietÓ di configurazione, quindi scegliere Generale.
    3. Nel riquadro di destra fare clic per selezionare Supporto Common Language Runtime, vecchia sintassi (/clr:oldSyntax) nelle impostazioni di progetto Supporto Common Language Runtime.
    4. Scegliere Applica, quindi OK.
    Per ulteriori informazioni sull'utilizzo delle opzioni del compilatore per il supporto di Common Language Runtime, visitare il seguente sito Web Microsoft Developer Network (informazioni in lingua inglese):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
    Questa procedura si applica all'intero articolo.
  5. Tornare nella finestra di dialogo e fare doppio clic su Get Values Sostituire il codice seguente
    void CAutoProjectDlg::OnBnClickedGetvalues() 
    {
             // TODO: Add your control notification handler code here
    }
    con:
    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);
    }
    					

Verifica del client di automazione

  1. Premere F5 per compilare ed eseguire il programma di esempio.
  2. Scegliere Esegui. VerrÓ avviato Excel con una nuova cartella di lavoro e le celle A1:E5 del primo foglio di lavoro verranno popolate con dati numerici provenienti da una matrice.
  3. Scegliere Get Values. I dati nelle celle A1:E5 verranno recuperati in una nuova matrice e i risultati verranno visualizzati in una finestra di messaggio.
  4. Selezionare Fill With Strings e scegliere Esegui per inserire dati stringa nelle celle A1:E5.
  5. Scegliere Get Values per visualizzare i valori delle stringhe in una finestra di messaggio.

Risoluzione dei problemi

Se si aggiungono wrapper di classe per la libreria di oggetti di Excel tramite l'opzione File dell'Aggiunta guidata classe da libreria dei tipi, Ŕ possibile che si riceva un messaggio di errore quando si tenta di individuare la libreria di oggetti. Per evitare il problema, digitare il percorso completo e il nome di file per la libreria di oggetti invece di tentare di individuare il file. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
311408 BUG: Avviso relativo a sola lettura quando si aggiunge una classe MFC da una libreria
Se viene visualizzato il seguente messaggio di errore quando si genera l'applicazione di esempio, in CRange.h cambiare "Variant DialogBox" in "Variant _DialogBox":
avviso C4003: parametri effettivi insufficienti per la macro 'DialogBoxA'
Per ulteriori informazioni sulla causa di questo errore, vedere il seguente articolo della Microsoft Knowledge Base:
311407 BUG: Impossibile risolvere i conflitti di denominazione con le macro API tramite la creazione guidata classe MFC

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web Microsoft Developer Network (MSDN) (informazioni in lingua inglese):
Sviluppo di Microsoft Office con Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Per ulteriori informazioni sull'utilizzo di matrici per l'impostazione e il recupero di dati di Excel con versioni precedenti di Visual Studio, vedere i seguenti articoli della Microsoft Knowledge Base:
186120 Utilizzo di MFC per automatizzare Excel e riempire un intervallo con una matrice
186122 Utilizzo di MFC per automatizzare Excel e ottenere una matrice da un intervallo
247412 Metodi per il trasferimento di dati da Visual Basic a Excel

ProprietÓ

Identificativo articolo: 308407 - Ultima modifica: mercoledý 31 gennaio 2007 - Revisione: 7.0
Le informazioni in questo articolo si applicano 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
Chiavi:á
kbautomation kbhowtomaster KB308407
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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