49 votes

Microsoft.Office.Interop.Excel vraiment lent

J'exporte une matrice 1200 X 800 (indexMatrix) vers un fichier excel en utilisant le standard Microsoft.Office.Interop.Excel. L'application fonctionne, juste qu'elle est vraiment très très lente (même pour la matrice 100 x 100). J'exporte également dans un fichier texte via un TextWriter et cela fonctionne presque instantanément. Existe-t-il un moyen d'exporter plus rapidement vers le fichier Excel ?

Voici mon code :

         Excel.Application xlApp=new Excel.Application();
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        //xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        for (int i = 0; i < 800; i++)   //h
            for (int j = 0; j < 1200; j++)
                xlWorkSheet.Cells[i+1,j+1] =indexMatrix[i][j];


        xlWorkBook.SaveAs("C:\\a.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);

        MessageBox.Show("Excel file created , you can find the file c:\\csharp-Excel.xls");

17voto

Yuliy Points 8854

L'interopérabilité Excel ne sera jamais rapide. En gros, vous contrôlez à distance une instance de l'application Excel. Vous pourriez avoir plus de succès en créant un fichier CSV, puis en utilisant Excel Interop pour le convertir en un fichier .xls ou .xlsx

13voto

MIKE Points 609

J'ai eu des problèmes similaires lors de la lecture d'un fichier Excel extrêmement volumineux et cela a pris plus de 2 heures en utilisant l'interopérabilité.

J'ai essayé d'utiliser ClosedXml et le processus a pris moins de 10 secondes. ClosedXml

 // To loop 
Sheet.Row(y).Cell(x).Value

Gardez également à l'esprit que l'interopérabilité ne fonctionnera sur votre serveur que si Excel est installé. ClosedXml n'a pas besoin d'Excel installé.

7voto

Paul Roberts Points 81

Désactiver ScreenUpdating avant d'écrire des données, Application.ScreenUpdating = FALSE puis activer à la fin du code = TRUE

2voto

drweb86 Points 1340

Utilisez Value2 pour le rendre rapide ; Afficher Excel avant de remplir les données

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X