Procedura: accedere agli oggetti di interoperabilità di Office utilizzando le funzionalità di Visual C# 2010 (Guida per programmatori C#)

In Visual C# 2010 sono state introdotte nuove funzionalità che semplificano l'accesso agli oggetti API di Office. Le nuove funzionalità includono argomenti denominati e facoltativi, un nuovo tipo chiamato dynamic e la possibilità di passare gli argomenti per fare riferimento ai parametri nei metodi COM come se fossero parametri di valore.

In questo argomento si utilizzeranno le nuove funzionalità per scrivere il codice che consente di creare e visualizzare un foglio di lavoro di Microsoft Office Excel. Si scriverà quindi il codice per aggiungere un documento di Office Word contenente un'icona collegata al foglio di lavoro di Excel.

Per completare questa procedura dettagliata, è necessario che nel computer siano installati Microsoft Office Excel 2007 e Microsoft Office Word 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 creare una nuova applicazione console

  1. Avviare Visual Studio.

  2. Nel menu File scegliere Nuovo, quindi fare clic su Progetto. Verrà visualizzata la finestra di dialogo Nuovo progetto.

  3. Nel riquadro Modelli installati espandere Visual C#, quindi fare clic su Windows.

  4. Verificare che nella parte superiore della finestra di dialogo Nuovo progetto sia selezionato .NET Framework 4 come framework di destinazione.

  5. Nel riquadro Modelli fare clic su Applicazione console.

  6. Digitare un nome per il progetto nel campo Nome.

  7. Scegliere OK.

    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 pagina .NET selezionare Microsoft.Office.Interop.Word nell'elenco Nome componente, quindi tenere premuto CTRL e selezionare Microsoft.Office.Interop.Excel.

  3. Scegliere OK.

Per aggiungere le direttive using necessarie

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

  2. Aggiungere le seguenti direttive using all'inizio del file di codice.

    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    

Per creare un elenco di conti bancari

  1. Incollare la definizione di classe seguente in Program.cs, nella classe Program.

    public class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
    
  2. Aggiungere il codice seguente al metodo Main per creare un elenco bankAccounts contenente due conti.

    // Create a list of accounts.
    var bankAccounts = new List<Account> {
        new Account { 
                      ID = 345678,
                      Balance = 541.27
                    },
        new Account {
                      ID = 1230221,
                      Balance = -127.44
                    }
    };
    

Per dichiarare un metodo che esporta le informazioni sui conti in Excel

  1. Aggiungere il metodo seguente alla classe Program per configurare un foglio di lavoro di Excel.

    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 nel codice seguente, 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).

    static void DisplayInExcel(IEnumerable<Account> accounts)
    {
        var excelApp = new Excel.Application();
        // Make the object visible.
        excelApp.Visible = true;
    
        // Create a new, empty workbook and add it to the collection returned 
        // by property Workbooks. The new workbook becomes the active workbook.
        // Add has an optional parameter for specifying a praticular template. 
        // Because no argument is sent in this example, Add creates a new workbook. 
        excelApp.Workbooks.Add();
    
        // This example uses a single workSheet. The explicit type casting is
        // removed in a later procedure.
        Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
    }
    
  2. Aggiungere alla fine di DisplayInExcel il codice riportato di seguito. Il codice inserisce i valori nelle prime due colonne della prima riga del foglio di lavoro.

    // Establish column headings in cells A1 and B1.
    workSheet.Cells[1, "A"] = "ID Number";
    workSheet.Cells[1, "B"] = "Current Balance";
    
  3. Aggiungere alla fine di DisplayInExcel il codice riportato di seguito. Il ciclo foreach inserisce le informazioni dall'elenco di conti nelle prime due colonne delle righe successive del foglio di lavoro.

    
    var row = 1;
    foreach (var acct in accounts)
    {
        row++;
        workSheet.Cells[row, "A"] = acct.ID;
        workSheet.Cells[row, "B"] = acct.Balance;
    }
    
  4. Aggiungere alla fine di DisplayInExcel il codice riportato di seguito per adattare al contenuto la larghezza delle colonne.

    workSheet.Columns[1].AutoFit();
    workSheet.Columns[2].AutoFit();
    

    Le versioni precedenti di C# richiedono il cast esplicito per queste operazioni perché ExcelApp.Columns[1] restituisce un oggetto Object e AutoFit è un metodo Range di Excel. Le righe seguenti indicano il cast.

    ((Excel.Range)workSheet.Columns[1]).AutoFit();
    ((Excel.Range)workSheet.Columns[2]).AutoFit();
    

    Visual C# 2010 converte automaticamente l'oggetto Object restituito in dynamic se all'assembly fa riferimento l'opzione del compilatore /link o, allo stesso modo, se la proprietà Incorpora tipi di interoperabilità di Excel è impostata su true. True è il valore predefinito per questa proprietà.

Per eseguire il progetto

  1. Aggiungere alla fine di Main la riga riportata di seguito.

    // Display the list in an Excel spreadsheet.
    DisplayInExcel(bankAccounts);
    
  2. Premere CTRL+F5.

    Verrà visualizzato un foglio di lavoro di Excel contenente i dati dei due conti.

Per aggiungere un documento di Word

  1. Al fine di illustrare in quali altri modi è possibile utilizzare Visual C# 2010 per migliorare la programmazione di Office, il codice seguente apre un'applicazione Word e crea un'icona per il collegamento al foglio di lavoro di Excel.

    Incollare il metodo CreateIconInWordDoc, disponibile più avanti in questo passaggio, nella classe Program. CreateIconInWordDoc utilizza argomenti denominati e facoltativi per ridurre la complessità delle chiamate ai metodi Add e PasteSpecial. Queste chiamate incorporano altre due nuove funzionalità di Visual C# 2010 che semplificano le chiamate a metodi COM che dispongono di parametri referenziati. È innanzitutto possibile inviare argomenti ai parametri referenziati come se fossero parametri di valore. Ovvero, è possibile inviare direttamente i valori, senza creare una variabile per ogni parametro di riferimento. Il compilatore genera variabili temporanee per contenere i valori degli argomenti ed elimina le variabili alla fine della chiamata. In secondo luogo, è possibile omettere la parola chiave ref nell'elenco di argomenti.

    Il metodo Add dispone di quattro parametri referenziati, tutti facoltativi. In Visual C# 2010 è possibile omettere gli argomenti per uno o per tutti i parametri se si desidera utilizzare i valori predefiniti. In Visual C# 2008 e versioni precedenti è necessario specificare un argomento per ogni parametro e l'argomento deve essere una variabile perché i parametri sono parametri referenziati.

    Il metodo PasteSpecial inserisce il contenuto negli Appunti. Il metodo dispone di sette parametri referenziati, tutti facoltativi. Nel codice seguente vengono specificati gli argomenti per due parametri: Link, per creare un collegamento all'origine del contenuto degli Appunti, e DisplayAsIcon, per visualizzare il collegamento come icona. In Visual C# 2010 è possibile utilizzare argomenti denominati per i due parametri e omettere gli altri. Anche se si tratta di parametri referenziati, non è necessario utilizzare la parola chiave ref o creare variabili per inviarli come argomenti. È possibile inviare direttamente i valori. In Visual C# 2008 e versioni precedenti è necessario inviare un argomento di variabile per ogni parametro referenziato.

    static void CreateIconInWordDoc()
    {
        var wordApp = new Word.Application();
        wordApp.Visible = true;
    
        // The Add method has four reference parameters, all of which are 
        // optional. Visual C# 2010 allows you to omit arguments for them if
        // the default values are what you want.
        wordApp.Documents.Add();
    
        // PasteSpecial has seven reference parameters, all of which are 
        // optional. This example uses named arguments to specify values 
        // for two of the parameters. Although these are reference 
        // parameters, you do not need to use the ref keyword, or to create 
        // variables to send in as arguments. You can send the values directly.
        wordApp.Selection.PasteSpecial( Link: true, DisplayAsIcon: true);
    }
    

    In Visual C# 2008 o versioni precedenti del linguaggio è necessario il seguente codice più complesso.

    static void CreateIconInWordDoc2008()
    {
        var wordApp = new Word.Application();
        wordApp.Visible = true;
    
        // The Add method has four parameters, all of which are optional. 
        // In Visual C# 2008 and earlier versions, an argument has to be sent 
        // for every parameter. Because the parameters are reference  
        // parameters of type object, you have to create an object variable
        // for the arguments that represents 'no value'. 
    
        object useDefaultValue = Type.Missing;
    
        wordApp.Documents.Add(ref useDefaultValue, ref useDefaultValue,
            ref useDefaultValue, ref useDefaultValue);
    
        // PasteSpecial has seven reference parameters, all of which are
        // optional. In this example, only two of the parameters require
        // specified values, but in Visual C# 2008 an argument must be sent
        // for each parameter. Because the parameters are reference parameters,
        // you have to contruct variables for the arguments.
        object link = true;
        object displayAsIcon = true;
    
        wordApp.Selection.PasteSpecial( ref useDefaultValue,
                                        ref link,
                                        ref useDefaultValue,
                                        ref displayAsIcon,
                                        ref useDefaultValue,
                                        ref useDefaultValue,
                                        ref useDefaultValue);
    }
    
  2. Aggiungere alla fine di Main l'istruzione riportata di seguito.

    // Create a Word document that contains an icon that links to
    // the spreadsheet.
    CreateIconInWordDoc();
    
  3. Aggiungere alla fine di DisplayInExcel l'istruzione riportata di seguito. Il metodo Copy aggiunge il foglio di lavoro agli Appunti.

    // Put the spreadsheet contents on the clipboard. The Copy method has one
    // optional parameter for specifying a destination. Because no argument  
    // is sent, the destination is the Clipboard.
    workSheet.Range["A1:B3"].Copy();
    
  4. Premere CTRL+F5.

    Verrà visualizzato un documento di Word che contiene un'icona. Fare doppio clic sull'icona per portare il foglio di lavoro in primo piano.

Per impostare la proprietà Incorpora tipi di interoperabilità

  1. È possibile apportare ulteriori miglioramenti quando si chiama un tipo COM che non richiede un assembly di interoperabilità primario in fase di esecuzione. La rimozione della dipendenza dagli assembly di interoperabilità primari comporta l'indipendenza dalla versione e una distribuzione più semplice. Per ulteriori informazioni sui vantaggi della programmazione senza assembly di interoperabilità primari, vedere Procedura dettagliata: incorporamento dei tipi da assembly gestiti (C# e Visual Basic).

    La programmazione è inoltre più semplice perché i tipi richiesti e restituiti dai metodi COM possono essere rappresentati utilizzando il tipo dynamic anziché Object. Le variabili che dispongono del tipo dynamic non vengono valutate se non in fase di esecuzione, eliminando così la necessità del cast esplicito. Per ulteriori informazioni, vedere Utilizzo del tipo dinamico (Guida per programmatori C#).

    In Visual C# 2010 il comportamento predefinito prevede l'incorporamento delle informazioni sul tipo anziché l'utilizzo degli assembly di interoperabilità primari. Grazie a tale impostazione predefinita, diversi esempi precedenti vengono semplificati perché non è necessario il cast esplicito. La dichiarazione di worksheet in DisplayInExcel, ad esempio, viene scritta come Excel._Worksheet workSheet = excelApp.ActiveSheet anziché Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet. Le chiamate a AutoFit nello stesso metodo richiederanno anche il cast esplicito senza l'impostazione predefinita, poiché ExcelApp.Columns[1] restituisce un elemento Object e AutoFit è un metodo di Excel. Nel codice seguente è illustrato il cast.

    ((Excel.Range)workSheet.Columns[1]).AutoFit();
    ((Excel.Range)workSheet.Columns[2]).AutoFit();
    
  2. Per modificare l'impostazione predefinita e utilizzare gli assembly di interoperabilità primari anziché incorporare le informazioni sul tipo, espandere il nodo Riferimenti in Esplora soluzioni, quindi selezionare Microsoft.Office.Interop.Excel o Microsoft.Office.Interop.Word.

  3. Se la finestra Proprietà non viene visualizzata, premere F4.

  4. Trovare Incorpora tipi di interoperabilità nell'elenco di proprietà e impostare il valore su False. Allo stesso modo, è possibile eseguire la compilazione utilizzando l'opzione del compilatore /reference anziché /link al prompt dei comandi.

Per aggiungere formattazione ulteriore alla tabella

  1. Sostituire le due chiamate ad AutoFit in DisplayInExcel con l'istruzione seguente.

    // Call to AutoFormat in Visual C# 2010.
    workSheet.Range["A1", "B3"].AutoFormat(
        Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
    

    Il metodo AutoFormat dispone di sette parametri di valore, tutti facoltativi. Gli argomenti denominati e facoltativi consentono di specificare gli argomenti per nessuno, alcuni o tutti i parametri. Nell'istruzione precedente, viene specificato un argomento per uno solo dei parametri, Format. Poiché Format è il primo parametro nell'elenco di parametri, non è necessario specificare il nome del parametro. L'istruzione può essere tuttavia più comprensibile se il nome del parametro è incluso, come illustrato nel codice seguente.

    // Call to AutoFormat in Visual C# 2010.
    workSheet.Range["A1", "B3"].AutoFormat(Format:
        Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
    
  2. Premere CTRL+F5 per visualizzare il risultato. Gli altri formati sono elencati nell'enumerazione XlRangeAutoFormat.

  3. Confrontare l'istruzione nel passaggio 1 con il codice seguente, che illustra gli argomenti necessari in Visual C# 2008 o versioni precedenti.

    // The AutoFormat method has seven optional value parameters. The
    // following call specifies a value for the first parameter, and uses 
    // the default values for the other six. 
    
    // Call to AutoFormat in Visual C# 2008. This code is not part of the
    // current solution.
    excelApp.get_Range("A1", "B4").AutoFormat(Excel.XlRangeAutoFormat.xlRangeAutoFormatTable3, 
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
        Type.Missing);
    

Esempio

Nel codice seguente viene illustrato l'esempio completo.

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


namespace OfficeProgramminWalkthruComplete
{
    class Walkthrough
    {
        static void Main(string[] args)
        {
            // Create a list of accounts.
            var bankAccounts = new List<Account> 
            {
                new Account { 
                              ID = 345678,
                              Balance = 541.27
                            },
                new Account {
                              ID = 1230221,
                              Balance = -127.44
                            }
            };

            // Display the list in an Excel spreadsheet.
            DisplayInExcel(bankAccounts);

            // Create a Word document that contains an icon that links to
            // the spreadsheet.
            CreateIconInWordDoc();
        }

        static void DisplayInExcel(IEnumerable<Account> accounts)
        {
            var excelApp = new Excel.Application();
            // Make the object visible.
            excelApp.Visible = true;

            // Create a new, empty workbook and add it to the collection returned 
            // by property Workbooks. The new workbook becomes the active workbook.
            // Add has an optional parameter for specifying a praticular template. 
            // Because no argument is sent in this example, Add creates a new workbook. 
            excelApp.Workbooks.Add();

            // This example uses a single workSheet. 
            Excel._Worksheet workSheet = excelApp.ActiveSheet;

            // Earlier versions of C# require explicit casting.
            //Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;

            // Establish column headings in cells A1 and B1.
            workSheet.Cells[1, "A"] = "ID Number";
            workSheet.Cells[1, "B"] = "Current Balance";

            var row = 1;
            foreach (var acct in accounts)
            {
                row++;
                workSheet.Cells[row, "A"] = acct.ID;
                workSheet.Cells[row, "B"] = acct.Balance;
            }

            workSheet.Columns[1].AutoFit();
            workSheet.Columns[2].AutoFit();

            // Call to AutoFormat in Visual C# 2010. This statement replaces the 
            // two calls to AutoFit.
            workSheet.Range["A1", "B3"].AutoFormat(
                Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);

            // Put the spreadsheet contents on the clipboard. The Copy method has one
            // optional parameter for specifying a destination. Because no argument  
            // is sent, the destination is the Clipboard.
            workSheet.Range["A1:B3"].Copy();
        }

        static void CreateIconInWordDoc()
        {
            var wordApp = new Word.Application();
            wordApp.Visible = true;

            // The Add method has four reference parameters, all of which are 
            // optional. Visual C# 2010 allows you to omit arguments for them if
            // the default values are what you want.
            wordApp.Documents.Add();

            // PasteSpecial has seven reference parameters, all of which are 
            // optional. This example uses named arguments to specify values 
            // for two of the parameters. Although these are reference 
            // parameters, you do not need to use the ref keyword, or to create 
            // variables to send in as arguments. You can send the values directly.
            wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
        }
    }

    public class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
}

Vedere anche

Attività

Procedura: utilizzare argomenti denominati e facoltativi nella programmazione di Office (Guida per programmatori C#)

Riferimenti

dynamic (Riferimenti per C#)

Type.Missing

Concetti

Argomenti denominati e facoltativi (Guida per programmatori C#)

Altre risorse

Utilizzo del tipo dinamico (Guida per programmatori C#)