我知道要使用C ++从Excel中读取,我们可以使用GetItem(),如下代码所示:
for (i = 0; i < nbRows; i++)
{
for (j = 0; j < nbCols; j++)
{
input[i][j] = range_data->GetItem(i+1, j+1);
}
}
但如果范围很大,则需要时间。
我知道要在Excel中编写我们可以使用Value2函数,它比使用getItem()编写更快。要使用Value2函数,我们必须在将结果存储到Excel之前将结果放入safearray。 我有这段代码将结果从C ++写入Excel:
Excel::_WorksheetPtr sheet_XD = spXlBook->Worksheets->GetItem(L"XD");
VARIANT arrXD;
arrXD.vt = VT_ARRAY | VT_VARIANT;
{
SAFEARRAYBOUND sab[2];
sab[0].lLbound = 1;
sab[0].cElements = nbRows;
sab[1].lLbound = 1;
sab[1].cElements = nbCols;
arrXD.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
}
for(i = 0; i < nbRows; i++)
{
for(j = 0; j < nbCols; j++)
{
VARIANT tmpXD;
tmpXD.vt = VT_I4;
tmpXD.lVal = 0;
if (XD_best[i][j] > 0.5)
tmpXD.lVal = 1;
long indicesXD[] = {i+1, j+1};
SafeArrayPutElement(arrXD.parray, indicesXD, (void *)&tmpXD);
}
}
Excel::RangePtr range_XD = sheet_XD->GetRange(L"XD");
range_XD->Value2 = arrXD;
我认为我们可以反过来编写用于读取数据的代码(使用value2)。我尝试过使用SafeArrayGetElement,但不幸的是,我无法使用getValue从excel获取数据。
这是我使用value2从Excel读取数据的代码:
HRESULT hr;
_variant_t tcvt = rngSh->GetValue2();
if (tcvt.vt == (VT_ARRAY | VT_VARIANT))
{
SAFEARRAY * sa = tcvt.parray;
long colMax;
hr = ::SafeArrayGetUBound(sa, 1, &colMax);
long colMin;
hr = ::SafeArrayGetLBound(sa, 1, &colMin);
cout << "colMax = " << colMax << endl;
cout << "colMin = " << colMin << endl;
long index[2];
index[1] = 1;
for (long colIdx = colMin; colIdx <= colMax; colIdx++)
{
index[0] = colIdx;
VARIANT thisCell;
//thisCell.vt = VT_I8;
//thisCell.lVal = 8;
VariantInit(&thisCell);
hr = SafeArrayGetElement(sa, index, (void*)&thisCell);
if (FAILED(hr))
{
cout << "NOT OK " << endl;
}
else
{
cout << "cell value = " << thisCell.lVal << endl;
}
}
}
它的解决方案是什么? 如果您有任何解决方案可以使用C ++更快地从Excel读取数据,请欢迎使用..
答案 0 :(得分:0)
我从微软论坛(https://social.msdn.microsoft.com/Forums/vstudio/en-US/243520e2-26db-4d07-babd-34e7446b340f/reading-excel-data-using-getvalue-in-c?forum=vcgeneral)获得了解决方案。代码如下:
HRESULT hr;
_variant_t tcvt = rngSh->GetValue2();
SAFEARRAY *psa = tcvt.parray;
ULONG cElements = psa->rgsabound->cElements;
LONG lBound, uBound;
hr = SafeArrayGetLBound(psa, 1, &lBound);
hr = SafeArrayGetUBound(psa, 1, &uBound);
for (LONG x = lBound, y = 1; x <= uBound && y <= cElements;)
{
VARIANT vCell;
LONG lix[1][2];
lix[0][0] = x;
lix[0][1] = y;
VariantInit(&vCell);
hr = SafeArrayGetElement(psa, (LONG*) &lix, &vCell);
if (SUCCEEDED(hr))
{
if (vCell.vt == VT_R8)
wcout << L"Index is " << y << L", " << x << L", Cell Value is " << vCell.dblVal << endl;
else if (vCell.vt == VT_BSTR)
wcout << L"Index is " << y << L", " << x << L", Cell Value is " << vCell.bstrVal << endl;
else
wcout << L"Index is " << y << L", " << x << L", Cell is not alphanumeric" << endl;
}
VariantClear(&vCell);
x++;
if (x > uBound && y < cElements )
{
x = lBound;
y++;
}
}