2012-07-12 89 views
58

Estoy escribiendo una aplicación que funciona con archivos de Excel. Necesito una función para eliminar una hoja. Tengo que usar un ensamblado Microsoft.Office.Interop.Excel.dll.¿Cómo se usa Microsoft.Office.Interop.Excel en una máquina sin MS Office instalado?

Está funcionando muy bien en el equipo desarrollador, pero cuando trato de desplegarlo en el servidor estoy consiguiendo un error:

Could not load file or assembly 'office, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies

entiendo que problema se produce cuando MS Office no está instalado en una máquina. El cliente no desea instalar y comprar MS Office en un servidor a ningún precio.

Instalo "Conjuntos de interoperabilidad primarios redistribuibles" en la máquina del desarrollador como se recomienda aquí: http://forums.asp.net/t/1530230.aspx/1 y vuelvo a compilar mi proyecto.

Ejemplo de código:

public bool DeleteSheet(string tableName) 
{ 
    Excel.Application app = null; 
    Excel.Workbooks wbks = null; 
    Excel._Workbook _wbk = null; 
    Excel.Sheets shs = null; 

    bool found = false; 

    try 
    { 
     app = new Excel.Application(); 
     app.Visible = false; 
     app.DisplayAlerts = false; 
     app.AlertBeforeOverwriting = false; 

     wbks = app.Workbooks; 
     _wbk = wbks.Add(xlsfile); 
     shs = _wbk.Sheets; 
     int nSheets = shs.Count; 

     for (int i = 1; i <= nSheets; i++) 
     { 
      Excel._Worksheet _iSheet = (Excel._Worksheet)shs.get_Item(i); 
      if (_iSheet.Name == tableName) 
      { 
       _iSheet.Delete(); 
       found = true; 

       Marshal.ReleaseComObject(_iSheet); 
       break; 
      } 
      Marshal.ReleaseComObject(_iSheet); 
     } 

     if (!found) 
      throw new Exception(string.Format("Table \"{0}\" was't found", tableName)); 

     _wbk.SaveAs(connect, _wbk.FileFormat, Missing.Value, Missing.Value, Missing.Value, 
     Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
     Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 
    } 
    finally 
    { 
     _wbk.Close(null, null, null); 
     wbks.Close(); 
     app.Quit(); 

     Marshal.ReleaseComObject(shs); 
     Marshal.ReleaseComObject(_wbk); 
     Marshal.ReleaseComObject(wbks); 
     Marshal.ReleaseComObject(app); 
    } 
    return true; 
} 

Una excepción

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 produce en la línea

app = new Excel.Application(); 

¿Puede cualquier persona aconsejar sobre cómo conseguir esta característica trabaja con éxito?

Respuesta

52

No puede usar Microsoft.Office.Interop.Excel sin tener ms office installed.

Sólo la búsqueda en Google para algunas bibliotecas, que permite modificar xls o xlsx:

+9

Sí - los ensamblados de interoperabilidad .NET sólo le dicen cómo llamar a las bibliotecas COM de Excel. No tienen ninguna funcionalidad.Otro popular para leer/escribir archivos .xlsx: http://closedxml.codeplex.com/ – Govert

+0

Gracias. Voy a probar estas libs. –

+2

Ocurre que ni siquiera puede _BUILD_ un proyecto que contiene referencias a ** Microsoft.Office.Core ** sin instalar también Office. Las otras referencias de ensamblado de Interop a nivel de documento parecen compilarse pero no ejecutarse. Mi trabajo ha sido eliminar las referencias explícitas de ** Microsoft.Office.Core ** y reemplazarlas con ** dynamic ** y ** var ** keywords que permiten referencias tardías DESPUÉS de que intellisense ha hecho su trabajo en el desarrollador máquina. – CZahrobsky

1

Si el "Cliente no quieren instale y compre MS Office en un servidor, no a cualquier precio ", entonces no puede usar Excel ... Pero no puedo entender el truco: se trata de una licencia básica de Office que cuesta aproximadamente 150 USD ... Y supongo que el gasto el tiempo de encontrar una alternativa costará b ¡Mucho más que esta cantidad!

+19

Usar Excel en un servidor es una práctica de almohadilla. Primero: es una vulnerabilidad indebida. En segundo lugar, es terriblemente lento, los documentos de escritura y lectura tardan años, muy bien si tiene más de un usuario ... En tercer lugar: Office no está diseñado para un uso completamente automatizado. Hay highcups que están creando messageboxes, etc. Eso es "no tan bueno" en los servidores ... –

+0

"segundo, es terriblemente lento, los documentos de escritura y lectura tardan años" - No en mi experiencia. ¿Qué sucede si los clientes desean utilizar Excel, MS Office en su totalidad o de hecho cualquier otro software a través de Thin Client? Tendrá * que * ir en un servidor en ese escenario. –

+17

Como consultor me resultaría muy embarazoso decirle al cliente que tendrían que instalar MS Office en sus servidores de CI. No se trata tanto del dinero como de la molestia y el factor WTF. Y puede que no sea solo un servidor, quizás tengan 5,10,20 servidores de CI virtuales. Entonces estamos hablando de más costos de administración y dinero que $ 150. –

2

puede crear un servicio y generar Excel en el servidor y luego permitir que los clientes descarguen Excel. cos comprar la licencia excel para 1000 personas, es mejor tener una licencia para el servidor.

espero que ayude.

+1

No se recomienda el desarrollo de la automatización de oficinas en la arquitectura del servidor cliente. – kaushalparik27

0

Busque GSpread.NET. Puede trabajar con las hojas de cálculo de Google mediante el API de Microsoft Excel. No necesita volver a escribir el código anterior con el nuevo uso de la API de Google. Sólo tiene que añadir unas pocas consecutivas:

Set objExcel = CreateObject("GSpreadCOM.Application"); 

app.MailLogon(Name, ClientIdAndSecret, ScriptId); 

Es un proyecto OpenSource y que no requiere de oficina que se instalará.

La documentación disponible aquí http://scand.com/products/gspread/index.html

+0

Como puedo ver para el código que ha publicado, debe de alguna manera iniciar sesión en "Google Systems". Entonces, la alternativa para instalar una Licencia de Office es registrarse en Google. Sé que es gratis y eso, pero ... No me gusta la idea de que mi aplicación inicie sesión en los Servicios de Google. – EAmez

Cuestiones relacionadas