2013-02-18 4 views
4

Au moment où j'ai le code suivant:C++ comment exporter un tableau pour exceller

int ExportToExcel(short *data, int nof_rows, int nof_cols) 
{ 
     HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); 
     if (FAILED(hr)) 
     { 
      cout << "Failed to initialize COM library. Error code = 0x" << hex << hr << endl; 
      return hr; 
     } 

     Excel::_ApplicationPtr pXL; 
     if (FAILED(pXL.CreateInstance("Excel.Application"))) 
     { 
      cout << "Failed to initialize Excel::_Application!" << endl; 
      return -1; 
     } 

     Excel::_WorkbookPtr workbook = pXL->Workbooks->Add(Excel::xlWorksheet); 
     Excel::_WorksheetPtr pSheet= pXL->ActiveSheet; 
     pSheet->Name = "arr_1"; 

     Excel::RangePtr pRange = pSheet->Cells; 
     for(int i=1; i<=nof_rows; i++) 
      for(int j=1;j<=nof_cols; j++) 
       pRange->Item[i][j] = *data++; 

     pXL->Visible=true; 

     return 0; 
} 

Mais la mise en œuvre ci-dessus se trouve être très lent ..

Toute idée comment verser le tableau dans un moyen plus efficace?

Répondre

1

Il y a deux leviers principaux pour améliorer la performance ici:

  1. calcul Désactiver: pXL->Calculation=-4135 (et remis à zéro avec -4105)

  2. Chaque lecture et l'écriture aux cellules prennent certains frais généraux. Il est donc beaucoup plus efficace de copier toutes les données dans un tableau, d'y traiter les données et de les réécrire en une seule fois.

2

Vous pouvez améliorer les performances de manière très significative en appliquant les techniques suivantes:

  1. événements Désactiver lors de rafale de mise à jour:

    pXL->EnableEvents = VARIANT_FALSE; 
    // update burst here 
    pXL->EnableEvents = VARIANT_TRUE; 
    
  2. Format calcul des condictions Désactiver:

    sheet_->EnableFormatConditionsCalculation = VARIANT_FALSE; 
    // update burst here 
    sheet_->EnableFormatConditionsCalculation = VARIANT_TRUE; 
    

AFAIK la deuxième option ne fonctionne que pour Excel à partir de la version 12. Vous pouvez récupérer la version d'Excel en appelant la propriété pXL->Version

2

Alors que tous les anwsers sur le calcul et visibillity sont corrects, ils manquent un élément essentiel: vous itérez à travers vos données et que de mettre à jour chaque cellule séparément. C'est lent, car chaque fois qu'un appel de com doit être fait. Il est préférable d'avoir un seul tableau 2D, qui est assigné à une plage correspondante.

qui fonctionne comme ceci: définissent votre tableau 2d définir votre objet de plage à une taille correspondant (lignes/nombre de CLO) affecter votre tableau à l'objet de la plage: range.value = 2darray fait!

Cette technique fonctionne dans .net et C# - je ne sais pas comment le construire en C++, désolé! Cela dit: par rapport à votre solution, il sera rapide - mais, surtout pour les gros fichiers, il sera encore lent - mieux vaut utiliser une bibliothèque Excel.

Questions connexes