2012-08-28 11 views
20

Sto tentando di aggiungere un nuovo foglio di lavoro a una cartella di lavoro di Excel e rendere questo l'ultimo foglio di lavoro nel libro in C# Interop di Excel.Interoperabilità di Excel - Aggiungere un nuovo foglio dopo tutti gli altri

Sembra davvero semplice, e ho pensato che il codice qui sotto lo farebbe:

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

Niente da fare. Ottengo questo errore utile:

COMException was unhandled - Exception from HRESULT: 0x800A03EC

ho trovato this page su Microsoft.com, che mi suggerì di provare e aggiungi il foglio e poi spostarlo in modo che ho provato come illustrato di seguito. So che il sito si rivolge a Excel 95, ma il VBA è ancora lì da usare quindi speravo che sarebbe ancora funzionare:

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

ottengo lo stesso errore come sopra. Ho anche provato a passare il nome del mio ultimo foglio di lavoro come una stringa come il parametro After in entrambi i metodi Add e Move, nessuna gioia!

Questo è quello che ho provato, quindi la mia domanda è come posso aggiungere un foglio di lavoro a una cartella di lavoro di Excel e rendere questo l'ultimo foglio della cartella di lavoro utilizzando C# Interop di Excel?

Grazie

+2

JMK - non una risposta al tuo problema ma forse un utile puntatore per C# ed excel. Ho usato la libreria LinqToExcel per un bel po 'di tempo e davvero non posso esprimere quanto sia più pulita un'esperienza VS utilizzando la metodologia di interoperabilità. Se hai tempo, dai un'occhiata per vedere se è adatto alle tue esigenze. https://github.com/paulyoder/LinqToExcel anche http://code.google.com/p/linqtoexcel/ –

+1

@jimtollan Grazie per l'attenzione, farò il punto su LinqToExcel, sembra buono. Grazie! – JMK

risposta

39

Guardando la documentazione qui http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.move(v=vs.80).aspx, esso indica che il 'dopo' oggetto non è una posizione numerica; è l'oggetto che rappresenta il foglio che vuoi posizionare dopo il foglio. Il codice dovrebbe probabilmente essere qualcosa di simile (non testata):

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

Questo non ha funzionato come parametro per il metodo 'Move', ma ha funzionato come parametro per il metodo' Add'! Grazie mille! – JMK

+0

È testato ora. Questo ha molto senso. Come hai detto tu, il nuovo foglio non viene inserito dopo un numero, ma piuttosto dopo un foglio che si trova in quella posizione numerata (base 1 per Excel). –

6

Questo dovrebbe fare il lavoro:

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

Questo è l'unico modo che funziona per me:

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); 
Problemi correlati