Link to home
Start Free TrialLog in
Avatar of rgrguric
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:

pSheet->Cells->Item[x][1] =CompleteCompatVector[i][5];

Open in new window


This is where I tried using SysAllocString:

VARIANT VStr;
VStr = SysAllocString(CompleteCompatVector[i][5]);
pSheet->Cells->Item[x][1] = VStr;

Open in new window


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?
Avatar of rgrguric
rgrguric

ASKER

Here is the structure that I use to hold the original input data:
struct InputFormat
	{
	                     string CurrentSet;
		string SetDescription;
		string MultipleSingle;
		string Required;
		string NextSet;
		string Model;
		string Facility;
		string OutlineType;
		string FeatureCode;
		string FeatureDescription;
		string FeatureQuantity;
		string FeatureAI;
		string FeatureSL;
		string ReferenceNumber;
		string Compat;
		string CompatQuantity;
		string LineType;
	};

Open in new window

Avatar of sarabande
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:

 
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;

Open in new window


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

 
Thanks for the explanation!

I tried the above and am getting an error on line:

VStr = SysAllocString(pwcs);

Open in new window


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(492): could be 'tagVARIANT &tagVARIANT::operator =(const tagVARIANT &)'
1>          while trying to match the argument list '(VARIANT, BSTR)'
ASKER CERTIFIED SOLUTION
Avatar of jkr
jkr
Flag of Germany image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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