2009-10-13 11 views
0

Mon table.Rows.Count = 8000.Work sur C# VS05Accélérez db 2 Code Excel en diminuant le temps d'exportation

  DataSet ds = null; 
      DataTable dtTable = null; 

      ds = oBOGeneralReport.GetsBoardExcelPreview(_oGeneralReport);//.GetsBoardPreview(_oGeneralReport); 

      if (ds == null) return; 
      if (ds.Tables.Count > 0) dtTable = ds.Tables[0]; 
      if (dtTable == null) return; 

      string connectionString = null; 
      string sql = null; 
      string data = null; 
      int i = 0; 
      int j = 0; 

      Excel.Application xlApp; 
      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); 

      int nRow = 1; 
      int p = 0; 
      int k = 0; 
      string sFileName = null; 
      for (k = 0; k < ds.Tables[0].Columns.Count; k++) 
      { 
       xlWorkSheet.Cells[nRow, p + 1] = ds.Tables[0].Columns[k].ColumnName; 
       p++;     
      } 

      for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) 
      { 
       for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) 
       { 
        data = ds.Tables[0].Rows[i].ItemArray[j].ToString(); 
        xlWorkSheet.Cells[i + 2, j + 1] = data; 
       } 
      } 

      SaveFileDialog oDialog = new SaveFileDialog(); 
      oDialog.Filter = "Excel files | *.xls"; 
      if (oDialog.ShowDialog() == DialogResult.OK) 
      { 
       sFileName = oDialog.FileName; 
      } 

      if (sFileName != null) 
      { 
       xlWorkBook.SaveAs(sFileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
       xlWorkBook.Close(true, misValue, misValue); 
       xlApp.Quit(); 
       MessageBox.Show("Report saved with file: " + sFileName, "To Excel", MessageBoxButtons.OK, MessageBoxIcon.Information); 


      } 
      else 
      { 
       MessageBox.Show("Cannot export to excel...", "Can't export", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 

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

Comment diminuer le temps d'exportation?

Répondre

2

créé un classeur 8000 lignes par 10 colonnes (vous n'avez pas dit combien de colonnes) en 0.039 secondes sur mon Intel QX6850 overclocké de presque 2 ans.

Le code que j'ai exécuté est ci-dessous. Vous pouvez télécharger l'essai gratuit here si vous voulez l'essayer vous-même.

Clause de non-responsabilité: Je suis propriétaire de SpreadsheetGear LLC.

using System; 
using System.Diagnostics; 
using SpreadsheetGear; 
using SpreadsheetGear.Advanced.Cells; 

namespace WriteRows 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // "Warm up" the code. 
      WriteRows(100, 10, false); 
      // Do the test. 
      WriteRows(8000, 10, false); 
     } 

     static void WriteRows(int rows, int cols, bool openXML) 
     { 
      Stopwatch timer = Stopwatch.StartNew(); 
      IWorkbook workbook = Factory.GetWorkbook(); 
      IWorksheet worksheet = workbook.Worksheets[0]; 
      IValues values = (IValues)worksheet; 
      for (int row = 0; row < rows; row++) 
      { 
       values.SetText(row, 0, "Row " + (row + 1)); 
       for (int col = 1; col < cols; col++) 
        values.SetNumber(row, col, row * cols + col); 
      } 
      string filename = @"c:\tmp\WriteRows" + (openXML ? ".xlsx" : ".xls"); 
      FileFormat fileFormat = openXML ? FileFormat.OpenXMLWorkbook : FileFormat.Excel8; 
      workbook.SaveAs(filename, fileFormat); 
      Console.WriteLine("Created {0} with {1}x{2} rows/cols in {3} seconds", filename, rows, cols, timer.Elapsed.TotalSeconds); 
     } 
    } 
} 
1

SpreadsheetGear.NET serait ma solution preferred aussi, mais en supposant que vous n'avez pas l'argent pour concéder sous licence, votre plus gros problème de vitesse est le nombre de commandes que vous envoyez vers Excel - avec Excel OLE l'automatisation de l'overhead de chaque commande est souvent supérieure à l'exécution réelle. Ecrire aux cellules est le cas le plus flagrant. Pour accélérer l'écriture dans les cellules, préparez vos données sous forme de tableau, puis écrivez la totalité de la plage en une seule fois (au lieu d'attribuer une valeur à une cellule, vous pouvez affecter une plage à une plage). Vous remarquerez une énorme augmentation de la vitesse avec cette seule étape simple. Comme vous lisez une table ADO, vous pouvez également consulter la commande CopyFromRecordset, qui est une méthode d'un objet range (non disponible dans les anciennes versions de l'interface d'automatisation Excel). Cela vous permet d'envoyer le contenu entier d'un jeu d'enregistrements à une plage de cellules en une seule fois, très rapidement.

xlWorkSheet.Range("A1").CopyFromRecordset ds 

(Ce prescrive ne soit pas 100% correct, bien longtemps que je l'ai fait l'automatisation VB et Excel ensemble)

1

J'ai eu des problèmes similaires il y a quelques mois, et j'abandonnèrent à partir d'Excel ...

Je vous recommande d'utiliser Excel Jetcell .NET component, il a une version gratuite avec quelques limitations de mise en forme. Il est beaucoup plus rapide, et très facile à utiliser ... et le client n'a pas besoin d'avoir installé Office ... Vous pouvez télécharger ce composant sur:

http://www.devtriogroup.com/ExcelJetcell

Questions connexes