Toegang krijgen tot Office-interoperabiliteitsobjecten
C# heeft functies die de toegang tot Office API-objecten vereenvoudigen. De nieuwe functies omvatten benoemde en optionele argumenten, een nieuw type genaamd dynamic
en de mogelijkheid om argumenten door te geven om te verwijzen naar parameters in COM-methoden alsof het waardeparameters waren.
In dit artikel gebruikt u de nieuwe functies om code te schrijven waarmee een Microsoft Office Excel-werkblad wordt gemaakt en weergegeven. U schrijft code om een Office Word-document toe te voegen dat een pictogram bevat dat is gekoppeld aan het Excel-werkblad.
Als u dit scenario wilt voltooien, moet Microsoft Office Excel 2007 en Microsoft Office Word 2007 of nieuwere versies op uw computer zijn geïnstalleerd.
Notitie
Mogelijk worden op uw computer verschillende namen of locaties weergegeven voor sommige elementen van de Visual Studio-gebruikersinterface in de volgende instructies. De Visual Studio-editie die u hebt en de instellingen die u gebruikt, bepalen deze elementen. Zie Personalizing the IDE (Personalizing the IDE) voor meer informatie.
Belangrijk
VSTO (Visual Studio Tools for Office) is afhankelijk van .NET Framework. COM-invoegtoepassingen kunnen ook worden geschreven met .NET Framework. Office-invoegtoepassingen kunnen niet worden gemaakt met .NET Core en .NET 5+, de nieuwste versies van .NET. Dit komt doordat .NET Core/.NET 5+ niet kan samenwerken met .NET Framework in hetzelfde proces en kan leiden tot invoegtoepassingsfouten. U kunt .NET Framework blijven gebruiken om VSTO- en COM-invoegtoepassingen voor Office te schrijven. Microsoft werkt VSTO of het COM-invoegtoepassingsplatform niet bij om .NET Core of .NET 5+ te gebruiken. U kunt gebruikmaken van .NET Core en .NET 5+, inclusief ASP.NET Core, om de serverzijde van Office Web-invoegtoepassingen te maken.
Een nieuwe consoletoepassing maken
- Start Visual Studio.
- Wijs in het menu Bestand de optie Nieuw aan en selecteer Vervolgens Project. Het dialoogvenster Nieuw project wordt weergegeven.
- Vouw in het deelvenster Geïnstalleerde sjablonen C# uit en selecteer Windows.
- Kijk boven aan het dialoogvenster Nieuw project om ervoor te zorgen dat u .NET Framework 4 (of nieuwere versie) als doelframework selecteert.
- Selecteer Consoletoepassing in het deelvenster Sjablonen.
- Typ een naam voor uw project in het veld Naam .
- Selecteer OK.
Het nieuwe project wordt weergegeven in Solution Explorer.
Verwijzingen toevoegen
- Klik in Solution Explorer met de rechtermuisknop op de naam van uw project en selecteer Vervolgens Verwijzing toevoegen. Het dialoogvenster Verwijzing toevoegen wordt weergegeven.
- Selecteer op de pagina Assembly's Microsoft.Office.Interop.Word in de lijst Met onderdeelnamen en houd vervolgens Ctrl ingedrukt en selecteer Microsoft.Office.Interop.Excel. Als u de assembly's niet ziet, moet u deze mogelijk installeren. Zie Procedure: Primaire Interop-assembly's van Office installeren.
- Selecteer OK.
Benodigde gebruiksrichtlijnen toevoegen
Klik in Solution Explorer met de rechtermuisknop op het Program.cs-bestand en selecteer Code weergeven. Voeg de volgende using
instructies toe aan het begin van het codebestand:
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
Een lijst met bankrekeningen maken
Plak de volgende klassedefinitie in Program.cs onder de Program
klasse.
public class Account
{
public int ID { get; set; }
public double Balance { get; set; }
}
Voeg de volgende code toe aan de Main
methode om een bankAccounts
lijst met twee accounts te maken.
// Create a list of accounts.
var bankAccounts = new List<Account> {
new Account {
ID = 345678,
Balance = 541.27
},
new Account {
ID = 1230221,
Balance = -127.44
}
};
Een methode declareren waarmee accountgegevens worden geëxporteerd naar Excel
- Voeg de volgende methode toe aan de
Program
klasse om een Excel-werkblad in te stellen. De methode Add heeft een optionele parameter voor het opgeven van een bepaalde sjabloon. Met optionele parameters kunt u het argument voor die parameter weglaten als u de standaardwaarde van de parameter wilt gebruiken. Omdat u geen argument hebt opgegeven,Add
gebruikt u de standaardsjabloon en maakt u een nieuwe werkmap. Voor de equivalente instructie in eerdere versies van C# is een tijdelijke aanduiding vereist: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;
}
Voeg de volgende code toe aan het einde van DisplayInExcel
. Met de code worden waarden ingevoegd in de eerste twee kolommen van de eerste rij van het werkblad.
// Establish column headings in cells A1 and B1.
workSheet.Cells[1, "A"] = "ID Number";
workSheet.Cells[1, "B"] = "Current Balance";
Voeg de volgende code toe aan het einde van DisplayInExcel
. De foreach
lus plaatst de gegevens uit de lijst met accounts in de eerste twee kolommen met opeenvolgende rijen van het werkblad.
var row = 1;
foreach (var acct in accounts)
{
row++;
workSheet.Cells[row, "A"] = acct.ID;
workSheet.Cells[row, "B"] = acct.Balance;
}
Voeg de volgende code toe aan het einde van het aanpassen van DisplayInExcel
de kolombreedten aan de inhoud.
workSheet.Columns[1].AutoFit();
workSheet.Columns[2].AutoFit();
Eerdere versies van C# vereisen expliciete cast-conversie voor deze bewerkingen, omdat ExcelApp.Columns[1]
deze een Object
, en AutoFit
een Excel-methode Range is. In de volgende regels ziet u het casten.
((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();
C# converteert de geretourneerde Object
waarde dynamic
automatisch als naar de assembly wordt verwezen door de compileroptie EmbedInteropTypes of, equivalent, als de eigenschap Excel Embed Interop Types waar is. Waar is de standaardwaarde voor deze eigenschap.
Het project uitvoeren
Voeg de volgende regel toe aan het einde van Main
.
// Display the list in an Excel spreadsheet.
DisplayInExcel(bankAccounts);
Druk op Ctrl+F5. Er wordt een Excel-werkblad weergegeven met de gegevens van de twee accounts.
Een Word-document toevoegen
Met de volgende code wordt een Word-toepassing geopend en wordt een pictogram gemaakt dat is gekoppeld aan het Excel-werkblad. Plakmethode CreateIconInWordDoc
, verderop in deze stap, in de Program
klasse. CreateIconInWordDoc
gebruikt benoemde en optionele argumenten om de complexiteit van de methode-aanroepen naar Add en PasteSpecial. Deze aanroepen bevatten twee andere functies waarmee aanroepen naar COM-methoden met referentieparameters worden vereenvoudigd. Eerst kunt u argumenten naar de referentieparameters verzenden alsof het waardeparameters zijn. Dat wil gezegd, u kunt waarden rechtstreeks verzenden zonder een variabele te maken voor elke referentieparameter. De compiler genereert tijdelijke variabelen voor het opslaan van de argumentwaarden en verwijdert de variabelen wanneer u terugkeert vanuit de aanroep. Ten tweede kunt u het ref
trefwoord weglaten in de lijst met argumenten.
De Add
methode heeft vier referentieparameters, die allemaal optioneel zijn. U kunt argumenten weglaten voor een of alle parameters als u de standaardwaarden wilt gebruiken.
Met PasteSpecial
de methode wordt de inhoud van het Klembord ingevoegd. De methode heeft zeven referentieparameters, die allemaal optioneel zijn. Met de volgende code worden argumenten voor twee van de argumenten opgegeven: Link
om een koppeling te maken naar de bron van de inhoud van het Klembord en DisplayAsIcon
om de koppeling weer te geven als pictogram. U kunt benoemde argumenten gebruiken voor deze twee argumenten en de andere argumenten weglaten. Hoewel deze argumenten verwijzingsparameters zijn, hoeft u het ref
trefwoord niet te gebruiken of om variabelen te maken die als argumenten moeten worden verzonden. U kunt de waarden rechtstreeks verzenden.
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);
}
Voeg de volgende instructie toe aan het einde van Main
.
// Create a Word document that contains an icon that links to
// the spreadsheet.
CreateIconInWordDoc();
Voeg de volgende instructie toe aan het einde van DisplayInExcel
. Met de Copy
methode wordt het werkblad toegevoegd aan het Klembord.
// 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();
Druk op Ctrl+F5. Er wordt een Word-document weergegeven dat een pictogram bevat. Dubbelklik op het pictogram om het werkblad naar de voorgrond te brengen.
De eigenschap Insluiten interoperabiliteitstypen instellen
Er zijn meer verbeteringen mogelijk wanneer u een COM-type aanroept waarvoor tijdens runtime geen primaire interopassembly (PIA) nodig is. Het verwijderen van de afhankelijkheid van PIA's resulteert in versieonafhankelijkheid en eenvoudigere implementatie. Zie Walkthrough: Insluitingstypen van beheerde assembly's voor meer informatie over de voordelen van programmeren zonder PIA's.
Bovendien is programmeren eenvoudiger omdat het dynamic
type de vereiste en geretourneerde typen vertegenwoordigt die zijn gedeclareerd in COM-methoden. Variabelen met type dynamic
worden pas geëvalueerd als de uitvoeringstijd is verstreken, waardoor expliciete cast-conversie niet meer nodig is. Zie Dynamisch type gebruiken voor meer informatie.
Het insluiten van typegegevens in plaats van het gebruik van PIA's is standaardgedrag. Vanwege deze standaardinstelling zijn verschillende van de vorige voorbeelden vereenvoudigd. U hebt geen expliciete cast nodig. De indeclaratie wordt bijvoorbeeld geschreven als in plaats Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet
van worksheet
DisplayInExcel
.Excel._Worksheet workSheet = excelApp.ActiveSheet
De aanroepen in AutoFit
dezelfde methode vereisen ook expliciete cast-conversie zonder de standaardinstelling, omdat ExcelApp.Columns[1]
Object
een en AutoFit
is een Excel-methode. De volgende code toont het casten.
((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();
Als u de standaardinstelling wilt wijzigen en pia's wilt gebruiken in plaats van ingesloten typegegevens, vouwt u het knooppunt Verwijzingen uit in Solution Explorer en selecteert u vervolgens Microsoft.Office.Interop.Excel of Microsoft.Office.Interop.Word. Als u het venster Eigenschappen niet ziet, drukt u op F4. Zoek insluitingstypen in de lijst met eigenschappen en wijzig de waarde ervan in Onwaar. U kunt ook compileren met behulp van de optie Verwijzingen compiler in plaats van EmbedInteropTypes bij een opdrachtprompt.
Aanvullende opmaak toevoegen aan de tabel
Vervang de twee aanroepen door AutoFit
DisplayInExcel
de volgende instructie.
// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
De AutoFormat methode heeft zeven waardeparameters, die allemaal optioneel zijn. Met benoemde en optionele argumenten kunt u argumenten opgeven voor geen, sommige of allemaal. In de vorige instructie geeft u een argument op voor slechts één van de parameters, Format
. Omdat Format
dit de eerste parameter in de lijst met parameters is, hoeft u de parameternaam niet op te geven. De instructie kan echter gemakkelijker te begrijpen zijn als u de parameternaam opneemt, zoals wordt weergegeven in de volgende code.
// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(Format:
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
Druk op Ctrl+F5 om het resultaat weer te geven. U vindt andere indelingen in de lijst in de XlRangeAutoFormat opsomming.
Opmerking
De volgende code toont het volledige voorbeeld.
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; }
}
}