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.
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.
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.
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.
Vergessen Sie nicht, Reference in
Microsoft Excel 12.0/11.0 object Library
aufzunehmen.
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;
}
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;
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);
Hier sind ein paar Dinge, die ich herausgefunden habe:
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.
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")
Platzieren Sie Ihre Garbage Collection nach dem Freigeben der COM-Objekte in einem separaten Block oder einer Methode.
Sie können OLEDB zum Erstellen und Bearbeiten von Excel-Dateien verwenden. Siehe diese Frage für Links und Beispiele.
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 #