Condividi tramite


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

Visual C# 2010 introduce 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 argomenti a parametri di riferimento nei metodi COM come se fossero parametri di valore.

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

Per completare questa procedura dettagliata, è necessario aver installato nel computer Microsoft Office Excel 2007 e Microsoft Office Word 2007 o versioni successive.

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

Nota

Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per altre informazioni vedere Personalizzazione delle impostazioni di sviluppo in Visual Studio.

Per creare un nuovo progetto di applicazione console

  1. Avviare Visual Studio.

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

  3. Nel riquadro Modelli installati espandere Visual C#, quindi selezionare Windows.

  4. Nella parte superiore della finestra di dialogo Nuovo progetto assicurarsi che .NET Framework 4 (o versione successiva) sia selezionato come framework di destinazione.

  5. Nel riquadro Modelli fare clic su Applicazione console.

  6. Digitare un nome per l'applicazione nella casella di testo Nome.

  7. Fare clic su 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. Viene visualizzata la finestra di dialogo Aggiungi riferimento.

  2. Nella pagina Assembly selezionare Microsoft.Office.Interop.Word nell'elenco Nome componente, quindi tenere premuto il tasto CTRL e selezionare Microsoft.Office.Interop.Excel. Se gli assembly non sono visibili, può essere necessario assicurarsi che siano installati e visualizzati (vedere Procedura: installare assembly di interoperabilità primari di Office)

  3. Fare clic su OK.

Per aggiungere le direttive using necessarie

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul file Program.cs e quindi fare clic su 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 correnti bancari

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

    public class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
    
  2. Aggiungere il seguente codice 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 consente di esportare informazioni sul conto in Excel

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

    Il metodo Add ha un parametro facoltativo per specificare un modello particolare. I parametri facoltativi, una novità di Visual C# 2010, consentono di omettere l'argomento per il parametro se si vuole usare il valore predefinito del parametro. Poiché nessun argomento viene inviato nel codice seguente, Add usa il modello predefinito e crea una nuova cartella di lavoro. L'istruzione equivalente nelle precedenti versioni 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 il codice seguente alla fine di DisplayInExcel. Il codice consente di inserire 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 il codice seguente alla fine di DisplayInExcel. Il ciclo foreach inserisce le informazioni dall'elenco dei 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 il seguente codice alla fine di DisplayInExcel per regolare la larghezza delle colonne in modo da adattarle al contenuto.

    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 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, e versioni successive, converte automaticamente l'oggetto restituito Object in dynamic se si fa riferimento all'assembly con l'opzione del compilatore /link o, allo stesso modo, se la proprietà Incorpora tipi di interoperabilità di Excel viene impostata su true. True è il valore predefinito di questa proprietà.

Per eseguire il progetto

  1. Aggiungere la riga seguente alla fine di Main.

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

    Viene visualizzato un foglio di lavoro di Excel che contiene i dati dei due conti.

Per aggiungere un documento di Word

  1. Per illustrare altri modi in cui Visual C# 2010, e versioni successive, consente di migliorare la programmazione di Office, il codice seguente apre un'applicazione Word e crea un'icona di collegamento al foglio di lavoro di Excel.

    Incollare il metodo CreateIconInWordDoc, fornito più avanti in questo passaggio, nella classe Program. CreateIconInWordDoc usa argomenti denominati e facoltativi per ridurre la complessità delle chiamate di metodo a Add e PasteSpecial. Queste chiamate incorporano altre due nuove funzionalità introdotte in Visual C# 2010 che semplificano le chiamate ai metodi COM con parametri di riferimento. In primo luogo, è possibile inviare argomenti ai parametri di riferimento come se fossero parametri di valore. In altre parole, è possibile inviare i valori direttamente, senza creare una variabile per ogni parametro referenziato. Il compilatore genera variabili temporanee per conservare i valori degli argomenti ed elimina le variabili restituite dalla chiamata. In secondo luogo, è possibile omettere la parola chiave ref nell'elenco di argomenti.

    Il metodo Add ha quattro parametri di riferimento, tutti facoltativi. In Visual C# 2010, o versioni successive, è possibile omettere gli argomenti per alcuni o tutti i parametri se si vogliono usare i valori predefiniti. In Visual C# 2008 e versioni precedenti, è necessario fornire un argomento per ogni parametro e l'argomento deve essere una variabile perché i parametri sono di riferimento.

    Il metodo PasteSpecial inserisce il contenuto degli Appunti. Il metodo ha sette parametri di riferimento, tutti facoltativi. Il codice seguente consente di specificare gli argomenti per due di essi: Link, per creare un collegamento all'origine del contenuto degli Appunti e DisplayAsIcon, per visualizzare il collegamento come icona. In Visual C# 2010, è possibile usare argomenti denominati per questi due parametri e omettere gli altri. Anche se si tratta di parametri di riferimento, non è necessario usare la parola chiave ref o creare variabili per inviarle come argomenti. È possibile inviare direttamente i valori. In Visual C# 2008 e versioni precedenti, è necessario inviare un argomento 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 codice più complesso seguente.

    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 la seguente istruzione dopo Main.

    // Create a Word document that contains an icon that links to 
    // the spreadsheet.
    CreateIconInWordDoc();
    
  3. Aggiungere la seguente istruzione dopo DisplayInExcel. Il metodo Copy aggiunge il foglio di lavoro negli 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 contenente un'icona. Fare doppio clic sull'icona per visualizzare il foglio di lavoro in primo piano.

Per impostare la proprietà Incorpora tipi di interoperabilità

  1. Quando si chiama un tipo COM che non richiede un assembly di interoperabilità primario (PIA) in fase di esecuzione, sono possibili altri miglioramenti. Eliminando la dipendenza dai risultati dei PIA produce l'indipendenza dalla versione e semplifica la distribuzione. Per altre informazioni sui vantaggi della programmazione senza PIA, vedere Procedura dettagliata: incorporamento dei tipi da assembly gestiti (C# e Visual Basic).

    Inoltre, la programmazione è più semplice perché i tipi richiesti e restituiti dai metodi COM possono essere rappresentati usando il tipo dynamic anziché Object. Le variabili di tipo dynamic non saranno valutate fino al runtime, eliminando la necessità del cast esplicito. Per altre informazioni, vedere Utilizzo del tipo dinamico (Guida per programmatori C#).

    In Visual C# 2010, il comportamento predefinito consiste nell'incorporare le informazioni di tipo invece di usare i PIA. A causa di tale impostazione predefinita, molti degli esempi precedenti vengono semplificati perché non è necessario eseguire il cast esplicito. Ad esempio, la dichiarazione di worksheet in DisplayInExcel è scritta come Excel._Worksheet workSheet = excelApp.ActiveSheet piuttosto che Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet. Anche le chiamate a AutoFit nello stesso metodo richiederebbero il cast esplicito senza valore predefinito, perché ExcelApp.Columns[1] restituisce un Object e AutoFit è un metodo Excel. Nel codice seguente viene illustrato il cast.

    ((Excel.Range)workSheet.Columns[1]).AutoFit();
    ((Excel.Range)workSheet.Columns[2]).AutoFit();
    
  2. Per modificare il valore predefinito e usare i PIA anziché incorporare le informazioni sul tipo, espandere il nodo Riferimenti in Esplora soluzioni e quindi selezionare Microsoft.Office.Interop.Excel o Microsoft.Office.Interop.Word.

  3. Se non è possibile visualizzare la finestra Proprietà, premere F4.

  4. Trovare Incorpora tipi di interoperabilità nell'elenco delle proprietà e modificarne il valore in False. Allo stesso modo, è possibile compilare usando l'opzione del compilatore /reference invece di /link in un prompt dei comandi.

Per aggiungere ulteriore formattazione alla tabella

  1. Sostituire le due chiamate a AutoFit in DisplayInExcel con la seguente istruzione.

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

    Il metodo AutoFormat ha 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 fornito un argomento per uno solo dei parametri, Format. Poiché Format è il primo parametro nell'elenco, non è necessario fornire il nome del parametro. Tuttavia, l'istruzione potrebbe essere più facile da comprendere se si include il nome del parametro, 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. 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#)