OVH Cloud OVH Cloud

Exel automation Visual c++ SaveAsText.

14 réponses
Avatar
mickeydisn
Bonjour a tous.


Je suis entrin de faire un petit programme qui doit enregister mes
fichier exel en fichier txt.

J'ai reussi a trouver pour word mais pour exel je bloc .

Voila un peut ce que je fais.


//J'init une word application

CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
IUnknown* pUnk;
HRESULT hr = ::CoCreateInstance( clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IUnknown, (void**) &pUnk);
if (FAILED(hr))
{
printf("Error in creating Exel application instance\n");
Destroy();
return -1;
}

//J'ouvre un book

hr = pUnk->QueryInterface(IID_IDispatch, (void**)&m_pDispApp);
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispID;
LPOLESTR szDoc = L"Workbooks";
IDispatch* pDocuments = NULL;
VARIANT varRetVal;
hr = m_pDispApp->GetIDsOfNames(IID_NULL, &szDoc, 1,
LOCALE_SYSTEM_DEFAULT, &dispID);
hr = m_pDispApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &varRetVal, NULL, NULL);
if (!SUCCEEDED(hr))
{
Destroy();
return -1;
}


Mon probleme : quand je demande d'ouvrie un fichier xls. sa passe pas

VARIANT varg[1];
varg[0].vt = VT_BSTR;
varg[0].bstrVal = _bstr_t(strFilePath);

DISPPARAMS dpOpen = { varg, NULL, 13, 0 };
DISPID dispOpenID;
LPOLESTR szOpenDoc = L"Open";
HRESULT hr = m_pDocuments->GetIDsOfNames(IID_NULL, &szOpenDoc, 1,
LOCALE_SYSTEM_DEFAULT, &dispOpenID);
hr = m_pDocuments->Invoke(dispOpenID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dpOpen, &varRetVal, &excepInfo, NULL);
if (FAILED(hr))
{
printf("Error opening the document [Sa bloc ici]\n");
Destroy();
return -1;
}


J'aimerais savoir comment ouvrir un document exel.


pour enregister en txt je supose :

VARIANT test[4];

test[3].vt = VT_BSTR;
test[3].bstrVal = SysAllocString(L"C:\\delete\\docneu.txt");
test[2].vt = VT_I4;
test[2].lVal = 2; // ici pour le mode txt.
test[1] = vOpt;
test[0] = vOpt;

DISPPARAMS dpSave;
dpSave.cArgs = 4;
dpSave.cNamedArgs = 0;
dpSave.rgvarg = test;


IDispatch* pDocument = varRetVal.pdispVal;
DISPID dispSaveID;
LPOLESTR szSaveDoc = L"SaveAs";

hr = pDocument->GetIDsOfNames(IID_NULL, &szSaveDoc, 1,
LOCALE_SYSTEM_DEFAULT, &dispSaveID);
hr = pDocument->Invoke(dispSaveID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dpSave, &varRetVal, NULL, NULL);


mais je supose que sa ne va pas marcher sa non plus !!


Si quelque a une petit idee pour me donner un coup de main sa serais
super simpas de votre par .

En vous remercien d'avance .

++
--
Mickey disn
C++ Template fan

10 réponses

1 2
Avatar
Remi THOMAS
écrivit
Bonjour a tous.


Je suis entrin de faire un petit programme qui doit enregister mes
fichier exel en fichier txt.

J'ai reussi a trouver pour word mais pour exel je bloc .

Voila un peut ce que je fais.


//J'init une word application

CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
IUnknown* pUnk;
HRESULT hr = ::CoCreateInstance( clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IUnknown, (void**) &pUnk);
if (FAILED(hr))
{


...

mais je supose que sa ne va pas marcher sa non plus !!


Si quelque a une petit idee pour me donner un coup de main sa serais
super simpas de votre par .

En vous remercien d'avance .

++
--
Mickey disn
C++ Template fan




Hello,

Je te conseille de te faire une maquette en VB6 ou en C# qui effectue la
même chose.
Quand c'est au point alors essaye de le faire en C++

Rémi

--
Rémi THOMAS
MVP Visual C++ .NET
http://www.pixel-technology.com/rthomas
Avatar
Christian ASTOR
wrote:

J'ai reussi a trouver pour word mais pour exel je bloc .



Mon probleme : quand je demande d'ouvrie un fichier xls. sa passe pas



Utilise la foncton AutoWrap() de la KB pour simplifier.
Ensuite, c'est relativement simple en suivant le fichier d'aide
(VBAXL10.CHM par ex)

IDispatch *pXlBooks;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
pXlBooks = result.pdispVal;
}

IDispatch *pXlOpen;
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = SysAllocString(L"D:test.xls");
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Open", 1, parm);
VariantClear(&parm);
pXlOpen = result.pdispVal;
}
Avatar
Serge Paccalin
Le mardi 4 octobre 2005 à 18:56:58, Remi THOMAS a écrit dans
fr.comp.os.ms-windows.programmation :

//J'init une word application

CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
IUnknown* pUnk;
HRESULT hr = ::CoCreateInstance( clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IUnknown, (void**) &pUnk);
if (FAILED(hr))
{


...

Je te conseille de te faire une maquette en VB6 ou en C# qui effectue la
même chose.
Quand c'est au point alors essaye de le faire en C++

Rémi



Et une fois la maquette au point, elle peut être transposée en C++ avec
http://disphelper.sourceforge.net/

--
___________ 04/10/2005 21:37:16
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763
Avatar
ActJock
Salut,

Je ne sais malheureusement pas comment résoudre ton problème, ne
sachant même pas le faire pour word. C'est bien pour cela que je me
permet de te répondre, car je suis assez interressé de connaitre
comment faire pour ouvrir un fichier word contenant l'exécution d'une
macro en OLE.

Merci de ton aide.

wrote:
Bonjour a tous.


Je suis entrin de faire un petit programme qui doit enregister mes
fichier exel en fichier txt.

J'ai reussi a trouver pour word mais pour exel je bloc .

Voila un peut ce que je fais.


//J'init une word application

CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
IUnknown* pUnk;
HRESULT hr = ::CoCreateInstance( clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IUnknown, (void**) &pUnk);
if (FAILED(hr))
{
printf("Error in creating Exel application instancen");
Destroy();
return -1;
}

//J'ouvre un book

hr = pUnk->QueryInterface(IID_IDispatch, (void**)&m_pDispApp);
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispID;
LPOLESTR szDoc = L"Workbooks";
IDispatch* pDocuments = NULL;
VARIANT varRetVal;
hr = m_pDispApp->GetIDsOfNames(IID_NULL, &szDoc, 1,
LOCALE_SYSTEM_DEFAULT, &dispID);
hr = m_pDispApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &varRetVal, NULL, NULL);
if (!SUCCEEDED(hr))
{
Destroy();
return -1;
}


Mon probleme : quand je demande d'ouvrie un fichier xls. sa passe pas

VARIANT varg[1];
varg[0].vt = VT_BSTR;
varg[0].bstrVal = _bstr_t(strFilePath);

DISPPARAMS dpOpen = { varg, NULL, 13, 0 };
DISPID dispOpenID;
LPOLESTR szOpenDoc = L"Open";
HRESULT hr = m_pDocuments->GetIDsOfNames(IID_NULL, &szOpenDoc, 1,
LOCALE_SYSTEM_DEFAULT, &dispOpenID);
hr = m_pDocuments->Invoke(dispOpenID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dpOpen, &varRetVal, &excepInfo, NULL);
if (FAILED(hr))
{
printf("Error opening the document [Sa bloc ici]n");
Destroy();
return -1;
}


J'aimerais savoir comment ouvrir un document exel.


pour enregister en txt je supose :

VARIANT test[4];

test[3].vt = VT_BSTR;
test[3].bstrVal = SysAllocString(L"C:deletedocneu.txt");
test[2].vt = VT_I4;
test[2].lVal = 2; // ici pour le mode txt.
test[1] = vOpt;
test[0] = vOpt;

DISPPARAMS dpSave;
dpSave.cArgs = 4;
dpSave.cNamedArgs = 0;
dpSave.rgvarg = test;


IDispatch* pDocument = varRetVal.pdispVal;
DISPID dispSaveID;
LPOLESTR szSaveDoc = L"SaveAs";

hr = pDocument->GetIDsOfNames(IID_NULL, &szSaveDoc, 1,
LOCALE_SYSTEM_DEFAULT, &dispSaveID);
hr = pDocument->Invoke(dispSaveID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dpSave, &varRetVal, NULL, NULL);


mais je supose que sa ne va pas marcher sa non plus !!


Si quelque a une petit idee pour me donner un coup de main sa serais
super simpas de votre par .

En vous remercien d'avance .

++
--
Mickey disn
C++ Template fan


Avatar
mickeydisn
AutoWarp() super pratique merci !!

par contre je rencontre toujour des dificulter a ouvrir un document .


il me met IDispatch::Invoke("Open") failed 0x80020006
Avatar
Christian ASTOR
wrote:
AutoWarp() super pratique merci !!

par contre je rencontre toujour des dificulter a ouvrir un document .


il me met IDispatch::Invoke("Open") failed 0x80020006



J'ai mal fait le copier-coller (DISPATCH_METHOD), bien que ça marche qd
même chez moi.
En mettant tout depuis le début :

CoInitialize(NULL);

CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);

if(FAILED(hr))
{
MessageBox(NULL, "CLSIDFromProgID() failed", "Error", MB_OK | MB_ICONSTOP);
return -1;
}

IDispatch *pXlApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch,
(void **)&pXlApp);
if(FAILED(hr))
{
MessageBox(NULL, "Excel not registered properly", "Error", MB_OK |
MB_ICONSTOP);
return -2;
}

{
VARIANT x;
x.vt = VT_I4;
x.lVal = 1;
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
}

IDispatch *pXlBooks;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
pXlBooks = result.pdispVal;
}

IDispatch *pXlOpen;
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = SysAllocString(L"D:test.xls");

VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_METHOD, &result, pXlBooks, L"Open", 1, parm);
VariantClear(&parm);

pXlOpen = result.pdispVal;
}
Avatar
Christian ASTOR
ActJock wrote:

Je ne sais malheureusement pas comment résoudre ton problème, ne
sachant même pas le faire pour word.



Il y a des exemples ds la KB (eg KB238393)
Avatar
Yalbrieux
Bonjour,
C'est ma journée de bonté :)
--------------------8<-------------------------
/*** Dans le .h il faut quelques variables utiles : ***/

bool binit ; // FALSE si COM déjà initialisée
HRESULT hr ; // handle résultat de manoeuvre
OLECHAR FAR* ocFonc ; // fonction ole demandée
DISPID did ; // manoeuvre pour ID de dispositif
DISPPARAMS dpNULL ; // paramètre de dispositif vide
VARIANT vRes ; // résultat
VARIANT vDat1[1] ; // données pour fonction demandée
// VARIANT vDat11[11] ; // données pour fonction demandée
DISPPARAMS dpDat ; // données pour dispositif

IDispatch* pIApp ; // Application
IDispatch* pIDoc ; // Documents
IDispatch* pISel ; // Selection
IDispatch* pIAct ; // ActiveDocument
IUnknown* pExcel ; // pointeur appli Excel

/*** Dans le .cpp il faut d'abords initialiser le fourbi : ***/

dpNULL.rgvarg=NULL ;
dpNULL.rgdispidNamedArgs=NULL ;
dpNULL.cArgs=0 ;
dpNULL.cNamedArgs=0 ;

// On initialise la librairie COM
if(::CoInitialize(NULL)==S_OK) binit=TRUE ;
else binitúLSE ; // déjà fait ailleurs

// On demande le CLSID de l'appli Excel
CLSID clsid ;
CLSIDFromProgID(L"Excel.Application", &clsid) ;

// on instantie Excel
pExcel=NULL ;
hr=::CoCreateInstance( clsid, NULL, CLSCTX_SERVER , IID_IUnknown,
(void**)&pExcel) ;
if(FAILED(hr)) { AfxMessageBox("Lancement de Excel raté.") ; return ; }

// on crée une interface IDispatch
pIApp=NULL ;
hr=pExcel->QueryInterface(IID_IDispatch, (void**)&pIApp) ;
if(FAILED(hr)) { AfxMessageBox("Interface de Excel ratée.") ; return ; }

/*** Ensuite on peut faire la lecture. On suppose le nom du fichier dans
CString* pE : ***/

// on se crée une interface Document
ocFonc=OLESTR("Workbooks") ;
hr=pIApp->GetIDsOfNames(IID_NULL, &ocFonc, 1, LOCALE_USER_DEFAULT, &did) ;
hr=pIApp->Invoke(did, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
&dpNULL, &vRes, NULL, NULL) ;
if(FAILED(hr)) return FALSE ; // interface refusée
pIDoc=vRes.pdispVal ;

// on demande à Excel d'ouvrir le document pE
ocFonc=OLESTR("Open") ;
vDat1[0]=COleVariant(*pE) ;
dpDat.cArgs=1 ; dpDat.cNamedArgs=0 ; dpDat.rgvarg=vDat1 ;
hr=pIDoc->GetIDsOfNames(IID_NULL, &ocFonc, 1, LOCALE_USER_DEFAULT, &did) ;
hr=pIDoc->Invoke(did, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,
&dpDat, &vRes, NULL, NULL) ;
pIDoc->Release() ; pIDoc=NULL ;
if(FAILED(hr)) return FALSE ; // lecture refusée

// Fichier ouvert : on se donne une interface avec les cellules du document
actif
ocFonc=OLESTR("Cells");
hr=pIApp->GetIDsOfNames(IID_NULL, &ocFonc, 1, LOCALE_USER_DEFAULT, &did) ;
hr=pIApp->Invoke(did, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
&dpNULL, &vRes, NULL, NULL) ;
if(FAILED(hr)) return FALSE ; // accès cellules refusé
pIAct=vRes.pdispVal ;
return TRUE ;

/*** En sortant laisser le lieu aussi propre que vous l'avez trouvé en
entrant : ***/

// on se crée une interface document actif
ocFonc=OLESTR("ActiveWindow") ;
hr=pIApp->GetIDsOfNames(IID_NULL, &ocFonc, 1, LOCALE_USER_DEFAULT, &did) ;
hr=pIApp->Invoke(did, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
&dpNULL, &vRes, NULL, NULL) ;
if(FAILED(hr)) return FALSE ; // interface refusée
pIDoc=vRes.pdispVal ;

// on ferme le document actif
ocFonc=OLESTR("Close") ;
hr=pIDoc->GetIDsOfNames(IID_NULL, &ocFonc, 1, LOCALE_USER_DEFAULT, &did) ;
hr=pIDoc->Invoke(did, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,
&dpNULL, NULL, NULL, NULL) ;
if(FAILED(hr)) return FALSE ;

// ménage
pIDoc->Release() ; pIDoc=NULL ;
pIAct->Release() ; pIAct=NULL ;

return TRUE ;

/*** Pour fermer Excel : ***/

// Arrêt Excel par méthode Quit
ocFonc=OLESTR("Quit") ;
hr=pIApp->GetIDsOfNames(IID_NULL, &ocFonc, 1, LOCALE_USER_DEFAULT, &did) ;
hr=pIApp->Invoke(did, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,
&dpNULL, NULL, NULL, NULL) ;

if(binit) ::CoUninitialize() ;
-------------8<----------------
Voilà. Sur ces quelques éléments vous pouvez vous faire une classe complète
pour manipuler Excel.
Il y a sûrement pas mal de fonctions à ajouter :)
je me suis fais ça perso également pour tous les produits Office.
Méfiez vous aussi des versions différentes de Office qui demande la
détection de la version utilisée.
Bon courage.
Cordialement
Yves
Avatar
mickeydisn
Merci beacoup sa marche now meme bein je dirais ..

Une autre petit question :

Je sais voire les conposant integer dans les fichier EXCEL9.OLB,
MSWORD9.OLB , notament les methode des instefaces, grace au visioneur
de Visual c++ . Par contre j'ai chercher pas mal un endroi ou il y
avais une donc sur inferface. notamenr des interface de lesture du
texte dans les fichier. maleurheusement pas trouver .


Sinon merci beucoup quand meme

--
mickeydisn
Avatar
Christian ASTOR
wrote:

Je sais voire les conposant integer dans les fichier EXCEL9.OLB,
MSWORD9.OLB , notament les methode des instefaces, grace au visioneur
de Visual c++ . Par contre j'ai chercher pas mal un endroi ou il y
avais une donc sur inferface. notamenr des interface de lesture du
texte dans les fichier. maleurheusement pas trouver .



Il faut se servir des fichiers d'aide que j'avais cités (VBAWD10.CHM,
VBAXL10.CHM)
(KB222101)
1 2