webentwicklung-frage-antwort-db.com.de

- Programmgesteuertes Hinzufügen eines Excel-Arbeitsblatts - Office XP / 2003

Ich fange gerade mit Excel über C # an, um die Erstellung zu automatisieren und eine Excel-Datei hinzuzufügen.

Ich kann die Datei öffnen und ihre Daten aktualisieren und die vorhandenen Arbeitsblätter durchgehen. Mein Problem ist, wie kann ich neue Blätter hinzufügen?

Ich habe es versucht:

Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)excelApp.ThisWorkbook.Worksheets.Add(
                Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Aber ich bekomme unter COM-Ausnahme und mein Googeln hat mir keine Antwort gegeben.

Ausnahme von HRESULT: 0x800A03EC-Quelle ist: "Interop.Excel"

Ich hoffe, jemand kann mich vielleicht aus meinem Elend retten.

23
Jon

Sie müssen einen COM-Verweis in Ihrem Projekt zum "Microsoft Excel 11.0 Object Library" - oder zu einer geeigneten Version hinzufügen.

Dieser Code funktioniert für mich:

private void AddWorksheetToExcelWorkbook(string fullFilename,string worksheetName)
{
    Microsoft.Office.Interop.Excel.Application xlApp = null;
    Workbook xlWorkbook = null;
    Sheets xlSheets = null;
    Worksheet xlNewSheet = null;

    try {
        xlApp = new Microsoft.Office.Interop.Excel.Application();

        if (xlApp == null)
            return;

        // Uncomment the line below if you want to see what's happening in Excel
        // xlApp.Visible = true;

        xlWorkbook = xlApp.Workbooks.Open(fullFilename, 0, false, 5, "", "",
                false, XlPlatform.xlWindows, "",
                true, false, 0, true, false, false);

        xlSheets = xlWorkbook.Sheets as Sheets;

        // The first argument below inserts the new worksheet as the first one
        xlNewSheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
        xlNewSheet.Name = worksheetName;

        xlWorkbook.Save();
        xlWorkbook.Close(Type.Missing,Type.Missing,Type.Missing);
        xlApp.Quit();
    }
    finally {
        Marshal.ReleaseComObject(xlNewSheet);
        Marshal.ReleaseComObject(xlSheets);
        Marshal.ReleaseComObject(xlWorkbook);
        Marshal.ReleaseComObject(xlApp);
        xlApp = null;
    }
}

Beachten Sie, dass Sie sehr vorsichtig sein müssen mit ordnungsgemäße Bereinigung und Freigabe Ihrer COM-Objektreferenzen . In dieser StackOverflow-Frage ist eine nützliche Faustregel enthalten: "Verwenden Sie niemals 2 Punkte mit COM-Objekten" . In Ihrem Code; Sie werden echte Probleme damit haben. Mein Demo-Code oben räumt die Excel-App NICHT richtig auf, aber es ist ein Anfang!

Einige andere Links, die ich bei der Untersuchung dieser Frage nützlich fand:

Laut MSDN

Um COM Interop verwenden zu können, müssen Sie über Administrator- oder Hauptbenutzer-Sicherheitsberechtigungen verfügen.

Ich hoffe, das hilft.

42
AR.

Ich möchte mich für die hervorragenden Antworten bedanken. @AR., Du bist ein Star und es funktioniert perfekt. Ich hatte letzte Nacht bemerkt, dass der Excel.exe nicht geschlossen wurde; also habe ich recherchiert und herausgefunden, wie man COM-Objekte freigibt. Hier ist mein endgültiger Code:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
using Excel;

namespace testExcelconsoleApp
{
    class Program
    {
        private String fileLoc = @"C:\temp\test.xls";

        static void Main(string[] args)
        {
            Program p = new Program();
            p.createExcel();
        }

        private void createExcel()
        {
            Excel.Application excelApp = null;
            Excel.Workbook workbook = null;
            Excel.Sheets sheets = null;
            Excel.Worksheet newSheet = null;

            try
            {
                FileInfo file = new FileInfo(fileLoc);
                if (file.Exists)
                {
                    excelApp = new Excel.Application();
                    workbook = excelApp.Workbooks.Open(fileLoc, 0, false, 5, "", "",
                                                        false, XlPlatform.xlWindows, "",
                                                        true, false, 0, true, false, false);

                    sheets = workbook.Sheets;

                    //check columns exist
                    foreach (Excel.Worksheet sheet in sheets)
                    {
                        Console.WriteLine(sheet.Name);
                        sheet.Select(Type.Missing);

                        System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
                    }

                    newSheet = (Worksheet)sheets.Add(sheets[1], Type.Missing, Type.Missing, Type.Missing);
                    newSheet.Name = "My New Sheet";
                    newSheet.Cells[1, 1] = "BOO!";

                    workbook.Save();
                    workbook.Close(null, null, null);
                    excelApp.Quit();
                }
            }
            finally
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(newSheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

                newSheet = null;
                sheets = null;
                workbook = null;
                excelApp = null;

                GC.Collect();
            }
        }
    }
}

Danke für all deine Hilfe.

5
Jon

Noch ein "Up Tick" für AR ..., aber wenn Sie nicht Interop verwenden müssen, würde ich es ganz vermeiden. Dieses Produkt ist eigentlich ziemlich interessant: http://www.clearoffice.com/ und es bietet eine sehr intuitive, vollständig verwaltete API für die Bearbeitung von Excel-Dateien und scheint kostenlos zu sein. (zumindest vorläufig) SpreadSheetGear ist auch ausgezeichnet, aber teuer. 

meine zwei Cent.

2
sbeskur

Vergessen Sie nicht, Reference inMicrosoft Excel 12.0/11.0 object Libraryaufzunehmen.

using Excel = Microsoft.Office.Interop.Excel;
// Include this Namespace

Microsoft.Office.Interop.Excel.Application xlApp = null;
Excel.Workbook xlWorkbook = null;
Excel.Sheets xlSheets = null;
Excel.Worksheet xlNewSheet = null;
string worksheetName ="Sheet_Name";
object readOnly1 = false;

object isVisible = true;

object missing = System.Reflection.Missing.Value;

try
{
    xlApp = new Microsoft.Office.Interop.Excel.Application();

    if (xlApp == null)
        return;

    // Uncomment the line below if you want to see what's happening in Excel
    // xlApp.Visible = true;

    xlWorkbook = xlApp.Workbooks.Open(@"C:\Book1.xls", missing, readOnly1, missing, missing, missing, missing, missing, missing, missing, missing, isVisible, missing, missing, missing);

    xlSheets = (Excel.Sheets)xlWorkbook.Sheets;

    // The first argument below inserts the new worksheet as the first one
    xlNewSheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
    xlNewSheet.Name = worksheetName;

    xlWorkbook.Save();
    xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
    xlApp.Quit();
}
finally
{
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewSheet);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
    //xlApp = null;
}
1
Gokul

Dies ist, was ich verwendet habe, um ein zusätzliches Arbeitsblatt hinzuzufügen

Workbook workbook = null;
Worksheet worksheet = null;

workbook = app.Workbooks.Add(1);
workbook.Sheets.Add();

Worksheet additionalWorksheet = workbook.ActiveSheet;
0
Dobermaxx99

Ich hatte in VSTO ein ähnliches Problem auf Anwendungsebene, die Ausnahme HRESULT: 0x800A03EC beim Hinzufügen eines neuen Arbeitsblatts.

Der Fehlercode 0x800A03EC (oder -2146827284) bedeutet NAME_NOT_FOUND; im Mit anderen Worten, Sie haben nach etwas gefragt und Excel kann es nicht finden.

Dominic Zukiewicz @ Excel-Fehler HRESULT: 0x800A03EC beim Versuch, den Bereich mit dem Namen der Zelle abzurufen

Dann wurde mir endlich klar, dass ThisWorkbook die Ausnahme ausgelöst hat. ActiveWorkbook lief OK.

Excel.Worksheet newSheetException = Globals.ThisAddIn.Application.ThisWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);
Excel.Worksheet newSheetNoException = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);
0
Jiri Tersel

Hier sind ein paar Dinge, die ich herausgefunden habe:

  1. Sie können nicht mehr als eine Instanz desselben Objekts gleichzeitig öffnen. Wenn Sie beispielsweise ein neues Excel-Tabellenobjekt mit dem Namen xlsheet1 instanziieren, müssen Sie es freigeben, bevor Sie ein anderes Excel-Tabellenobjekt mit dem Namen xlsheet2 erstellen. Es scheint, als ob COM den Überblick über das Objekt verliert und einen Zombie-Prozess auf dem Server hinterlässt.

  2. Die Verwendung der mit Excel.workbooks verknüpften open-Methode ist auch dann schwierig zu schließen, wenn mehrere Benutzer auf dieselbe Datei zugreifen. Verwenden Sie stattdessen die Add-Methode. Sie funktioniert genauso gut, ohne die Datei zu sperren. z.B. xlBook = xlBooks.Add("C:\location\XlTemplate.xls")

  3. Platzieren Sie Ihre Garbage Collection nach dem Freigeben der COM-Objekte in einem separaten Block oder einer Methode.

0
hmm

Sie können OLEDB zum Erstellen und Bearbeiten von Excel-Dateien verwenden. Siehe diese Frage für Links und Beispiele.

0
Panos

COM ist definitiv kein guter Weg. Genauer gesagt, es ist ein Nein, wenn Sie mit der Webumgebung zu tun haben ...

Ich habe mit Erfolg folgende Open Source-Projekte verwendet:

  • ExcelPackage für OOXML-Formate (Office 2007)

  • NPOI für das .XLS-Format (Office 2003)

Schauen Sie sich diese Blogbeiträge an:

Erstellen von Excel-Tabellenkalkulationen .XLS und .XLSX in C #

NPOI mit Excel-Tabelle und dynamischem Diagramm

0