2012-08-28 20 views
20

Estoy intentando agregar una nueva hoja de trabajo a un libro de Excel y convertirla en la última hoja de cálculo del libro en C# Interoperabilidad de Excel.Interoperabilidad de Excel: agregue una nueva hoja de trabajo después de todas las demás

Parece muy simple, y pensé que el código de abajo lo haría:

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

No hubo suerte. Me sale este error útil:

COMException was unhandled - Exception from HRESULT: 0x800A03EC

encontré this page en Microsoft.com, que sugirió que probar y añadir la hoja primero y luego muevo así que traté de que, como se muestra a continuación. Sé que esta página web se dirige a Excel VBA 95 pero la administración sigue allí para usar así que esperaba que aún funcionaría:

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

me sale el mismo error que el anterior. También he intentado pasar el nombre de mi última hoja de cálculo como una cadena como el parámetro After en los métodos Add y Move, ¡no me gusta!

Eso es lo que he intentado, entonces mi pregunta es ¿cómo agrego una hoja de trabajo a un libro de Excel y la hago la última hoja del libro de trabajo usando C# Excel Interop?

Gracias

+2

JMK - no una respuesta a su problema, pero quizás un puntero útil para C# y excel. He estado usando la biblioteca LinqToExcel durante bastante tiempo y realmente no puedo expresar qué tan limpia es una experiencia VS usando la metodología de interoperabilidad. Si tiene tiempo, échele un vistazo para ver si cumple con sus requisitos. https://github.com/paulyoder/LinqToExcel también http://code.google.com/p/linqtoexcel/ –

+1

@jimtollan Gracias por el aviso, haré un punto de revisar LinqToExcel, se ve bien. ¡Gracias! – JMK

Respuesta

39

En cuanto a la documentación aquí http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.move(v=vs.80).aspx, indica que el 'después' objeto no es una posición numérica; es el objeto que representa la hoja en la que desea colocar su hoja. El código debe ser probablemente algo así como (no probado):

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

Esto no funcionó como un parámetro para el método 'Move', ¡pero funcionó como un parámetro para el método' Add'! ¡Muchas gracias! – JMK

+0

Se ha probado ahora. Esto tiene mucho sentido. Como dijo, la nueva hoja no se inserta después de un número, sino más bien después de una hoja que está en esa posición numerada (base 1 para Excel). –

6

Esto debería hacer el trabajo:

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

Ésta es la única forma en que funciona para mí:

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); 
Cuestiones relacionadas