在C ++中使用getvalue读取Excel数据

时间:2017-02-02 09:00:52

标签: c++ excel

我知道要使用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读取数据,请欢迎使用..

1 个答案:

答案 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++;
    }
}