Come automatizzare Excel da MFC e Visual C++ 2005 o Visual C++ .NET per compilare o ottenere dati in un intervallo usando matrici

Per una versione .NET di Microsoft C# di questo articolo, vedere 302096. Per una versione di Microsoft Visual Basic .NET di questo articolo, 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 fornito da Microsoft .NET Framework che il modello di codice nativo di Microsoft Windows non gestito. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.

Riepilogo

Questo articolo dettagliato illustra come automatizzare Microsoft Excel da Visual C++ 2005 o Visual C++ .NET per compilare e recuperare valori in un intervallo di più celle usando matrici.

Creare un client di automazione per Excel

Per riempire un intervallo di più celle senza popolamento di celle una alla volta, è possibile impostare la proprietà Value di un oggetto Range su una matrice bidimensionale. Analogamente, è possibile recuperare una matrice bidimensionale di valori per più celle contemporaneamente usando la proprietà Value. I passaggi seguenti illustrano questo processo sia per l'impostazione che per il recupero dei dati usando matrici bidimensionali.

  1. Seguire la procedura descritta nella sezione "Creare un client di automazione" dell'articolo della Microsoft Knowledge Base seguente per creare un client di Automazione di base:

    307473 come usare una libreria dei tipi per l'automazione di Office da Visual C++ .NET

    Nel passaggio 3 aggiungere un secondo pulsante e una casella di controllo al modulo. Modificare l'ID del pulsante in IDC_GETVALUES e la didascalia in Recupera valori. Modificare l'ID della casella di controllo in IDC_CHECK e la didascalia in Riempimento con stringhe.

    Nel passaggio 4 dell'articolo selezionare "Libreria oggetti di Microsoft Excel 10.0" se si automatizza Excel 2002 da Office XP. Il percorso predefinito per 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 interfacce di Microsoft Excel seguenti:

    • _Applicazione
    • _Cartella
    • _Foglio di lavoro
    • Intervallo
    • Cartelle
    • Fogli di lavoro

    Nel passaggio 6 aggiungere le istruzioni #include seguenti 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. Assegnare alla variabile il nome m_bFillWithStrings e fare clic su 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 di supporto di Common Language Runtime (/clr:oldSyntax) per compilare correttamente l'esempio di codice precedente. Per aggiungere l'opzione del compilatore di supporto di Common Language Runtime, seguire questa procedura:

    1. Fare clic su Progetto e quindi su Proprietà NomeProgetto.

      NotaProjectName è un segnaposto per il nome del progetto.

    2. Espandere Proprietà di configurazione e quindi fare clic su Generale.

    3. Nel riquadro destro fare clic per selezionare Supporto di Common Language Runtime, Sintassi precedente (/clr:oldSyntax) nelle impostazioni del progetto di supporto di Common Language Runtime .

    4. Fare clic su Applica e quindi su OK.

    Per altre informazioni sulle opzioni del compilatore di supporto di Common Language Runtime, visitare il seguente sito Web Microsoft Developer Network (MSDN):

    https://msdn.microsoft.com/en-us/library/k8d11d4s.aspxQuesti passaggi si applicano all'intero articolo.
    5. Tornare alla finestra di dialogo e fare doppio clic su Recupera valori. 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);
    }
    
    

Testare il client di automazione

  1. Premere F5 per compilare ed eseguire il programma di esempio.
  2. Fare clic su Esegui. Il programma avvia Excel con una nuova cartella di lavoro e popola le celle A1:E5 del primo foglio di lavoro con i dati numerici di una matrice.
  3. Fare clic su Recupera valori. Il programma recupera i dati nelle celle A1:E5 in una nuova matrice e visualizza i risultati in una finestra di messaggio.
  4. Selezionare Riempi con stringhe e fare clic su Esegui per riempire le celle A1:E5 con i dati stringa.
  5. Fare clic su Recupera valori per visualizzare i valori stringa in una finestra di messaggio.

Risoluzione dei problemi

Se si aggiungono wrapper di classe per la libreria di oggetti di Excel usando l'opzione File nell'Aggiunta guidata classe dalla libreria dei tipi, è possibile che venga visualizzato un messaggio di errore quando si passa alla libreria di oggetti. Per evitare questo problema, digitare il percorso completo e il nome del file per la libreria di oggetti anziché passare al file.

Se viene visualizzato il messaggio di errore seguente durante la compilazione dell'applicazione di esempio, modificare "Variant DialogBox" in CRange.h in "Variant _DialogBox":

avviso C4003: parametri effettivi insufficienti per la macro 'DialogBoxA'

Riferimenti

Per altre informazioni, vedere il seguente sito Web Microsoft Developer Network (MSDN): Sviluppo di Microsoft Office con Visual Studio https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspx

Per altre informazioni sull'uso di matrici per impostare e recuperare dati di Excel con versioni precedenti di Visual Studio, vedere l'articolo della Knowledge Base seguente:

247412 INFO: Metodi per il trasferimento di dati in Excel da Visual Basic