Jak získat přístup k objektům interoperability Office

Jazyk C# má funkce, které zjednodušují přístup k objektům rozhraní API Office. Nové funkce zahrnují pojmenované a volitelné argumenty, nový typ volaný dynamica schopnost předávat argumenty odkaz na parametry v metodách MODELU COM, jako by byly parametry hodnoty.

V tomto článku použijete nové funkce k napsání kódu, který vytvoří a zobrazí systém Microsoft Office excelový list. Napíšete kód pro přidání wordového dokumentu Office, který obsahuje ikonu propojenou s excelovými listy.

K dokončení tohoto návodu musíte mít v počítači nainstalované systém Microsoft Office Excelu 2007 a systém Microsoft Office Wordu 2007 nebo novějších verzích.

Poznámka:

Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí.

Důležité

VSTO (Visual Studio Tools for Office) spoléhá na rozhraní .NET Framework. Doplňky modelu COM lze také napsat pomocí rozhraní .NET Framework. Doplňky pro Office nelze vytvořit pomocí .NET Core a .NET 5 nebo novějších, nejnovějších verzí .NET. Důvodem je to, že .NET Core/.NET 5+ nemůže spolupracovat s rozhraním .NET Framework ve stejném procesu a může vést k selháním načítání doplňků. K psaní doplňků VSTO a COM pro Office můžete dál používat rozhraní .NET Framework. Microsoft nebude aktualizovat VSTO ani doplňkovou platformu MODELU COM, aby používala .NET Core nebo .NET 5+. Pokud chcete vytvořit serverovou stranu webových doplňků Office, můžete využít rozhraní .NET Core a .NET 5 nebo novější, včetně ASP.NET Core.

Vytvoření nové konzolové aplikace

  1. Spusťte Visual Studio.
  2. V nabídce Soubor přejděte na příkaz Nový a vyberte Projekt. Zobrazí se dialogové okno Nový projekt.
  3. V podokně Nainstalované šablony rozbalte C# a pak vyberte Windows.
  4. V horní části dialogového okna Nový projekt se ujistěte, že jako cílovou architekturu vyberete rozhraní .NET Framework 4 (nebo novější verzi).
  5. V podokně Šablony vyberte Konzolová aplikace.
  6. Do pole Název zadejte název projektu.
  7. Vyberte OK.

Nový projekt se zobrazí v Průzkumník řešení.

Přidání odkazů

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na název projektu a pak vyberte Přidat odkaz. Zobrazí se dialogové okno Přidat odkaz .
  2. Na stránce Sestavení vyberte Microsoft.Office.Interop.Word v seznamu Název součásti a podržte stisknutou klávesu CTRL a vyberte Microsoft.Office.Interop.Excel. Pokud sestavení nevidíte, možná je budete muset nainstalovat. Viz Postupy: Instalace primárních sestavení vzájemné spolupráce Office.
  3. Vyberte OK.

Přidání nezbytných direktiv using

V Průzkumník řešení klikněte pravým tlačítkem myši na soubor Program.cs a pak vyberte Zobrazit kód. Na začátek souboru kódu přidejte následující using direktivy:

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

Vytvoření seznamu bankovních účtů

Do Program.csProgram pod třídu vložte následující definici třídy.

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

Do metody přidejte následující kód Main pro bankAccounts vytvoření seznamu, který obsahuje dva účty.

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

Deklarace metody exportu informací o účtu do Excelu

  1. Přidejte do třídy následující metodu Program pro nastavení excelového listu. Metoda Add má volitelný parametr pro zadání konkrétní šablony. Volitelné parametry umožňují vynechat argument pro tento parametr, pokud chcete použít výchozí hodnotu parametru. Protože jste argument nezadali, Add použije výchozí šablonu a vytvoří nový sešit. Ekvivalentní příkaz v dřívějších verzích jazyka C# vyžaduje zástupný argument: 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;
}

Na konec souboru DisplayInExcel. Kód vloží hodnoty do prvních dvou sloupců prvního řádku listu.

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

Na konec souboru DisplayInExcel. Smyčka foreach vloží informace ze seznamu účtů do prvních dvou sloupců po sobě jdoucích řádků listu.


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

Na konec DisplayInExcel přidejte následující kód a upravte šířky sloupců tak, aby odpovídaly obsahu.

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

Starší verze jazyka C# vyžadují pro tyto operace explicitní přetypování, protože ExcelApp.Columns[1] vrací hodnotu a AutoFit je metoda aplikace Excel RangeObject. Následující řádky ukazují přetypování.

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

Jazyk C# převede vrácenou Objectdynamic hodnotu automaticky, pokud je na sestavení odkazováno možností kompilátoru EmbedInteropTypes, nebo je-li vlastnost Excel Embed Interop Types true. True je výchozí hodnota pro tuto vlastnost.

Spuštění projektu

Na konec řádku Mainpřidejte následující řádek .

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

Stiskněte kombinaci kláves CTRL+F5. Zobrazí se excelový list, který obsahuje data ze dvou účtů.

Přidání wordového dokumentu

Následující kód otevře aplikaci Word a vytvoří ikonu, která odkazuje na excelový list. Vložte metodu CreateIconInWordDocProgram , která je k dispozici dále v tomto kroku, do třídy. CreateIconInWordDoc používá pojmenované a volitelné argumenty ke snížení složitosti volání Add metody a PasteSpecial. Tato volání zahrnují dvě další funkce, které zjednodušují volání metod modelu COM, které mají referenční parametry. Nejprve můžete argumenty odeslat referenčním parametrům, jako by šlo o parametry hodnot. To znamená, že můžete odesílat hodnoty přímo, aniž byste vytvořili proměnnou pro každý referenční parametr. Kompilátor vygeneruje dočasné proměnné, které budou obsahovat hodnoty argumentů, a při návratu z volání zahodí proměnné. Za druhé můžete vynechat ref klíčové slovo v seznamu argumentů.

Metoda Add má čtyři referenční parametry, z nichž všechny jsou volitelné. Pokud chcete použít výchozí hodnoty, můžete argumenty pro libovolný nebo všechny parametry vynechat.

Metoda PasteSpecial vloží obsah schránky. Metoda má sedm referenčních parametrů, z nichž všechny jsou volitelné. Následující kód určuje argumenty pro dva z nich: Link, pro vytvoření odkazu na zdroj obsahu schránky a DisplayAsIcon, pro zobrazení odkazu jako ikony. Pro tyto dva argumenty můžete použít pojmenované argumenty a vynechat ostatní. I když jsou tyto argumenty referenčními parametry, nemusíte používat ref klíčové slovo ani vytvářet proměnné, které se mají odesílat jako argumenty. Hodnoty můžete odeslat přímo.

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

Na konec příkazu Mainpřidejte následující příkaz .

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

Na konec příkazu DisplayInExcelpřidejte následující příkaz . Metoda Copy přidá list do schránky.

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

Stiskněte kombinaci kláves CTRL+F5. Zobrazí se wordový dokument, který obsahuje ikonu. Poklikáním na ikonu přeneste list do popředí.

Nastavení vlastnosti Vložit typy interoperability

Další vylepšení jsou možná při volání typu COM, který nevyžaduje primární sestavení vzájemné spolupráce (PIA) za běhu. Odebrání závislosti na piA vede k nezávislosti verzí a snadnějšímu nasazení. Další informace o výhodách programování bez piA naleznete v tématu Návod: Vkládání typů ze spravovaných sestavení.

Programování je navíc jednodušší, protože dynamic typ představuje požadované a vrácené typy deklarované v metodách MODELU COM. Proměnné, které mají typ dynamic , se nevyhodnocují do doby běhu, což eliminuje potřebu explicitního přetypování. Další informace naleznete v tématu Použití dynamického typu.

Vkládání informací o typu místo použití PIA je výchozí chování. Z tohoto výchozího nastavení se zjednoduší několik předchozích příkladů. Nepotřebujete explicitní přetypování. Například deklarace worksheet in DisplayInExcel je zapsána jako Excel._Worksheet workSheet = excelApp.ActiveSheet místo Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet. Volání AutoFit ve stejné metodě by také vyžadovala explicitní přetypování bez výchozí hodnoty, protože ExcelApp.Columns[1] vrátí hodnotu Objecta AutoFit je excelovou metodou. Následující kód ukazuje přetypování.

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

Pokud chcete změnit výchozí nastavení a místo informací o typu vložení použít piA, rozbalte uzel Reference v Průzkumník řešení a vyberte Microsoft.Office.Interop.Excel nebo Microsoft.Office.Interop.Word. Pokud se okno Vlastnosti nezobrazuje, stiskněte klávesu F4. V seznamu vlastností vyhledejte typy zprostředkovatele komunikace vložení a změňte jeho hodnotu na False. Stejně tak můžete zkompilovat pomocí možnosti Odkazy kompilátoru místo EmbedInteropTypes na příkazovém řádku.

Přidání dalšího formátování do tabulky

Nahraďte tato dvě volání AutoFitDisplayInExcel následujícím příkazem.

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

Metoda AutoFormat má sedm parametrů hodnot, z nichž všechny jsou volitelné. Pojmenované a volitelné argumenty umožňují zadat argumenty pro žádné, některé nebo všechny. V předchozím příkazu zadáte argument pouze pro jeden z parametrů , Format. Protože Format je prvním parametrem v seznamu parametrů, nemusíte zadávat název parametru. Příkaz ale může být srozumitelnější, pokud zahrnete název parametru, jak je znázorněno v následujícím kódu.

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

Výsledek zobrazíte stisknutím kombinace kláves CTRL+F5. Další formáty najdete v seznamu.XlRangeAutoFormat

Příklad

Následující kód ukazuje úplný příklad.

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

Viz také