Jak uzyskać dostęp do obiektów międzyoperacyjności pakietu Office

Język C# zawiera funkcje, które upraszczają dostęp do obiektów interfejsu API pakietu Office. Nowe funkcje obejmują argumenty nazwane i opcjonalne, nowy typ o nazwie dynamici możliwość przekazywania argumentów do parametrów referencyjnych w metodach COM tak, jakby były parametrami wartości.

W tym artykule użyto nowych funkcji do pisania kodu, który tworzy i wyświetla arkusz programu Microsoft Office Excel. Napiszesz kod, aby dodać dokument programu Office Word zawierający ikonę połączoną z arkuszem programu Excel.

Aby ukończyć ten przewodnik, na komputerze muszą być zainstalowane programy Microsoft Office Excel 2007 i Microsoft Office Word 2007 lub nowsze.

Uwaga

Na komputerze w poniższych instrukcjach mogą być wyświetlane inne nazwy i lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio. Te elementy są określane przez numer wersji Visual Studio oraz twoje ustawienia. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE.

Ważne

Program VSTO (Visual Studio Tools dla pakietu Office) opiera się na programie .NET Framework. Dodatki COM można również napisać za pomocą programu .NET Framework. Nie można utworzyć dodatków pakietu Office z platformami .NET Core i .NET 5+, najnowszymi wersjami platformy .NET. Dzieje się tak, ponieważ program .NET Core/.NET 5+ nie może współpracować z programem .NET Framework w tym samym procesie i może prowadzić do błędów ładowania dodatków. Możesz nadal używać programu .NET Framework do pisania dodatków VSTO i COM dla pakietu Office. Firma Microsoft nie zaktualizuje programu VSTO ani platformy dodatku COM w celu korzystania z platformy .NET Core lub .NET 5+. Możesz korzystać z platform .NET Core i .NET 5+, w tym ASP.NET Core, aby utworzyć stronę serwera dodatków pakietu Office Web.

Aby utworzyć nową aplikację konsolową

  1. Uruchom program Visual Studio.
  2. W menu Plik wskaż pozycję Nowy, a następnie wybierz pozycję Projekt. Zostanie wyświetlone okno dialogowe Nowy projekt.
  3. W okienku Zainstalowane szablony rozwiń węzeł C#, a następnie wybierz pozycję Windows.
  4. Przyjrzyj się górnej części okna dialogowego Nowy projekt , aby wybrać platformę .NET Framework 4 (lub nowszą) jako platformę docelową.
  5. W okienku Szablony wybierz pozycję Aplikacja konsolowa.
  6. Wpisz nazwę projektu w polu Nazwa .
  7. Wybierz przycisk OK.

Nowy projekt zostanie wyświetlony w Eksplorator rozwiązań.

Aby dodać odwołania

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy nazwę projektu, a następnie wybierz pozycję Dodaj odwołanie. Zostanie wyświetlone okno dialogowe Dodawanie odwołania .
  2. Na stronie Zestawy wybierz pozycję Microsoft.Office.Interop.Word na liście Nazwa składnika, a następnie przytrzymaj naciśnięty klawisz CTRL i wybierz pozycję Microsoft.Office.Interop.Excel. Jeśli zestawy nie są widoczne, może być konieczne ich zainstalowanie. Zobacz Instrukcje: instalowanie podstawowych zestawów międzyoperacyjnych pakietu Office.
  3. Wybierz przycisk OK.

Aby dodać niezbędne dyrektywy using

W Eksplorator rozwiązań kliknij prawym przyciskiem myszy plik Program.cs, a następnie wybierz polecenie Wyświetl kod. Dodaj następujące using dyrektywy na początku pliku kodu:

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

Aby utworzyć listę kont bankowych

Wklej następującą definicję klasy do Program.cs w Program klasie .

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

Dodaj następujący kod do metody , Main aby utworzyć listę zawierającą bankAccounts dwa konta.

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

Aby zadeklarować metodę, która eksportuje informacje o koncie do programu Excel

  1. Dodaj następującą metodę do klasy, Program aby skonfigurować arkusz programu Excel. Metoda Add ma opcjonalny parametr służący do określania określonego szablonu. Parametry opcjonalne umożliwiają pominięcie argumentu dla tego parametru, jeśli chcesz użyć wartości domyślnej parametru. Ponieważ nie podano argumentu, Add używa szablonu domyślnego i tworzy nowy skoroszyt. Równoważna instrukcja we wcześniejszych wersjach języka C# wymaga argumentu zastępczego: 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;
}

Dodaj następujący kod na końcu elementu DisplayInExcel. Kod wstawia wartości do dwóch pierwszych kolumn pierwszego wiersza arkusza.

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

Dodaj następujący kod na końcu elementu DisplayInExcel. Pętla foreach umieszcza informacje z listy kont w dwóch pierwszych kolumnach kolejnych wierszy arkusza.


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

Dodaj następujący kod na końcu, DisplayInExcel aby dostosować szerokość kolumn w celu dopasowania jej do zawartości.

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

Wcześniejsze wersje języka C# wymagają jawnego rzutowania dla tych operacji, ponieważ ExcelApp.Columns[1] zwraca element Objecti AutoFit jest metodą programu Excel Range . Poniższe wiersze pokazują rzutowanie.

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

Język C# konwertuje zwracany Objectdynamic automatycznie, jeśli zestaw jest przywoływane przez opcję kompilatora EmbedInteropTypes lub, co równoważne, jeśli właściwość Osadź typy międzyoperacyjności programu Excel ma wartość true. True to wartość domyślna dla tej właściwości.

Aby uruchomić projekt

Dodaj następujący wiersz na końcu elementu Main.

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

Naciśnij klawisze CTRL+F5. Zostanie wyświetlony arkusz programu Excel zawierający dane z dwóch kont.

Aby dodać dokument programu Word

Poniższy kod otwiera aplikację programu Word i tworzy ikonę, która łączy się z arkuszem programu Excel. Wklej metodę CreateIconInWordDoc, podaną Program w dalszej części tego kroku, do klasy . CreateIconInWordDoc używa argumentów nazwanych i opcjonalnych, aby zmniejszyć złożoność wywołań metod do Add i PasteSpecial. Wywołania te zawierają dwie inne funkcje, które upraszczają wywołania metod COM, które mają parametry referencyjne. Najpierw można wysyłać argumenty do parametrów referencyjnych tak, jakby były parametrami wartości. Oznacza to, że można wysyłać wartości bezpośrednio bez tworzenia zmiennej dla każdego parametru odwołania. Kompilator generuje zmienne tymczasowe do przechowywania wartości argumentów i odrzuca zmienne po powrocie z wywołania. Po drugie, możesz pominąć ref słowo kluczowe na liście argumentów.

Metoda Add ma cztery parametry odwołania, z których wszystkie są opcjonalne. Możesz pominąć argumenty dla dowolnych lub wszystkich parametrów, jeśli chcesz użyć ich wartości domyślnych.

Metoda PasteSpecial wstawia zawartość Schowka. Metoda ma siedem parametrów odwołania, z których wszystkie są opcjonalne. Poniższy kod określa argumenty dla dwóch z nich: Link, aby utworzyć link do źródła zawartości Schowka i DisplayAsIcon, aby wyświetlić link jako ikonę. Można użyć nazwanych argumentów dla tych dwóch argumentów i pominąć inne. Chociaż te argumenty są parametrami referencyjnymi, nie musisz używać słowa kluczowego ref ani tworzyć zmiennych do wysyłania jako argumentów. Możesz wysłać wartości bezpośrednio.

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

Dodaj następującą instrukcję na końcu elementu Main.

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

Dodaj następującą instrukcję na końcu elementu DisplayInExcel. Metoda Copy dodaje arkusz do Schowka.

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

Naciśnij klawisze CTRL+F5. Zostanie wyświetlony dokument programu Word zawierający ikonę. Kliknij dwukrotnie ikonę, aby przenieść arkusz na pierwszy plan.

Aby ustawić właściwość Embed Interop Types (Osadź typy międzyoperacyjnych)

W przypadku wywoływania typu COM, który nie wymaga podstawowego zestawu międzyoperacyjnego (PIA) w czasie wykonywania, można uzyskać więcej ulepszeń. Usunięcie zależności od danych PIA powoduje niezależność wersji i łatwiejsze wdrażanie. Aby uzyskać więcej informacji na temat zalet programowania bez umów PIA, zobacz Przewodnik: osadzanie typów z zestawów zarządzanych.

Ponadto programowanie jest łatwiejsze, ponieważ dynamic typ reprezentuje wymagane i zwracane typy zadeklarowane w metodach COM. Zmienne, które mają typ dynamic , nie są oceniane do czasu wykonywania, co eliminuje konieczność jawnego rzutu. Aby uzyskać więcej informacji, zobacz Using Type dynamic (Używanie dynamicznego typu).

Osadzanie informacji o typie zamiast używania jednostek PIA jest zachowaniem domyślnym. Z tego powodu kilka poprzednich przykładów jest uproszczonych. Nie potrzebujesz żadnego jawnego rzutu. Na przykład deklaracja worksheet in DisplayInExcel jest zapisywana jako Excel._Worksheet workSheet = excelApp.ActiveSheet zamiast Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet. Wywołania metody AutoFit w tej samej metodzie również wymagają jawnego rzutowania bez wartości domyślnej, ponieważ ExcelApp.Columns[1] zwraca metodę Objecti AutoFit jest metodą programu Excel. Poniższy kod przedstawia rzutowanie.

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

Aby zmienić domyślne i użyć piAs zamiast osadzania informacji o typie, rozwiń węzeł Odwołania w Eksplorator rozwiązań, a następnie wybierz pozycję Microsoft.Office.Interop.Excel lub Microsoft.Office.Interop.Word. Jeśli nie widzisz okna Właściwości , naciśnij klawisz F4. Znajdź pozycję Osadź typy międzyoperacyjnych na liście właściwości i zmień jej wartość na False. Równoważne, można skompilować przy użyciu opcji kompilatora Odwołania zamiast EmbedInteropTypes w wierszu polecenia.

Aby dodać dodatkowe formatowanie do tabeli

Zastąp dwa wywołania do AutoFit w pliku DisplayInExcel następującą instrukcją.

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

Metoda AutoFormat ma siedem parametrów wartości, z których wszystkie są opcjonalne. Argumenty nazwane i opcjonalne umożliwiają podanie argumentów dla braków, niektórych lub wszystkich z nich. W poprzedniej instrukcji należy podać argument tylko dla jednego z parametrów : Format. Ponieważ Format jest pierwszym parametrem na liście parametrów, nie musisz podawać nazwy parametru. Jednak instrukcja może być łatwiejsza do zrozumienia, jeśli dołączysz nazwę parametru, jak pokazano w poniższym kodzie.

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

Naciśnij klawisze CTRL+F5, aby wyświetlić wynik. Inne formaty można znaleźć na liście wyliczenie XlRangeAutoFormat .

Przykład

Poniższy kod przedstawia kompletny przykład.

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

Zobacz też