Condividi tramite


Procedura dettagliata: programmazione di Office (C# e Visual Basic)

In Visual Studio 2010 sono state introdotte nuove funzionalità C# e Visual Basic che migliorano la programmazione di Microsoft Office. In ogni linguaggio sono state aggiunte funzionalità già presenti nell'altro.

Le nuove funzionalità introdotte in C# includono gli argomenti denominati e facoltativi, i valori restituiti di tipo dynamic e, nella programmazione COM, la possibilità di omettere la parola chiave ref e di accedere alle proprietà indicizzate. Le nuove funzionalità introdotte in Visual Basic includono le proprietà implementate automaticamente, le istruzioni nelle espressioni lambda e gli inizializzatori di insieme.

Entrambi i linguaggi consentono di incorporare informazioni sul tipo per la distribuzione di assembly che interagiscono con i componenti COM senza distribuire assembly di interoperabilità primari al computer dell'utente. Per ulteriori informazioni, vedere Procedura dettagliata: incorporamento dei tipi da assembly gestiti (C# e Visual Basic).

In questa procedura dettagliata le nuove funzionalità vengono illustrate nel contesto della programmazione di Office, ma molte sono utili anche nella programmazione generale. Nel corso della procedura dettagliata si utilizzerà innanzitutto un componente aggiuntivo di Excel per creare una cartella di lavoro di Excel. Verrà quindi creato un documento di Word contenente un collegamento alla cartella di lavoro. Infine verrà illustrato come attivare o disattivare la dipendenza di assembly di interoperabilità primari.

Prerequisiti

Per completare questa procedura dettagliata, è necessario che nel computer siano installati Microsoft Office Excel 2010 o 2007 e Microsoft Office Word 2010 o 2007.

Se si utilizza un sistema operativo precedente a Windows Vista, verificare che sia installato .NET Framework 2.0.

Nota

Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio.

Per configurare un componente aggiuntivo di Excel

  1. Avviare Visual Studio.

  2. Scegliere Nuovo dal menu File, quindi Progetto.

  3. Nel riquadro Modelli installati espandere Visual Basic o Visual C#, espandere Office, quindi fare clic su 2010 (o 2007 se si utilizza Office 2007).

  4. Selezionare Componente aggiuntivo per Excel 2010 (o Componente aggiuntivo per Excel 2007) nel riquadro Modelli.

  5. Verificare che nella parte superiore del riquadro Modelli sia visualizzato .NET Framework 4 nella casella Versione .NET Framework di destinazione.

  6. Nella casella Nome è possibile digitare il nome da assegnare al progetto.

  7. Scegliere OK.

  8. Il nuovo progetto verrà visualizzato in Esplora soluzioni.

Per aggiungere riferimenti

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto, quindi scegliere Aggiungi riferimento. Verrà visualizzata la finestra di dialogo Aggiungi riferimento.

  2. Nella scheda .NET selezionare Microsoft.Office.Interop.Excel, versione 14.0.0.0 (o versione 12.0.0.0 per Excel 2007), dall'elenco Nome componente, quindi tenere premuto CTRL e selezionare Microsoft.Office.Interop.Word versione 14.0.0.0 (o versione 12.0.0.0 per Word 2007).

  3. Fare clic su OK.

Per aggiungere le istruzioni Imports o le direttive using necessarie

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul file ThisAddIn.vb o ThisAddIn.cs, quindi scegliere Visualizza codice.

  2. Aggiungere le istruzioni Imports (Visual Basic) o le direttive using (C#) seguenti all'inizio del file di codice, se non sono già presenti.

    Imports Microsoft.Office.Interop
    
    using System.Collections.Generic;
    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    

Per creare un elenco di conti bancari

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto, scegliere Aggiungi, quindi fare clic su Classe. Denominare la classe Account.vb se si utilizza Visual Basic o Account.cs se si utilizza C#. Scegliere Aggiungi.

  2. Sostituire la definizione della classe Account con il codice riportato di seguito. Le definizioni della classe utilizzano le proprietà implementate automaticamente, che rappresentano una nuova funzionalità di Visual Basic in Visual Studio 2010. Per ulteriori informazioni, vedere Proprietà implementate automaticamente (Visual Basic).

    Public Class Account
        Property ID As Integer = -1
        Property Balance As Double
    End Class
    
    class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
    
  3. In ThisAddIn.vb o ThisAddIn.cs aggiungere il codice seguente al metodo ThisAddIn_Startup per creare un elenco bankAccounts contenente due conti. Le dichiarazioni dell'elenco utilizzano gli inizializzatori di insieme, che costituiscono una nuova funzionalità di Visual Basic in Visual Studio 2010. Per ulteriori informazioni, vedere Cenni preliminari sugli inizializzatori di insieme (Visual Basic).

    Dim bankAccounts As New List(Of Account) From {
        New Account With {
                              .ID = 345,
                              .Balance = 541.27
                         },
        New Account With {
                              .ID = 123,
                              .Balance = -127.44
                         }
        }
    
    var bankAccounts = new List<Account> {
        new Account {
            ID = 345,
            Balance = 541.27
        },
        new Account {
            ID = 123,
            Balance = -127.44
        }
    };
    

Per esportare dati in Excel

  1. Nello stesso file aggiungere il metodo seguente alla classe ThisAddIn. Il metodo configura una cartella di lavoro di Excel ed esporta i dati al suo interno.

    Sub DisplayInExcel(ByVal accounts As IEnumerable(Of Account),
                   ByVal DisplayAction As Action(Of Account, Excel.Range))
    
        With Me.Application
            ' Add a new Excel workbook.
            .Workbooks.Add()
            .Visible = True
            .Range("A1").Value = "ID"
            .Range("B1").Value = "Balance"
            .Range("A2").Select()
    
            For Each ac In accounts
                DisplayAction(ac, .ActiveCell)
                .ActiveCell.Offset(1, 0).Select()
            Next
    
            ' Copy the results to the Clipboard.
            .Range("A1:B3").Copy()
        End With
    End Sub
    
    void DisplayInExcel(IEnumerable<Account> accounts,
               Action<Account, Excel.Range> DisplayFunc)
    {
        var excelApp = this.Application;
        // Add a new Excel workbook.
        excelApp.Workbooks.Add();
        excelApp.Visible = true;
        excelApp.Range["A1"].Value = "ID";
        excelApp.Range["B1"].Value = "Balance";
        excelApp.Range["A2"].Select();
    
        foreach (var ac in accounts)
        {
            DisplayFunc(ac, excelApp.ActiveCell);
            excelApp.ActiveCell.Offset[1, 0].Select();
        }
        // Copy the results to the Clipboard.
        excelApp.Range["A1:B3"].Copy();
    }
    

    In questo metodo vengono utilizzate due nuove funzionalità C#. Entrambe queste funzionalità già esistono in Visual Basic.

    • Il metodo Add dispone di un parametro facoltativo per specificare un modello particolare. I parametri facoltativi, nuovi in Visual C# 2010, consentono di omettere l'argomento per tale parametro se si desidera utilizzare il valore predefinito del parametro. Poiché nessun argomento viene inviato nell'esempio precedente, Add utilizza il modello predefinito e crea una nuova cartella di lavoro. L'istruzione equivalente nelle versioni precedenti di C# richiede un argomento segnaposto: excelApp.Workbooks.Add(Type.Missing).

      Per ulteriori informazioni, vedere Argomenti denominati e facoltativi (Guida per programmatori C#).

    • Le proprietà Range e Offset dell'oggetto Range utilizzano la proprietà indicizzate (la pagina potrebbe essere in inglese). Questa funzionalità consente di utilizzare tali proprietà dai tipi COM tramite la sintassi C# tipica seguente. Le proprietà indicizzate consentono inoltre di utilizzare la proprietà Value dell'oggetto Range, eliminando l'esigenza di utilizzare la proprietà Value2. La proprietà Value è indicizzata, ma l'indice è facoltativo. Gli argomenti facoltativi e le proprietà indicizzate vengono utilizzati insieme nell'esempio seguente.

      // Visual C# 2010 provides indexed properties for COM programming.
      excelApp.Range["A1"].Value = "ID";
      excelApp.ActiveCell.Offset[1, 0].Select();
      

      In versioni precedenti del linguaggio, è necessaria la seguente sintassi speciale.

      // In Visual C# 2008, you cannot access the Range, Offset, and Value
      // properties directly.
      excelApp.get_Range("A1").Value2 = "ID";
      excelApp.ActiveCell.get_Offset(1, 0).Select();
      

      Non è possibile creare proprietà indicizzate personalizzate. La funzionalità supporta solo l'utilizzo di proprietà indicizzate esistenti.

      Per ulteriori informazioni, vedere Procedura: utilizzare proprietà indicizzate nella programmazione dell'interoperabilità COM (Guida per programmatori C#).

  2. Aggiungere alla fine di DisplayInExcel il codice riportato di seguito per adattare al contenuto la larghezza delle colonne.

    ' Add the following two lines at the end of the With statement.
    .Columns(1).AutoFit()
    .Columns(2).AutoFit()
    
    excelApp.Columns[1].AutoFit();
    excelApp.Columns[2].AutoFit();
    

    Queste aggiunte dimostrano un'altra nuova funzionalità di C# 2010: l'utilizzo di valori Object restituiti da host COM, ad esempio Office, come se fossero di tipo dynamic. Ciò si verifica automaticamente quando Incorpora tipi di interoperabilità viene impostato sul valore predefinito True o, allo stesso modo, quando all'assembly fa riferimento l'opzione del compilatore /link. Il tipo dynamic consente l'associazione tardiva, già disponibile in Visual Basic, ed evita il cast esplicito richiesto in Visual C# 2008 e versioni precedenti del linguaggio.

    Ad esempio, excelApp.Columns[1] restituisce un tipo Object e AutoFit è un metodo Range di Excel. Senza dynamic, è necessario eseguire il cast dell'oggetto restituito da excelApp.Columns[1] come un'istanza di Range prima di chiamare il metodo AutoFit.

    // Casting is required in Visual C# 2008.
    ((Excel.Range)excelApp.Columns[1]).AutoFit();
    
    // Casting is not required in Visual C# 2010.
    excelApp.Columns[1].AutoFit();
    

    Per ulteriori informazioni sull'incorporazione dei tipi di interoperabilità, vedere le procedure "Per trovare il riferimento ad assembly di interoperabilità primari" e "Per ripristinare la dipendenza di assembly di interoperabilità primari" più avanti in questo argomento. Per ulteriori informazioni su dynamic, vedere dynamic (Riferimenti per C#) o Utilizzo del tipo dinamico (Guida per programmatori C#).

Per richiamare DisplayInExcel

  1. Aggiungere alla fine del metodo ThisAddIn_StartUp il codice riportato di seguito. La chiamata a DisplayInExcel contiene due argomenti. Il primo argomento è il nome dell'elenco di conti da elaborare. Il secondo argomento è un'espressione lambda su più righe che definisce la modalità di elaborazione dei dati. I valori ID e balance relativi a ogni conto vengono visualizzati in celle adiacenti e la riga viene visualizzata in rosso nel caso in cui il saldo sia inferiore a zero. Le espressioni lambda su più righe sono una nuova funzionalità in Visual Basic 2010. Per ulteriori informazioni, vedere Lambda Expressions.

    DisplayInExcel(bankAccounts,
           Sub(account, cell)
               ' This multiline lambda expression sets custom
               ' processing rules for the bankAccounts.
               cell.Value = account.ID
               cell.Offset(0, 1).Value = account.Balance
    
               If account.Balance < 0 Then
                   cell.Interior.Color = RGB(255, 0, 0)
                   cell.Offset(0, 1).Interior.Color = RGB(255, 0, 0)
               End If
           End Sub)
    
    DisplayInExcel(bankAccounts, (account, cell) =>
    // This multiline lambda expression sets custom processing rules  
    // for the bankAccounts.
    {
        cell.Value = account.ID;
        cell.Offset[0, 1].Value = account.Balance;
        if (account.Balance < 0)
        {
            cell.Interior.Color = 255;
            cell.Offset[0, 1].Interior.Color = 255;
        }
    });
    
  2. Per eseguire il programma, premere F5. Viene visualizzato un foglio di lavoro di Excel contenente i dati dei conti.

Per aggiungere un documento di Word

  • Aggiungere il codice seguente alla fine del metodo ThisAddIn_StartUp per creare un documento di Word contenente un collegamento alla cartella di lavoro di Excel.

    Dim wordApp As New Word.Application
    wordApp.Visible = True
    wordApp.Documents.Add()
    wordApp.Selection.PasteSpecial(Link:=True, DisplayAsIcon:=True)
    
    var wordApp = new Word.Application();
    wordApp.Visible = true;
    wordApp.Documents.Add();
    wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
    

    Nel codice seguente vengono illustrate diverse nuove funzionalità introdotte in C#: la possibilità di omettere la parola chiave ref nella programmazione COM, gli argomenti denominati e quelli facoltativi. Tali funzionalità già esistono in Visual Basic. Il metodo PasteSpecial dispone di sette parametri di valore, tutti definiti come parametri di riferimento facoltativi. Nelle versioni precedenti a Visual C# 2010, era necessario definire variabili oggetto per utilizzare come argomenti i sette parametri, anche in assenza di valori significativi da inviare. Gli argomenti denominati e facoltativi consentono di definire i parametri cui si desidera accedere per nome e di inviare argomenti solo a essi. Nell'esempio riportato di seguito gli argomenti sono inviati per indicare che deve essere creato un collegamento alla cartella di lavoro negli Appunti (parametro Link) e che il collegamento deve essere visualizzato nel documento di Word come un'icona (parametro DisplayAsIcon). Visual C# 2010 consente inoltre di omettere la parola chiave ref per questi argomenti. Si confronti il segmento di codice seguente di Visual C# 2008 con la riga singola richiesta in Visual C# 2010:

    // Call to PasteSpecial in Visual C# 2008.
    object iconIndex = Type.Missing;
    object link = true;
    object placement = Type.Missing;
    object displayAsIcon = true;
    object dataType = Type.Missing;
    object iconFileName = Type.Missing;
    object iconLabel = Type.Missing;
    wordApp.Selection.PasteSpecial(ref iconIndex,
                                   ref link,
                                   ref placement,
                                   ref displayAsIcon,
                                   ref dataType,
                                   ref iconFileName,
                                   ref iconLabel);
    
    // Call to PasteSpecial in Visual C# 2010.
    wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
    

Per eseguire l'applicazione

  • ‎Premere F5 per eseguire l'applicazione. Viene avviato Excel e viene visualizzata una tabella contenente le informazioni dei due conti in bankAccounts. Quindi viene visualizzato un documento di Word contenente un collegamento alla tabella di Excel.

Per pulire il progetto completato

  • In Visual Studio scegliere Pulisci soluzione dal menu Compila. In caso contrario, il componente aggiuntivo verrà eseguito ogni volta che si apre Excel nel computer.

Per trovare il riferimento ad assembly di interoperabilità primari

  1. Eseguire nuovamente l'applicazione, ma senza cliccare su Pulisci soluzione.

  2. Nel menu Start fare clic su Tutti i programmi. Quindi fare clic su Microsoft Visual Studio 2010, Strumenti di Visual Studio, Prompt dei comandi di Microsoft Visual Studio (2010).

  3. Digitare ildasm nella finestra del prompt dei comandi di Visual Studio 2010, quindi premere INVIO. Viene visualizzata la finestra IL DASM.

  4. Scegliere Apri dal menu File nella finestra IL DASM. Fare doppio clic su Visual Studio 2010,, quindi fare doppio clic su Progetti. Aprire la cartella per il progetto e cercare nome del progetto.dll nella cartella bin/Debug. Fare doppio clic su nome del progetto.dll. Viene visualizzata una nuova finestra contenente gli attributi del progetto, oltre a riferimenti ad altri moduli e assembly. Si noti che gli spazi dei nomi Microsoft.Office.Interop.Excel e Microsoft.Office.Interop.Word sono inclusi nell'assembly. Per impostazione predefinita di Visual Studio 2010, il compilatore importa i tipi necessari da un assembly di interoperabilità primario a cui viene fatto riferimento nell'assembly.

    Per ulteriori informazioni, vedere Procedura: visualizzare il contenuto dell'assembly.

  5. Fare doppio clic sull'icona del manifesto. Viene visualizzata una finestra con un elenco di assembly che contengono gli elementi a cui il progetto fa riferimento. Microsoft.Office.Interop.Excel e Microsoft.Office.Interop.Word non sono inclusi nell'elenco. Poiché i tipi necessari per il progetto sono stati importati nell'assembly, i riferimenti a un assembly di interoperabilità primario non sono necessari. La distribuzione risulta pertanto più facile. Gli assembly di interoperabilità primari non devono essere presenti nel computer dell'utente e, poiché un'applicazione non richiede la distribuzione di una versione specifica di un assembly di interoperabilità primario, è possibile progettare applicazioni per utilizzare più versioni di Office, purché tutte le versioni dispongano delle API necessarie.

    Poiché la distribuzione di assembly di interoperabilità primari non è più necessaria, è possibile creare un'applicazione che negli scenari avanzati utilizzi più versioni di Office, incluse le versioni precedenti. Ciò è tuttavia possibile solo se il codice non utilizza API non disponibili nella versione di Office in uso. Poiché non è sempre chiaro se una particolare API era disponibile in una versione precedente, l'utilizzo di versioni precedenti di Office non è consigliato.

    Nota

    Gli assembly di interoperabilità primari non sono stati pubblicati nelle versioni precedenti a Office 2003. Pertanto, l'unico modo per generare un assembly di interoperabilità per Office 2002 o versioni precedenti consiste nell'importare il riferimento COM.

  6. Chiudere la finestra del manifesto e quella dell'assembly.

Per ripristinare la dipendenza di assembly di interoperabilità primari

  1. In Esplora soluzioni fare clic sul pulsante Mostra tutti i file. Espandere la cartella Riferimenti e selezionare Microsoft.Office.Interop.Excel. Premere F4 per visualizzare la finestra Proprietà.

  2. Nella finestra Proprietà modificare il valore della proprietà Incorpora tipi di interoperabilità da True a False.

  3. Ripetere i passaggi 1 e 2 di questa procedura per Microsoft.Office.Interop.Word.

  4. In C# impostare come commento le due chiamate a Autofit alla fine del metodo DisplayInExcel.

  5. Premere F5 per verificare che il progetto continui a essere eseguito correttamente.

  6. Ripetere i primi tre passaggi della procedura precedente per aprire la finestra dell'assembly. Si noti che Microsoft.Office.Interop.Word e Microsoft.Office.Interop.Excel non sono più nell'elenco degli assembly incorporati.

  7. Fare doppio clic sull'icona del manifesto e scorrere l'elenco di assembly a cui si fa riferimento. Microsoft.Office.Interop.Word e Microsoft.Office.Interop.Excel sono entrambi nell'elenco. Poiché l'applicazione fa riferimento ad assembly di interoperabilità primari di Excel e Word e la proprietà Incorpora tipi di interoperabilità è impostata su False, entrambi gli assembly devono essere presenti nel computer dell'utente finale.

  8. In Visual Studio, fare clic su Pulisci soluzione nel menu Compila per pulire il progetto completato.

Vedere anche

Attività

Procedura dettagliata: incorporamento delle informazioni sui tipi da assembly di Microsoft Office (C# e Visual Basic)

Procedura dettagliata: incorporamento dei tipi da assembly gestiti (C# e Visual Basic)

Procedura dettagliata: creazione di un componente aggiuntivo a livello di applicazione per Excel

Riferimenti

Proprietà implementate automaticamente (Guida per programmatori C#)

Inizializzatori di oggetto e di insieme (Guida per programmatori C#)

dynamic (Riferimenti per C#)

Espressioni lambda (Guida per programmatori C#)

Interoperabilità (Guida per programmatori C#)

Concetti

Proprietà implementate automaticamente (Visual Basic)

Cenni preliminari sugli inizializzatori di insieme (Visual Basic)

Optional Parameters

Passaggio di argomenti in base alla posizione e al nome

Argomenti denominati e facoltativi (Guida per programmatori C#)

Early and Late Binding

Lambda Expressions

Altre risorse

Utilizzo del tipo dinamico (Guida per programmatori C#)

Procedura: utilizzare proprietà indicizzate nella programmazione dell'interoperabilità COM (Guida per programmatori C#)

COM Interop