gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:31:36 25 4
gpt4 key购买 nike

集成开发环境:Embarcadero XE5

我正在尝试提高“导出到 excel”程序的性能(速度)。该过程包含太多的 OLE 函数调用和属性读/写调用,因此性能不佳。

目前,通过遍历网格中的每个单元格并设置其值,将网格(二维数组)导出到 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 Example .

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

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 中的第一个值填充。

您将如何创建多维 Variant 数组(在本例中为二维)?

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

最佳答案

创建多维 Variant 数组只是指定一组以上的低/高边界的问题,就像 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) );

关于c++ Excel OLE 自动化。设置整个单元格范围的值 'at once',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22712905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com