Excel Interop - Efficacité et performance

Je me demandais ce que je pourrais faire pour améliorer les performances de l’automatisation Excel, car cela peut être assez lent si vous avez beaucoup de choses en cours dans la feuille de calcul…

Voici quelques pistes que j’ai trouvées moi-même :

ExcelApp.ScreenUpdating = false – désactiver le rafraîchissement de l’écran

ExcelApp.Calculation = Excel.XlCalculation.xlCalculationManual – désactiver le moteur de calcul pour qu’Excel ne recalcule pas automatiquement lorsqu’une valeur de cellule change (réactivez-le une fois terminé)

Réduire les appels à Worksheet.Cells.Item(row, col) et Worksheet.Range – je devais interroger des centaines de cellules pour trouver celle dont j’avais besoin. La mise en cache des emplacements de cellules a réduit le temps d’exécution d’environ 40 à environ 5 secondes.

Quel type d’appels interop ont un impact lourd sur les performances et devraient être évités ? Que peut-on faire d’autre pour éviter les traitements inutiles ?

Lorsque vous utilisez C# ou VB.Net pour obtenir ou définir une plage, déterminez la taille totale de la plage, puis obtenez un grand tableau d’objets bidimensionnel…

//get values
object[,] objectArray = shtName.get_Range("A1:Z100").Value2;
iFace = Convert.ToInt32(objectArray[1,1]);

//set values
object[,] objectArray = new object[3,1] {{"A"}{"B"}{"C"}};
rngName.Value2 = objectArray;

Notez qu’il est important de savoir quel type de données Excel stocke (texte ou nombres) car il ne fera pas automatiquement la conversion pour vous lorsque vous reconvertissez le type depuis le tableau d’objets. Ajoutez des tests si nécessaire pour valider les données si vous ne pouvez pas connaître à l’avance le type de données.