c ++如何将数组导出为ex​​cel

目前我有以下代码:

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

但是上面的实现很慢..

任何想法如何以更有效的方式倒入数组?

虽然所有有关计算和可见性的浏览器都是正确的,但他们却错过了一个关键部分:您正在遍历数据,并且单独更新每个单元格。 这很慢,因为每次都需要进行通话。 最好有一个2D数组,它被分配到一个匹配的范围。

工作是这样的:定义你的二维数组设置你的范围对象的匹配大小(行数/列数)分配你的数组范围对象:range.value = 2darray完成!

这种技术在.net和C#中工作 – 我不知道如何在C ++中build立它,对不起!

那么说:与你的解决scheme相比,它会很快 – 但是,对于大文件来说,它仍然会很慢 – 使用excel库会更好。

通过应用以下技术,您可以非常显着地提高性能:

  1. 在更新突发期间禁用事件:

     pXL->EnableEvents = VARIANT_FALSE; // update burst here pXL->EnableEvents = VARIANT_TRUE; 
  2. 禁用格式化的矛盾计算:

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

AFAIK第二个选项仅适用于从版本12开始的Excel。您可以通过调用属性pXL->Version从Excel检索版本

这里有两个主要的杠杆来提高性能:

  1. 禁用计算: pXL->Calculation=-4135 (用-4105复位)

  2. 每个读取和写入单元需要一些开销。 因此,将所有数据复制到一个数组,在那里处理数据,然后一次性写回来效率更高。