Solved

Visual Studio 2010 C++ Converting To VARIANT To Pass To Excel

Posted on 2011-03-23
5
1,013 Views
Last Modified: 2012-05-11
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?
0
Comment
Question by:rgrguric
  • 2
  • 2
5 Comments
 

Author Comment

by:rgrguric
ID: 35198320
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

0
 
LVL 32

Expert Comment

by:sarabande
ID: 35199080
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

 
0
 

Author Comment

by:rgrguric
ID: 35199184
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)'
0
 
LVL 86

Accepted Solution

by:
jkr earned 500 total points
ID: 35199215
You should be better off using the COM support classes, in this case '_variant_t' (http://msdn.microsoft.com/en-us/library/x295h94e%28VS.80%29.aspx) - they will spare you from most of the work. E.g.
#include <comdef.h>

// ...

_variant_t v(CompleteCompatVector[i][5].c_str());

pSheet->Cells->Item[x][1] = v.Detach(); // no 'SysFreeString()' etc. needed.

Open in new window

0
 
LVL 32

Expert Comment

by:sarabande
ID: 35199292
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
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now