2011-10-27 14 views
6

he estado escribiendo una aplicación en C# que crea propiedades del documento personalizado en una hoja de cálculo de Excel, tengo una función para este que tiene en un objeto de libro ...obtener el objeto libro actual en C#

Sin embargo, en realidad, obtener el objeto Libro actual resulta ser bastante molesto, estoy usando ExcelDNA para agregar funcionalidad, sin embargo, parece que no puedo pasarle a mi función un objeto COM de Libro de trabajo válido.

Respuesta

14

Esta es la manera que soy actualmente haciendo que parece que funciona muy bien

using Excel = Microsoft.Office.Interop.Excel;  

a continuación presentamos lo mejor libro activo

 //Gets Excel and gets Activeworkbook and worksheet 
     Excel.Application oXL; 
     Excel.Workbook oWB; 
     Excel.Worksheet oSheet; 
     oXL = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); 
     oXL.Visible = true; 
     oWB = (Excel.Workbook)oXL.ActiveWorkbook; 

     docProps = oWB.CustomDocumentProperties 

Entonces me gustaría probar lo que tienes y ver cómo funciona

Esperanza esto ayuda

+0

EXCELLENT. Usted señor es mi héroe, esto ha solucionado un problema bastante molesto que estaba teniendo, necesitaba un par de ojos nuevos, supongo! Muy apreciado. –

+0

Sí, no es problema. He estado haciendo bastante con Excel si tiene alguna pregunta, hágamelo saber. ¡¡¡¡Espero que esto te ayude!!!! –

+3

Desde Excel-DNA, querrá llamar a ExcelDnaUtil.Application para asegurarse de obtener el objeto Aplicación para el proceso de Excel en el que se está ejecutando, en lugar de la última instancia activada de Excel que devolverá Marshal.GetActiveObject. – Govert

14

Si necesita encontrar el ActiveWorkbook con C#, si está utilizando Oficina de interoperabilidad, puede intentar este tipo de código:

(Workbook)Globals.ThisAddIn.Application.ActiveWorkbook; 

[Source]

+0

@AdamNumberFive, sí lo hace. Sin embargo, puede hacer casi lo mismo con el objeto Excel COM utilizando la instancia de la aplicación Excel que tiene y mirando la propiedad ActiveWorkbook. –

+1

Esto funciona cada vez, a diferencia de 'Marshal.GetActiveObject (" Excel.Application ");' que en algún momento desencadenaría nuevas instancias de Excel –

7

Como se explicó anteriormente @Govert en su comentario:

using Excel = Microsoft.Office.Interop.Excel; 
using ExcelDna.Integration; 

// Get the correct application instance 
Excel.Application xlapp = (Excel.Application)ExcelDnaUtil.Application; 

// Get active workbook 
Excel.Workbook wbook = xlapp.ActiveWorkbook; 
+0

Obtengo NullReference para xlapp. ¿Ha cambiado algo? ¿Se supone que esto todavía funciona? – regmi

Cuestiones relacionadas