Megosztás a következőn keresztül:


Az Office interop objektumainak elérése

A C# olyan funkciókkal rendelkezik, amelyek leegyszerűsítik az Office API-objektumokhoz való hozzáférést. Az új funkciók közé tartoznak a névvel ellátott és választható argumentumok, egy új, úgynevezett dynamictípus, valamint az a képesség, hogy az argumentumokat a COM-metódusok paramétereire hivatkozva úgy adják át, mintha értékparaméterek lennének.

Ebben a cikkben az új funkciókkal olyan kódot írhat, amely létrehoz és megjelenít egy Microsoft Office Excel-munkalapot. Az Excel-munkalaphoz csatolt ikont tartalmazó Office Word-dokumentum hozzáadásához kódot kell írnia.

Az útmutató elvégzéséhez telepítve kell lennie a számítógépre a Microsoft Office Excel 2007 és a Microsoft Office Word 2007 vagy újabb verzióival.

Feljegyzés

Előfordulhat, hogy a számítógép különböző neveket vagy helyeket jelenít meg a Visual Studio felhasználói felületének egyes elemeihez az alábbi utasításokban. Ezeket az elemeket a Visual Studio-kiadás és a használt beállítások határozzák meg. További információ: Az IDE személyre szabása.

Fontos

A VSTO (Visual Studio Tools for Office) a .NET-keretrendszer támaszkodik. A COM-bővítmények a .NET-keretrendszer is írhatók. Az Office-bővítmények nem hozhatók létre a .NET Core és a .NET 5+ legújabb verzióival. Ennek az az oka, hogy a .NET Core/.NET 5+ nem tud együttműködni a .NET-keretrendszer ugyanabban a folyamatban, és bővítménybetöltési hibákhoz vezethet. Továbbra is használhatja a .NET-keretrendszer az Office VSTO- és COM-bővítményeinek írásához. A Microsoft nem frissíti a VSTO-t vagy a COM bővítményplatformot a .NET Core vagy a .NET 5+ használatára. Az Office Web-bővítmények kiszolgálóoldalának létrehozásához a .NET Core és a .NET 5+ (beleértve a ASP.NET Core-t) is használhatja.

Új konzolalkalmazás létrehozása

  1. Indítsa el a Visual Studiót.
  2. A Fájl menüben mutasson az Új pontra, majd válassza a Project lehetőséget. Megjelenik a New project (Új projekt) párbeszédpanel.
  3. A Telepített sablonok panelen bontsa ki a C# elemet, majd válassza a Windows lehetőséget.
  4. Az Új projekt párbeszédpanel tetején győződjön meg arról, hogy a .NET-keretrendszer 4-es (vagy újabb) verziót választja célkeretként.
  5. A Sablonok panelen válassza a Konzolalkalmazás lehetőséget.
  6. Írja be a projekt nevét a Név mezőbe.
  7. Kattintson az OK gombra.

Az új projekt megjelenik Megoldáskezelő.

Hivatkozások hozzáadása

  1. A Megoldáskezelő kattintson a jobb gombbal a projekt nevére, majd válassza a Hivatkozás hozzáadása lehetőséget. Megjelenik a Hivatkozás hozzáadása párbeszédpanel.
  2. A Szerelvények lapon válassza a Microsoft.Office.Interop.Word elemet az Összetevő neve listában, majd tartsa lenyomva a CTRL billentyűt, és válassza a Microsoft.Office.Interop.Excel lehetőséget. Ha nem látja a szerelvényeket, előfordulhat, hogy telepítenie kell őket. Lásd : Az Office elsődleges interop-szerelvények telepítése.
  3. Kattintson az OK gombra.

A szükséges irányelvek hozzáadása

A Megoldáskezelő kattintson a jobb gombbal a Program.cs fájlra, majd válassza a Kód megtekintése parancsot. Adja hozzá a következő using irányelveket a kódfájl elejéhez:

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

Bankszámlalista létrehozása

Illessze be a következő osztálydefiníciót a Program.cs az Program osztály alá.

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

Adja hozzá a következő kódot a Main metódushoz egy bankAccounts két fiókot tartalmazó lista létrehozásához.

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

Fiókadatokat excelbe exportáló metódus deklarálása

  1. Excel-munkalap beállításához adja hozzá az alábbi metódust az Program osztályhoz. A metódus Add opcionális paraméterrel rendelkezik egy adott sablon megadásához. Az opcionális paraméterek lehetővé teszik, hogy kihagyja a paraméter argumentumát, ha a paraméter alapértelmezett értékét szeretné használni. Mivel nem adott meg argumentumot, az alapértelmezett sablont használja, Add és létrehoz egy új munkafüzetet. A C# korábbi verzióiban a megfelelő utasításhoz helyőrző argumentum szükséges: 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;
}

Adja hozzá a következő kódot a fájl végén DisplayInExcel. A kód a munkalap első sorának első két oszlopába szúr be értékeket.

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

Adja hozzá a következő kódot a fájl végén DisplayInExcel. A foreach hurok a fiókok listájából származó információkat a munkalap egymást követő sorainak első két oszlopába helyezi.


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

Adja hozzá a következő kódot az oszlop szélességének DisplayInExcel a tartalomhoz való igazításához.

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

A C# korábbi verziói explicit öntést igényelnek ezekhez a műveletekhez, mert ExcelApp.Columns[1] egy , és AutoFit egy Excel-metódust RangeObjectad vissza. Az alábbi sorok az öntést mutatják.

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

A C# automatikusan átalakítja a visszaadott Objectdynamic értéket, ha a szerelvényre az EmbedInteropTypes fordítóprogram hivatkozik, vagy ezzel egyenértékű, ha az Excel Beágyazás interoptípusok tulajdonsága igaz. Ennek a tulajdonságnak az alapértelmezett értéke az igaz.

A projekt futtatása

Adja hozzá a következő sort a végéhez Main.

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

Nyomja le a CTRL+F5 billentyűkombinációt. Megjelenik egy Excel-munkalap, amely a két fiók adatait tartalmazza.

Word-dokumentum hozzáadása

Az alábbi kód megnyit egy Word-alkalmazást, és létrehoz egy ikont, amely az Excel-munkalapra mutat. Illessze be az osztályba a lépés későbbi részében megadott beillesztési Program módszertCreateIconInWordDoc. CreateIconInWordDoc névvel ellátott és nem kötelező argumentumokat használ a metódushívások összetettségének csökkentésére AddPasteSpecial. Ezek a hívások két további funkciót tartalmaznak, amelyek leegyszerűsítik a referenciaparaméterekkel rendelkező COM-metódusok hívásait. Először úgy küldhet argumentumokat a referenciaparamétereknek, mintha értékparaméterek lennének. Ez azt is jelentheti, hogy közvetlenül küldhet értékeket anélkül, hogy minden referenciaparaméterhez létrehoznál egy változót. A fordító ideiglenes változókat hoz létre az argumentumértékek tárolásához, és a hívásból való visszatéréskor elveti a változókat. Másodszor kihagyhatja a kulcsszót ref az argumentumlistában.

A Add metódus négy referenciaparamétert használ, amelyek mindegyike nem kötelező. Ha az alapértelmezett értékeket szeretné használni, kihagyhatja bármelyik vagy az összes paraméter argumentumait.

A PasteSpecial metódus beszúrja a vágólap tartalmát. A metódus hét referenciaparamétert használ, amelyek mindegyike nem kötelező. A következő kód két argumentumot határoz meg: Linka vágólap tartalmának forrására mutató hivatkozás létrehozásához és DisplayAsIcona hivatkozás ikonként való megjelenítéséhez. A két argumentum nevesített argumentumait használhatja, és kihagyhatja a többit. Bár ezek az argumentumok referenciaparaméterek, nem kell a ref kulcsszót használnia, és nem kell változókat létrehoznia az argumentumként való küldéshez. Az értékeket közvetlenül is elküldheti.

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

Adja hozzá a következő utasítást Maina következő sor végén.

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

Adja hozzá a következő utasítást DisplayInExcela következő sor végén. A Copy metódus hozzáadja a munkalapot a vágólaphoz.

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

Nyomja le a CTRL+F5 billentyűkombinációt. Megjelenik egy ikont tartalmazó Word-dokumentum. Kattintson duplán az ikonra a munkalap előtérbe helyezéséhez.

A Beágyazás interop Types tulajdonság beállítása

További fejlesztések akkor lehetségesek, ha olyan COM-típust hív meg, amely nem igényel elsődleges interop szerelvényt (PIA) futásidőben. A PIA-któl való függőség megszüntetése verziófüggést és egyszerűbb üzembe helyezést eredményez. A PIA-k nélküli programozás előnyeiről további információt a következő útmutatóban talál : Típusok beágyazása felügyelt szerelvényekből.

Emellett a programozás egyszerűbb, mert a dynamic típus a COM-metódusokban deklarált kötelező és visszaadott típusokat jelöli. A típussal dynamic rendelkező változókat a rendszer csak futási idő alatt értékeli ki, ami szükségtelenné teszi az explicit öntést. További információt a Dinamikus típus használata című témakörben talál.

A típusinformációk beágyazása a PIA-k használata helyett az alapértelmezett viselkedés. Az alapértelmezett beállítás miatt az előző példák közül több is egyszerűbb. Nincs szükség explicit öntésre. A beírási DisplayInExcel deklaráció worksheet például nem a beírást, hanem Excel._Worksheet workSheet = excelApp.ActiveSheetExcel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheeta beírást írja. Az ugyanabban a metódusban indított AutoFit hívásokhoz az alapértelmezett érték nélküli explicit öntésre is szükség lenne, mivel ExcelApp.Columns[1] egy Object, és AutoFit egy Excel-metódust ad vissza. Az alábbi kód az öntvényt mutatja.

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

Ha módosítani szeretné az alapértelmezett beállítást, és nem beágyazási típusadatokat szeretne használni, bontsa ki a Hivatkozások csomópontot a Megoldáskezelő, majd válassza a Microsoft.Office.Interop.Excel vagy a Microsoft.Office.Interop.Word lehetőséget. Ha nem látja a Tulajdonságok ablakot, nyomja le az F4 billentyűt. Keresse meg a beágyazási interoptípusokat a tulajdonságok listájában, és módosítsa az értékét Hamis értékre. Ezzel egyenértékű, ha a Hivatkozások fordítót használja az EmbedInteropTypes parancs helyett egy parancssorban.

További formázás hozzáadása a táblához

Cserélje le a két behívott AutoFitDisplayInExcel hívást a következő utasításra.

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

A AutoFormat metódus hét értékparamétert használ, amelyek mindegyike nem kötelező. Az elnevezett és választható argumentumok lehetővé teszik, hogy argumentumokat adjon meg egyikhez sem, néhányhoz vagy mindegyikhez. Az előző utasításban csak az egyik paraméter argumentumát adja meg. Format Mivel Format a paraméterlista első paramétere, nem kell megadnia a paraméter nevét. Az utasítás azonban könnyebben érthető, ha a paraméter nevét adja meg, ahogy az az alábbi kódban is látható.

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

Az eredmény megtekintéséhez nyomja le a CTRL+F5 billentyűkombinációt. Az enumerálásban felsorolt egyéb formátumokat is megtalálhatja XlRangeAutoFormat .

Példa

Az alábbi kód a teljes példát mutatja be.

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

Lásd még