4

現時点では、次のコードがあります。

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;
}

しかし、上記の実装はたまたま非常に遅い..

より効率的な方法で配列を注ぐ方法はありますか?

4

3 に答える 3

2

次の手法を適用することで、パフォーマンスを大幅に向上させることができます。

  1. 更新バースト中のイベントを無効にします。

    pXL->EnableEvents = VARIANT_FALSE;
    // update burst here
    pXL->EnableEvents = VARIANT_TRUE;
    
  2. フォーマット条件の計算を無効にします。

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

私の知る限り、2 番目のオプションは、バージョン 12 以降の Excel でのみ機能します。プロパティを呼び出して、Excel からバージョンを取得できます。pXL->Version

于 2013-02-18T13:28:20.437 に答える
2

計算と可視性に関するすべての回答は正しいですが、重要な部分が欠けています。データを繰り返し処理し、すべてのセルを個別に更新しています。毎回 com コールを実行する必要があるため、これは低速です。一致する範囲に割り当てられる単一の 2D 配列を使用することをお勧めします。

次のように動作します: 2D 配列を定義します 範囲オブジェクトを一致するサイズ (行数 / 列数) に設定します 配列を範囲オブジェクトに割り当てます: range.value=2darray 完了!

この手法は .net と c# で機能します。C++ でビルドする方法がわかりません。申し訳ありません。

つまり、あなたのソリューションと比較して高速になりますが、特に大きなファイルの場合はまだ遅くなります.Excelライブラリを使用することをお勧めします.

于 2013-02-18T14:13:01.307 に答える
1

ここでは、パフォーマンスを向上させるための 2 つの主な手段があります。

  1. 計算を無効にする: pXL->Calculation=-4135(および -4105 でリセット)

  2. セルへの読み取りと書き込みのたびに、いくらかのオーバーヘッドがかかります。したがって、すべてのデータを配列にコピーし、そこでデータを処理してから、一気に書き戻す方がはるかに効率的です。

于 2013-02-18T13:27:34.400 に答える