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ý dynamic
a 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
- Spusťte Visual Studio.
- V nabídce Soubor přejděte na příkaz Nový a vyberte Projekt. Zobrazí se dialogové okno Nový projekt.
- V podokně Nainstalované šablony rozbalte C# a pak vyberte Windows.
- 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).
- V podokně Šablony vyberte Konzolová aplikace.
- Do pole Název zadejte název projektu.
- Vyberte OK.
Nový projekt se zobrazí v Průzkumník řešení.
Přidání odkazů
- 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 .
- 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.
- 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
- 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 Object
dynamic
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 Main
př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 CreateIconInWordDoc
Program
, 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 Main
přidejte následující příkaz .
// Create a Word document that contains an icon that links to
// the spreadsheet.
CreateIconInWordDoc();
Na konec příkazu DisplayInExcel
př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 Object
a 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í AutoFit
DisplayInExcel
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; }
}
}