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?
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
Gracias. Voy a probar estas libs. –
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