c++ Excel OLE 自动化。设置整个单元格区域'at once'的值



IDE: Embarcadero XE5

我正试图提高一个"导出到excel"程序的性能(速度)。这个过程包含了太多的OLE函数调用和属性读/写调用,因此性能很差。

目前,网格(2D数组)导出到excel是通过步进网格中的每个单元格并设置其值。

我试图导出整个网格到excel单元格范围一次,但在我的尝试失败。

现在对于Embarcadero delphi用户来说,这似乎是一个微不足道的任务:

// NOTE: This obviously won't compile, just showing the process.
var
   arrData: Variant;
begin
   // Create a 2D Variant array
   arrData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
   // Fill array with values...
   // Get a range of cells, size equal to arrData dimensions...
   Range.Value := arrData;  // Done, easy.
end;

对于Embarcadero c++的用户(或者可能只是我自己),这似乎不是那么明显。

我已经设法创建和填充一个一维数组的数据,使用:VarArrayCreate, Embarcadero示例

我试图将该数组分配给一个单元格范围,如下所示:

Variant vArray;
// Create and fill vArray with data. Test case.
int bounds[2] = {0, 4};
// Creates Variant array containing 5 elements of type varVariant.
// Can set the element type to varInteger as well for this case, made no difference to the end result.
vArray = VarArrayCreate( bounds, 1, varVariant );
// Fill vArray with test data, values 0,1,2,3,4
for ( int index = 0; index < 5; index++ ) {
   VarArrayPut( vArray, index, &index, 0 ); 
}
Variant vWorkSheet; // Active excel worksheet
Variant vCells = vWorkSheet.OlePropertyGet( L"Cells" );
Variant vRange; // A excel cell-range, equal in size to my vArray's size.
Variant vRange = vCells.OlePropertyGet( L"Range", vCells.OlePropertyGet(L"Item", 1, 1), vCells.OlePropertyGet(L"Item", 5, 1) );
vRange.OlePropertySet( L"Value", vArray );  // Similar to what is done in Delphi in example above.

…导致整个excel单元格区域被vArray中的第一个值填充。

如何创建多维变量数组(在本例中为二维)?

如何使用OLE将变体数组分配给Excel单元格范围?

创建多维变量数组只需指定多个低/高边界,就像Delphi代码所示的那样:

Variant arrData = VarArrayCreate(OPENARRAY(int, (1, RowCount, 1, ColCount)), varVariant);

或:

int bounds[4] = {1, RowCount, 1, ColCount};
Variant arrData = VarArrayCreate(EXISTINGARRAY(bounds), varVariant);

然后你可以这样做:

// Fill arrData with values...
// Get a range of cells, size equal to arrData dimensions...
Variant Range = ...;
Range.OlePropertySet(L"Value", arrData);

调用VarArrayPut()时,指定一个索引数组,每个维度一个索引,以指示要将值赋值给的特定元素:

VarArrayPut( arrData, value, OPENARRAY(int, (indexDim1, indexDim2)) ); 

或:

int indexes[2] = {indexDim1, indexDim2};
VarArrayPut( arrData, value, EXISTINGARRAY(indexes) ); 

相关内容

  • 没有找到相关文章

最新更新