2014-03-28 50 views
0

IDE:Embarcadero XE5C++ Excel OLE自動化。設置整個單元格區域的值'一次'

我正在嘗試改進'export to excel'過程的性能(速度)。 該過程包含太多的OLE函數調用和屬性讀/寫調用,因此性能較差。

目前,網格(二維數組)通過逐步遍歷網格中的每個單元格並設置其值,導出爲ex​​cel。

我想將整個網格一次導出到excel單元格範圍內,但是我的嘗試失敗了。

現在對於Embarcadero的德爾福用戶,這似乎是一個簡單的任務:但是

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

對於英巴卡迪諾C++ - 用戶(或者只是我自己),它似乎並沒有被所有的明顯。

我已經設法使用數據創建和填充一維數組,使用: VarArrayCreateEmbarcadero 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單元格範圍?

+0

請出示創建'vArray'的C++代碼。 –

+0

更新了C++代碼段以顯示更多細節。 – HvS

回答

3

創建多維Variant數組是簡單地指定超過1組低/高界的問題,就像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(),你用上ecify指標陣列,每個維度,以表明你想要的值分配給特定的元素:

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

或者:

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

完美,謝謝雷米! – HvS

相關問題