Je développe une application qui travaille avec des fichiers Excel.
J’ai besoin d’une fonctionnalité pour supprimer une feuille.
Je dois utiliser l’assembly Microsoft.Office.Interop.Excel.dll.
Cela fonctionne parfaitement sur la machine de développement, mais lorsque j’essaie de la déployer sur le serveur, j’obtiens une erreur :
Could not load file or assembly ‘office, Version=14.0.0.0,
Culture=neutral, PublicKeyToken=71e9bce111e9429c’ or one of its
dependencies
Je comprends que le problème survient lorsque MS Office n’est pas installé sur la machine.
Le client ne veut en aucun cas installer et acheter MS Office sur un serveur.
J’ai installé les « Redistributable Primary Interop Assemblies » sur la machine de développement comme conseillé ici : http://forums.asp.net/t/1530230.aspx/1
et j’ai recompilé mon projet.
Exemple de code :
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;
}
L’exception
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)).
survient à la ligne
app = new Excel.Application();
Quelqu’un peut-il conseiller sur la manière de faire fonctionner cette fonctionnalité correctement ?
Source : [Stack Overflow](Developer technologies - Microsoft Q&A](Developer technologies - Microsoft Q&A)