rgrguric
asked on
Visual Studio 2010 C++ Converting To VARIANT To Pass To Excel
I have a vector that I need to convert the values to VARIANT so I can pass to Excel. I've looked on the internet and found various things, none have worked (probably because I really don't understnad how to use them correctly). The latest I've tried was using SysAllocString(). Here is what I am doing... I open an input file, read data into a structure and then place into a vector for manipulation so I don't mess up the original data in the structure. I then manipulate the data in the vector a little bit and then spit it out in a .CSV file. That part works. Instead of a .CSV file I would like to move the contents of the vector to cells in an Excel Spreadsheet. I can open Excel and populate cells however I keep getting an error message saying "error C2660: 'Excel::Range::GetItem' : function does not take 0 arguments" when I try to put the contents of the vector into a cell:
This is where I tried using SysAllocString:
That is when I get the following error:
'SysAllocString' : cannot convert parameter 1 from 'std::basic_string<_Elem,_ Traits,_Ax >' to 'const OLECHAR *'
I cannot find much documentation on this so that is why I am posting here. Is there a better way to handle converting to a VARIANT, am I using an incorrect function and/or is my code just all honked up?
pSheet->Cells->Item[x][1] =CompleteCompatVector[i][5];
This is where I tried using SysAllocString:
VARIANT VStr;
VStr = SysAllocString(CompleteCompatVector[i][5]);
pSheet->Cells->Item[x][1] = VStr;
That is when I get the following error:
'SysAllocString' : cannot convert parameter 1 from 'std::basic_string<_Elem,_
I cannot find much documentation on this so that is why I am posting here. Is there a better way to handle converting to a VARIANT, am I using an incorrect function and/or is my code just all honked up?
the const OLECHAR* is a const WCHAR* what is a const wchar_t* (or LPCWSTR). that means it is a pointer to const wide char array.
the std::string is a basic_string<char> what is a class object which you can't simply assign to a OLECHAR*. but std::string has a function c_str which returns a const char *.
so we need to turn a const char * to a wchar_t * what can be made by mbstowcs function:
i know there are also macros A2W or similar that do the conversion but don't know whether they were available in your environment.
Sara
the std::string is a basic_string<char> what is a class object which you can't simply assign to a OLECHAR*. but std::string has a function c_str which returns a const char *.
so we need to turn a const char * to a wchar_t * what can be made by mbstowcs function:
const char * pcs = CompleteCompatVector[i][5].c_str();
size_t len = CompleteCompatVector[i][5].size();
wchar_t * pwcs = new wchar_t[len +1];
mbstowcs(pwcs, pcs, len);
VARIANT VStr;
VStr = SysAllocString(pwcs);
pSheet->Cells->Item[x][1] = VStr;
delete [] pwcs;
i know there are also macros A2W or similar that do the conversion but don't know whether they were available in your environment.
Sara
ASKER
Thanks for the explanation!
I tried the above and am getting an error on line:
Error:
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'BSTR' (or there is no acceptable conversion)
1> c:\program files\microsoft sdks\windows\v7.0a\include \oaidl.h(4 92): could be 'tagVARIANT &tagVARIANT::operator =(const tagVARIANT &)'
1> while trying to match the argument list '(VARIANT, BSTR)'
I tried the above and am getting an error on line:
VStr = SysAllocString(pwcs);
Error:
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'BSTR' (or there is no acceptable conversion)
1> c:\program files\microsoft sdks\windows\v7.0a\include
1> while trying to match the argument list '(VARIANT, BSTR)'
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
now the SysAllocString is happy with the pwcs but the VARIANT doesn't accept a right-hand BSTR what is the return of SysAllocString.
you better go with the solution jkr made and use the _variant_t what is a wrapper class around the VARIANT type.
Sara
you better go with the solution jkr made and use the _variant_t what is a wrapper class around the VARIANT type.
Sara
ASKER
Open in new window