2012-09-11 12 views
14

En mi aplicación C#, con la ayuda de Excel Interop dll (como referencia) estoy leyendo/escribiendo archivos de Excel. Si muevo este programa al sistema donde office/excel no está instalado (piense en limpiar la máquina), estoy dando el siguiente error.Cómo crear una instancia de Excel si Excel no está instalado

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Se espera el error anterior porque no hay excel en la máquina de destino.
Mi pregunta es, ¿hay alguna otra forma de usar mi programa aparte de registrar Interop DLL en la máquina de destino?

Respuesta

15

My question is, is there any other way to use my program apart from registering Interop dll on target machine?

Usted está preguntando si hay alguna manera de utilizar su programa, que utiliza interoperabilidad de Excel, cuando Excel no está instalado en el equipo que ejecuta el programa. La respuesta corta es no. La respuesta más larga es sí, si está dispuesto a refactorizar su programa para no utilizar interoperabilidad.

Puede usar el OOXml SDK provisto por Microsoft si la versión de Excel a la que apunta es de 2007 en adelante. También puede usar una biblioteca de terceros como Aspose si está dispuesto a gastar un poco de dinero.

Puede encontrar un ejemplo del uso del OOXml SDK para insertar una hoja de cálculo en un archivo de Excel en msdn.

// Given a document name, inserts a new worksheet. 
public static void InsertWorksheet(string docName) 
{ 
    // Open the document for editing. 
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
    { 
     // Add a blank WorksheetPart. 
     WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>(); 
     newWorksheetPart.Worksheet = new Worksheet(new SheetData()); 

     Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>(); 
     string relationshipId = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart); 

     // Get a unique ID for the new worksheet. 
     uint sheetId = 1; 
     if (sheets.Elements<Sheet>().Count() > 0) 
     { 
      sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1; 
     } 

     // Give the new worksheet a name. 
     string sheetName = "Sheet" + sheetId; 

     // Append the new worksheet and associate it with the workbook. 
     Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName }; 
     sheets.Append(sheet); 
    } 
} 
+1

Gracias por los detalles. Entiendo las razones para avanzar hacia OpenXML, pero lamentablemente tengo que quedarme en la interoperabilidad por otros motivos. Solo para resolver el problema, estoy instalando Excel (como requisito previo) para mi programa. – Mahender

0

De toda la investigación que hice hace un tiempo cuando tenía que interactuar con un archivo de Excel en un servidor, debe instalar Office.

12

Even Microsoft does not recommends usein Interop libraries on a server. Lo mejor es encontrar un marco alternativo para Excel. He utilizado con éxito Npoi en el pasado para ese fin.

Sé que esta no es una respuesta a su excepción. Pero, sinceramente, Interop es un camino hacia un interminable problema y mensajes de excepción crípticos.

Actualización 2017: No he utilizado NPOI desde hace un tiempo y se trasladó a todos mis proyectos EPPlus insted - biblioteca basado en OpenXML que crea archivos xlsx modernas.

+3

+1 para Npoi. He encontrado que es la mejor biblioteca gratuita para trabajar con documentos de Excel. Funciona con ambos .xls y xlsx. – burnttoast11

+2

+1 para Npoi, y "Interop es un camino hacia un problema interminable y mensajes de excepción crípticos". Sí, realmente duele – NeverHopeless

Cuestiones relacionadas