Come accedere agli oggetti di interoperabilità di Office

C# offre 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 articolo vengono usate le nuove funzionalità per scrivere codice che crea e visualizza un foglio di lavoro di Microsoft Office Excel. Si scrive il codice per aggiungere un documento di Office Word che contiene un'icona 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.

Nota

I nomi o i 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 dell'IDE.

Importante

VSTO (Visual Studio Tools per Office) si basa su .NET Framework. Anche i componenti aggiuntivi COM possono essere scritti con .NET Framework. Non è possibile creare componenti aggiuntivi per Office con .NET Core e .NET 5+, le versioni più recenti di .NET. Ciò è dovuto al fatto che .NET Core/.NET 5+ non può funzionare insieme a .NET Framework nello stesso processo e può causare errori di caricamento dei componenti aggiuntivi. È possibile continuare a usare .NET Framework per scrivere VSTO e i componenti aggiuntivi COM per Office. Microsoft non aggiornerà VSTO o la piattaforma dei componenti aggiuntivi COM per l'uso di .NET Core o .NET 5+. È possibile utilizzare .NET Core e .NET 5+, incluso ASP.NET Core, per creare il lato server dei componenti aggiuntivi Web di Office.

Per creare un nuovo progetto di applicazione console

  1. Avviare Visual Studio.
  2. Scegliere Nuovo dal menu Filee quindi selezionare Progetto. Verrà visualizzata la finestra di dialogo Nuovo progetto .
  3. Nel riquadro Modelli installati espandere C# , quindi selezionare Windows.
  4. Guardare la parte superiore della finestra di dialogo Nuovo progetto per assicurarsi di selezionare .NET Framework 4 (o versione successiva) come framework di destinazione.
  5. Nel riquadro modelli selezionare Applicazione console.
  6. Digitare un nome per il progetto nel campo Nome.
  7. Seleziona OK.

Il nuovo progetto verrà visualizzato in Esplora soluzioni.

Per aggiungere riferimenti

  1. In Esplora soluzionifare 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 Assembly selezionare Microsoft.Office.Interop.Word nell'elenco Nome componente e, tenendo premuto CTRL, selezionare Microsoft.Office.Interop.Excel. Se gli assembly non vengono visualizzati, potrebbe essere necessario installarli. Vedere Procedura: Installare assembly di interoperabilità primari di Office.
  3. Seleziona OK.

Per aggiungere le direttive using necessarie

In Esplora soluzionifare clic con il pulsante destro del mouse sul file Program.cs, quindi selezionare Visualizza codice. Aggiungere le direttive using seguenti 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

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; }
}

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 usa un parametro facoltativo per specificare un modello particolare. I parametri facoltativi consentono di omettere l'argomento per tale parametro se si vuole usare il valore predefinito del parametro. Poiché non è stato specificato un argomento, 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 particular 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;
}

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";

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;
}

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();

Nelle versioni precedenti di C# è necessario eseguire il cast in modo esplicito per queste operazioni perché ExcelApp.Columns[1] restituisce 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();

C# converte automaticamente Object restituito in dynamic se l'assembly viene referenziato dall'opzione del compilatore EmbedInteropTypes o, in modo equivalente, se la proprietà Incorpora tipi di interoperabilità di Excel è impostata su true. True è il valore predefinito di questa proprietà.

Per eseguire il progetto

Aggiungere la riga seguente alla fine di Main.

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

Premere CTRL+F5. Viene visualizzato un foglio di lavoro di Excel che contiene i dati dei due conti.

Per aggiungere un documento di Word

Il codice seguente apre un'applicazione Word e crea un'icona che collega 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 ai metodi di Add e PasteSpecial. Queste chiamate incorporano altre due funzionalità 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. È possibile omettere gli argomenti per alcuni o tutti i parametri se si vogliono usare i valori predefiniti.

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. È possibile usare argomenti denominati per questi due argomenti e omettere gli altri. Anche se questi argomenti sono parametri di riferimento, non è necessario usare la parola chiave ref o creare variabili per inviarle come argomenti. È possibile inviare direttamente i valori.

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# 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);
}

Aggiungere la seguente istruzione dopo Main.

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

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();

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à

Sono possibili altri miglioramenti quando si chiama un tipo COM che non richiede un assembly di interoperabilità primario (PIA) in fase di esecuzione. 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 di tipi da assembly gestiti.

Inoltre, la programmazione è più semplice perché il tipo dynamic rappresenta i tipi richiesti e restituiti dichiarati nei metodi COM. Le variabili di tipo dynamic non vengono valutate fino al runtime, eliminando così la necessità di eseguire il cast esplicito. Per altre informazioni, vedere Uso del tipo dynamic.

L'incorporamento delle informazioni sul tipo anziché usare le PIA è un comportamento predefinito. A causa di tale impostazione predefinita, alcuni degli esempi precedenti sono semplificati. 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();

Per modificare l'impostazione predefinita e usare le informazioni sul tipo anziché incorporare le informazioni sul tipo, espandere il nodo Riferimenti in Esplora soluzioni, quindi selezionare Microsoft.Office.Interop.Excel o Microsoft.Office.Interop.Word. Se non è possibile visualizzare la finestra Proprietà, premere F4. Trovare Incorpora tipi di interoperabilità nell'elenco delle proprietà e modificarne il valore in False. In modo equivalente, si può compilare usando l'opzione del compilatore Riferimenti anziché EmbedInteropTypes al prompt dei comandi.

Per aggiungere ulteriore formattazione alla tabella

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 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 parametri, non è necessario specificare il nome del parametro. Tuttavia, l'istruzione potrebbe essere più semplice 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);

Premere CTRL + F5 per visualizzare il risultato. È possibile trovare altri formati nell'elenco nell'enumerazione XlRangeAutoFormat.

Esempio

Nel codice seguente viene illustrato l'esempio completo.

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

namespace OfficeProgrammingWalkthruComplete
{
    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 particular 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#. 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# 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; }
    }
}

Vedi anche