Så här kommer du åt Office-interop-objekt
C# har funktioner som förenklar åtkomsten till Office API-objekt. De nya funktionerna innehåller namngivna och valfria argument, en ny typ med namnet dynamic
, och möjligheten att skicka argument till referensparametrar i COM-metoder som om de vore värdeparametrar.
I den här artikeln använder du de nya funktionerna för att skriva kod som skapar och visar ett Microsoft Office Excel-kalkylblad. Du skriver kod för att lägga till ett Office Word-dokument som innehåller en ikon som är länkad till Excel-kalkylbladet.
För att slutföra den här genomgången måste du ha Microsoft Office Excel 2007 och Microsoft Office Word 2007, eller senare versioner, installerade på datorn.
Kommentar
Datorn kan visa olika namn eller platser för vissa av Visual Studio-användargränssnittselementen i följande instruktioner. Den Visual Studio-utgåva som du har och de inställningar som du använder avgör dessa element. Mer information finns i Anpassa IDE.
Viktigt!
VSTO (Visual Studio Tools för Office) förlitar sig på .NET Framework. COM-tillägg kan också skrivas med .NET Framework. Office-tillägg kan inte skapas med .NET Core och .NET 5+, de senaste versionerna av .NET. Det beror på att .NET Core/.NET 5+ inte kan fungera tillsammans med .NET Framework i samma process och kan leda till tilläggsbelastningsfel. Du kan fortsätta att använda .NET Framework för att skriva VSTO- och COM-tillägg för Office. Microsoft uppdaterar inte VSTO eller COM-tilläggsplattformen för att använda .NET Core eller .NET 5+. Du kan dra nytta av .NET Core och .NET 5+, inklusive ASP.NET Core, för att skapa serversidan för Office Web Add-ins.
Skapa ett nytt konsolprogram
- Starta Visual Studio.
- På Arkiv-menyn pekar du på Nytt och väljer sedan Projekt. Dialogrutan Nytt projekt visas.
- I fönstret Installerade mallar expanderar du C#och väljer sedan Windows.
- Titta längst upp i dialogrutan Nytt projekt för att se till att välja .NET Framework 4 (eller senare version) som ett målramverk.
- I fönstret Mallar väljer du Konsolprogram.
- Ange ett namn för projektet i fältet Namn .
- Välj OK.
Det nya projektet visas i Solution Explorer.
Så här lägger du till referenser
- Högerklicka på projektets namn i Solution Explorer och välj sedan Lägg till referens. Dialogrutan Lägg till referens visas.
- På sidan Sammansättningar väljer du Microsoft.Office.Interop.Word i listan Komponentnamn och håller sedan ned CTRL-tangenten och väljer Microsoft.Office.Interop.Excel. Om du inte ser sammansättningarna kan du behöva installera dem. Se Så här: Installera Office Primary Interop-sammansättningar.
- Välj OK.
Lägga till nödvändiga med hjälp av direktiv
Högerklicka på filen Program.cs i Solution Explorer och välj sedan Visa kod. Lägg till följande using
direktiv överst i kodfilen:
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
Så här skapar du en lista över bankkonton
Klistra in följande klassdefinition i Program.cs under Program
klassen .
public class Account
{
public int ID { get; set; }
public double Balance { get; set; }
}
Lägg till följande kod i Main
metoden för att skapa en bankAccounts
lista som innehåller två konton.
// Create a list of accounts.
var bankAccounts = new List<Account> {
new Account {
ID = 345678,
Balance = 541.27
},
new Account {
ID = 1230221,
Balance = -127.44
}
};
Deklarera en metod som exporterar kontoinformation till Excel
- Lägg till följande metod i
Program
klassen för att konfigurera ett Excel-kalkylblad. Metoden Add har en valfri parameter för att ange en viss mall. Med valfria parametrar kan du utelämna argumentet för parametern om du vill använda parameterns standardvärde. Eftersom du inte angav något argumentAdd
använder du standardmallen och skapar en ny arbetsbok. Motsvarande instruktion i tidigare versioner av C# kräver ett platshållarargument: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;
}
Lägg till följande kod i slutet av DisplayInExcel
. Koden infogar värden i de två första kolumnerna i kalkylbladets första rad.
// Establish column headings in cells A1 and B1.
workSheet.Cells[1, "A"] = "ID Number";
workSheet.Cells[1, "B"] = "Current Balance";
Lägg till följande kod i slutet av DisplayInExcel
. Loopen foreach
placerar informationen från listan över konton i de två första kolumnerna i efterföljande rader i kalkylbladet.
var row = 1;
foreach (var acct in accounts)
{
row++;
workSheet.Cells[row, "A"] = acct.ID;
workSheet.Cells[row, "B"] = acct.Balance;
}
Lägg till följande kod i slutet av DisplayInExcel
för att justera kolumnbredderna så att de passar innehållet.
workSheet.Columns[1].AutoFit();
workSheet.Columns[2].AutoFit();
Tidigare versioner av C# kräver explicit gjutning för dessa åtgärder eftersom ExcelApp.Columns[1]
returnerar en Object
, och AutoFit
är en Excel-metod Range . Följande rader visar gjutningen.
((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();
C# konverterar den som returneras Object
till automatiskt om sammansättningen refereras av kompileringsalternativet EmbedInteropTypes eller, på motsvarande sätt, om egenskapen Excel Embed Interop Types är dynamic
true. True är standardvärdet för den här egenskapen.
Så här kör du projektet
Lägg till följande rad i slutet av Main
.
// Display the list in an Excel spreadsheet.
DisplayInExcel(bankAccounts);
Tryck på CTRL+F5. Ett Excel-kalkylblad visas som innehåller data från de två kontona.
Så här lägger du till ett Word-dokument
Följande kod öppnar ett Word-program och skapar en ikon som länkar till Excel-kalkylbladet. Klistra in metoden CreateIconInWordDoc
, som anges senare i det här steget, i Program
klassen. CreateIconInWordDoc
använder namngivna och valfria argument för att minska komplexiteten för metodanropen till Add och PasteSpecial. Dessa anrop innehåller två andra funktioner som förenklar anrop till COM-metoder som har referensparametrar. Först kan du skicka argument till referensparametrarna som om de vore värdeparametrar. Du kan alltså skicka värden direkt utan att skapa en variabel för varje referensparameter. Kompilatorn genererar tillfälliga variabler för att lagra argumentvärdena och tar bort variablerna när du kommer tillbaka från anropet. För det andra kan du utelämna nyckelordet ref
i argumentlistan.
Metoden Add
har fyra referensparametrar, som alla är valfria. Du kan utelämna argument för valfri eller alla parametrar om du vill använda deras standardvärden.
Metoden PasteSpecial
infogar innehållet i Urklipp. Metoden har sju referensparametrar, som alla är valfria. Följande kod anger argument för två av dem: Link
, för att skapa en länk till källan för Innehållet i Urklipp och DisplayAsIcon
, för att visa länken som en ikon. Du kan använda namngivna argument för dessa två argument och utelämna de andra. Även om dessa argument är referensparametrar behöver du inte använda nyckelordet ref
eller skapa variabler för att skicka in som argument. Du kan skicka värdena direkt.
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);
}
Lägg till följande -instruktion i slutet av Main
.
// Create a Word document that contains an icon that links to
// the spreadsheet.
CreateIconInWordDoc();
Lägg till följande -instruktion i slutet av DisplayInExcel
. Metoden Copy
lägger till kalkylbladet i Urklipp.
// 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();
Tryck på CTRL+F5. Ett Word-dokument visas som innehåller en ikon. Dubbelklicka på ikonen för att ta kalkylbladet till förgrunden.
Ange egenskapen Embed Interop Types (Bädda in interop-typer)
Fler förbättringar är möjliga när du anropar en COM-typ som inte kräver en primär interop-sammansättning (PIA) vid körning. Om du tar bort beroendet av PIA resulterar det i versionsberoende och enklare distribution. Mer information om fördelarna med programmering utan PIA finns i Genomgång: Bädda in typer från hanterade sammansättningar.
Dessutom är programmering enklare eftersom dynamic
typen representerar de obligatoriska och returnerade typerna som deklareras i COM-metoder. Variabler som har typ dynamic
utvärderas inte förrän körningstiden, vilket eliminerar behovet av explicit gjutning. Mer information finns i Använda dynamisk typ.
Inbäddning av typinformation i stället för att använda PIA är standardbeteende. På grund av den standardinställningen förenklas flera av de tidigare exemplen. Du behöver ingen explicit gjutning. Till exempel skrivs indeklarationen worksheet
som Excel._Worksheet workSheet = excelApp.ActiveSheet
i DisplayInExcel
stället Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet
för . Anropen till AutoFit
i samma metod skulle också kräva explicit gjutning utan standard, eftersom ExcelApp.Columns[1]
returnerar en Object
, och AutoFit
är en Excel-metod. Följande kod visar gjutningen.
((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();
Om du vill ändra standardinställningen och använda PIA i stället för att bädda in typinformation expanderar du noden Referenser i Solution Explorer och väljer sedan Microsoft.Office.Interop.Excel eller Microsoft.Office.Interop.Word. Om du inte kan se fönstret Egenskaper trycker du på F4. Leta reda på Bädda in interoptyper i listan över egenskaper och ändra dess värde till False. På motsvarande sätt kan du kompilera med hjälp av alternativet Referenskompilerare i stället för EmbedInteropTypes i en kommandotolk.
Så här lägger du till ytterligare formatering i tabellen
Ersätt de två anropen till AutoFit
i DisplayInExcel
med följande instruktion.
// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
Metoden AutoFormat har sju värdeparametrar, som alla är valfria. Med namngivna och valfria argument kan du ange argument för ingen, vissa eller alla av dem. I föregående instruktion anger du ett argument för endast en av parametrarna, Format
. Eftersom Format
är den första parametern i parameterlistan behöver du inte ange parameternamnet. Instruktionen kan dock vara lättare att förstå om du inkluderar parameternamnet, som du ser i följande kod.
// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(Format:
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
Tryck på CTRL+F5 för att se resultatet. Du hittar andra format i listan i XlRangeAutoFormat uppräkningen.
Exempel
Följande kod visar det fullständiga exemplet.
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; }
}
}