Hi everybody,
I have a code that Stuart sent me. it reads some numbers from a file,
makes a bar chart
based on them and saves the chart in a word document. my problem is it
asks the user to save the file in his/her chosen path. whereas I need
it to save the document in a word document whose name is provided in a
txt file. I have tried to use saveas() instead of save() but couldn't
set the
variables appropiately because they must be of type VARIANT * which I
haven't come across with before. So, my desirable file was not created.

could you please help me solve this problem? the code is as follows and

I am using visual studio 6. vc++.

//#include "stdafx.h"
#include <afx.h>
#include "atlbase.h"


CComModule _Module;


#include "atlcom.h"
#include "atlimpl.cpp"
#include "atlctl.h"
#include "atlctl.cpp"
#include "comdef.h"


#include <fstream.h>


// In order to be able to include the type libraries from MS Word we
have


// to undefine the ExitWindows macro from winuser.h since this macro
will


// clash with the ExitWindows method of the Tasks interface.
// See Q148223 at MSDN.
#undef ExitWindows


#import "C:\Program Files\Common Files\Microsoft
Shared\OFFICE10\MSO.DLL"


#import "C:\Program Files\Common Files\Microsoft
Shared\VBA\VBA6\VBE6EXT.OLB"


#import "C:\Program Files\Microsoft Office\Office\msword9.olb"
#import "C:\Program Files\Microsoft Office\Office\graph9.olb"


int main(int argc, char* argv[])
{
// Since we want to use COM objects, we must initialize the COM
//sub-system.
VERIFY (SUCCEEDED (CoInitialize (NULL)));


// Retrieve the CLSID of the MS Word application.
CLSID clsidWordApplication;
HRESULT hr = CLSIDFromProgID (L"Word.Application",
&clsidWordApplication);
_ASSERT(SUCCEEDED(hr));


if (!SUCCEEDED(hr))
return 0;


// We introduce this code block, so that all smart pointers get
//destroyed before
// this block is left. If we didn't do this, some of our smart
//pointers would still
// be alive when we call CoUnitialize at the end of main, which would



//cause memory
// access violations.
{
Word::_ApplicationPtr spWordApplication;
try
{
// Create the Word application object. If Word isn't running
//already, this
// will launch Word as background process.
VERIFY (SUCCEEDED (spWordApplication.CreateInstance
(clsidWordApplication, NULL, CLSCTX_SERVER)));
if (!(bool) spWordApplication)
throw _com_error (E_FAIL);


// Retrieve the documents collection from the Word application.
//This collection contains
// all documents that are open at the moment. We need this
//collection in order to
// add a new document to it (this means we create a new
//document).
Word::DocumentsPtr spDocuments =
spWordApplication->GetDocuments();
if (!(bool) spDocuments)
throw _com_error (E_FAIL);
Word::_DocumentPtr spNewDocument = spDocuments->Add ();
if (!(bool) spNewDocument)
throw _com_error (E_FAIL);


// We add a new chart to the document. To be able to do this we
//must retrieve the
// collection of so called 'inline shapes'. Inline shapes are
//basically such things
// like pictures, charts, or any other linked objects.


Word::InlineShapesPtr spInlineShapes =
spNewDocument->GetInlineShapes ();
if (!(bool) spInlineShapes)
throw _com_error (E_FAIL);


// Retrieve the CLSID of the MS Chart object.
CComBSTR strClassNameChart (L"MSGraph.Chart");
VARIANT Temp;
Temp.vt = VT_BSTR;
Temp.bstrVal = strClassNameChart.Detach ();
VARIANT ChartObjectShouldBeLinkedToAnExternalFileVARIANT;
ChartObjectShouldBeLinkedToAnExternalFileVARIANT.vt = VT_BOOL;
ChartObjectShouldBeLinkedToAnExternalFileVARIANT.boolVal =
VARIANT_FALSE;
Word::InlineShapePtr spNewInlineShape =
spInlineShapes->AddOLEObject (&Temp, &vtMissing,
&ChartObjectShouldBeLinkedToAnExternalFileVARIANT);


// We want to access the new inline shape via the correct
//interface.
Graph::ChartPtr spChart = spNewInlineShape->OLEFormat->Object;
if (!(bool) spChart)
throw _com_error (E_FAIL);


// Configure the chart.
spChart->ChartType = Graph::xl3DColumnClustered;
spChart->HasLegend = VARIANT_TRUE;
spChart->HasTitle = VARIANT_TRUE;
spChart->ChartTitle->Text = _bstr_t (L"translator's sensitivity
to sentence lengthes");
spChart->Width = 600.00;


// spChart->AutoScaling= VARIANT_TRUE;


// Create a data sheet that contains the data that will be shown
//in the chart.
// This is the place where you have to provide your own data. For



//this example I
// will use random generated data to fill the data sheet.
Graph::DataSheetPtr spDataSheet =
spChart->Application->DataSheet;
if (!(bool) spDataSheet)
throw _com_error (E_FAIL);


spDataSheet->Cells->Clear ();


// Set the column and row names.
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)1), _variant_t ("translation NIST score"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)2), _variant_t ("0-20"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)3), _variant_t ("20-25"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t

((BYTE)4), _variant_t ("25-30"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)5), _variant_t ("30-35"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t

((BYTE)6), _variant_t ("35+"));


// Fill the cells with some example data.
/*spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)2), _variant_t ((long)10));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)3), _variant_t
((BYTE)2), _variant_t ((long)20));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)3), _variant_t ((long)30));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)3), _variant_t
((BYTE)3), _variant_t ((long)40));*/


int x[100];
ifstream inf("c:\\interfile.txt");


for (int i=0; i<5; i++ )


inf>>x[i];
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t

((BYTE)2), _variant_t ((long)x[0]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t

((BYTE)3), _variant_t ((long)x[1]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t

((BYTE)4), _variant_t ((long)x[2]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t

((BYTE)5), _variant_t ((long)x[3]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t

((BYTE)6), _variant_t ((long)x[4]));


spChart->Application->Update ();
spChart->Application->Quit ();


spNewDocument->Save();
spWordApplication->Quit ();


}
catch (...)
{
// Close the applications, if they are running.
if ((bool) spWordApplication)
spWordApplication->Quit ();
}
}


CoUninitialize();
printf ("Finished!\n");
return 0;

Re: saving a word document in a runtime path and in a special path by Alex

Alex
Wed Sep 27 10:20:43 CDT 2006

golnar wrote:
> I have a code that Stuart sent me. it reads some numbers from a file,
> makes a bar chart
> based on them and saves the chart in a word document. my problem is it
> asks the user to save the file in his/her chosen path. whereas I need
> it to save the document in a word document whose name is provided in a
> txt file. I have tried to use saveas() instead of save() but couldn't
> set the
> variables appropiately because they must be of type VARIANT * which I
> haven't come across with before. So, my desirable file was not created.
>
> could you please help me solve this problem? the code is as follows and
>
> I am using visual studio 6. vc++.
>
> [...]
> spNewDocument->Save();

You've been answered already to call SaveAs instead of Save.
Since you're using ATL you have CComVariant class (#include
<atlcomcli.h>). Just create the instance and pass it as
parameter for SaveAs:

CComVariant varPath = _T("C:\\MyFile.doc");
spNewDocument->SaveAs(&varPath);

HTH
Alex

Re: saving a word document in a runtime path and in a special path by golnar

golnar
Wed Sep 27 23:23:27 CDT 2006

I don't know how to thank you. it really worked.Thank you,thank you a
lot :)
Alex Blekhman wrote:
> golnar wrote:
> > I have a code that Stuart sent me. it reads some numbers from a file,
> > makes a bar chart
> > based on them and saves the chart in a word document. my problem is it
> > asks the user to save the file in his/her chosen path. whereas I need
> > it to save the document in a word document whose name is provided in a
> > txt file. I have tried to use saveas() instead of save() but couldn't
> > set the
> > variables appropiately because they must be of type VARIANT * which I
> > haven't come across with before. So, my desirable file was not created.
> >
> > could you please help me solve this problem? the code is as follows and
> >
> > I am using visual studio 6. vc++.
> >
> > [...]
> > spNewDocument->Save();
>
> You've been answered already to call SaveAs instead of Save.
> Since you're using ATL you have CComVariant class (#include
> <atlcomcli.h>). Just create the instance and pass it as
> parameter for SaveAs:
>
> CComVariant varPath = _T("C:\\MyFile.doc");
> spNewDocument->SaveAs(&varPath);
>
> HTH
> Alex