2012-08-28 8 views
20

Ich versuche, ein neues Arbeitsblatt zu einer Excel-Arbeitsmappe hinzuzufügen und dieses zum letzten Arbeitsblatt in dem Buch in C# Excel Interop zu machen.Excel Interop - Fügen Sie ein neues Arbeitsblatt nach allen anderen hinzu

Es scheint wirklich einfach, und ich dachte, der folgende Code würde es tun:

using System.Runtime.InteropServices; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var excel = new Excel.Application(); 

      var workbook = excel.Workbooks.Open(@"C:\test\Test.xlsx"); 
      workbook.Sheets.Add(After: workbook.Sheets.Count); 

      workbook.Save(); 
      workbook.Close(); 

      Marshal.ReleaseComObject(excel); 
     } 
    } 
} 

Schön sei es. Ich erhalte diese hilfreiche Fehler:

COMException was unhandled - Exception from HRESULT: 0x800A03EC

I this page auf Microsoft.com gefunden, die vorgeschlagen, dass ich versuchen, und fügen Sie das Blatt und dann bewegen sie so versuchte ich, dass wie unten gezeigt. Ich weiß, dass diese Webseite 95 Excel zielt aber die VBA ist immer noch da so zu verwenden, ich habe gehofft, es würde immer noch funktionieren:

using System.Runtime.InteropServices; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var excel = new Excel.Application(); 

      var workbook = excel.Workbooks.Open(@"C:\test\Test.xlsx"); 
      workbook.Sheets.Add(); 
      workbook.Sheets.Move(After: workbook.Sheets.Count); 

      workbook.Save(); 
      workbook.Close(); 

      Marshal.ReleaseComObject(excel); 
     } 
    } 
} 

ich die gleichen Fehler wie oben. Ich habe auch versucht, den Namen meines letzten Arbeitsblattes als eine Zeichenfolge wie der After Parameter in den Add und Methoden, keine Freude zu übergeben!

Das ist, was ich versucht habe, so meine Frage ist, wie füge ich ein Arbeitsblatt zu einer Excel-Arbeitsmappe und machen dies das letzte Blatt in der Arbeitsmappe mit C# Excel Interop?

Dank

+2

JMK - nicht eine Antwort auf Ihr Problem, aber vielleicht ein hilfreicher Zeiger für C# und Excel. Ich benutze die LinqToExcel-Bibliothek seit einiger Zeit und kann wirklich nicht ausdrücken, wie viel sauberer eine Erfahrung ist, die VS interop Methodik verwendet. Wenn Sie Zeit haben, schauen Sie sich an, ob es Ihren Anforderungen entspricht. https://github.com/paulyoder/LinqToExcel auch http://code.google.com/p/linqtoexcel/ –

+1

@jimtollan Danke für die Köpfe hoch, werde ich einen Punkt der Überprüfung von LinqToExcel, es sieht gut aus. Vielen Dank! – JMK

Antwort

39

bei der Dokumentation hier der Suche http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.move(v=vs.80).aspx, zeigt es an, dass die ‚nach‘ Objekt ist keine numerische Position; Es ist das Objekt, das das Blatt darstellt, nach dem Sie das Blatt positionieren möchten. Der Code sollte wohl so etwas wie (ungetestet) sein:

workbook.Sheets.Add(After: workbook.Sheets[workbook.Sheets.Count]); 
+2

Dies hat nicht als Parameter für die 'Move' Methode funktioniert, aber es hat als Parameter für die' Add' Methode funktioniert! Vielen Dank! – JMK

+0

Es wurde jetzt getestet. Das macht sehr viel Sinn. Wie Sie sagten, wird das neue Blatt nicht nach einer Zahl eingefügt, sondern nach einem Blatt, das sich an dieser nummerierten Position befindet (Basis 1 für Excel). –

6

Das die Arbeit machen soll:

wSheet.Move(Missing.Value, workbook.Sheets[workbook.Sheets.Count]); 
3

Dies ist die einzige Art und Weise, die für mich funktioniert:

xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.Add 
    (System.Reflection.Missing.Value, 
    xlWorkBook.Worksheets[xlWorkBook.Worksheets.Count], 
    System.Reflection.Missing.Value, 
    System.Reflection.Missing.Value);