Pied de Page Excel

Signaler
Messages postés
5
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2007
-
Messages postés
5
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2007
-
Bonjour,


L'integration d'informations dans l'EnPied de Page d'une feuille Excel fait un peu n'importe quoi.
Ce source pilote juste l'enpiied de Page, il ne pose aucune valeur dans la feuille Excel.


Dans l exemple joint
j'essaie de mettre :
le nom de fichier a gauche, ca marche (&F)
la date et l heure au milieu, ca fait rien (&D &T)
la page en cours et le nombre de page a droite (&N &P) , ca met la page en cours et ca remet le nom du fichier ( !!! )


Je joins le source a integrer dans le Bouton OK d un projet MFC Dialog Based.
La fonction AutoWrap a ete tirée telle quelle de MSDN


Aucune erreur a la compil, aucune erreur a l execution.


Si quelqu'un a une idée...


 


 


void CTestExcelDlg::OnOK()
{


 // Initialise COM
 CoInitialize(NULL);


 


 // Lit le CLSID du serveur
 CLSID clsid;
 if(FAILED(CLSIDFromProgID(L"Excel.Application", &clsid)))
 {
  return ;
 }


 IDispatch * Excel_ID;


 // Lance le serveur
 if(FAILED(CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **) &Excel_ID)))
 {
  return ;
 }




 // Recupere les classeurs
 COleVariant result;
 AutoWrap(DISPATCH_PROPERTYGET, &result, Excel_ID, L"Workbooks", 0);
 IDispatch * Classeurs_ID = result.pdispVal;


 


 // Ajoute un classeur
 AutoWrap(DISPATCH_PROPERTYGET, &result, Classeurs_ID, L"Add", 0);
 IDispatch * Classeur_ID = result.pdispVal;




 // Recupere la Feuille Courante
 AutoWrap(DISPATCH_PROPERTYGET, &result, Classeur_ID, L"ActiveSheet", 0);
 IDispatch * Feuille_ID = result.pdispVal;


 // Recupere l'objet "pagesetup"
 AutoWrap(DISPATCH_PROPERTYGET, &result, Feuille_ID, L"PageSetup", 0);
 IDispatch * PageSetup_ID = result.pdispVal;




 // Nom de fichier dans l'en pied gauche
 CString cstrNomPropriete = "LeftFooter";
 COleVariant ValeurCOleVariant = "&F";
 USHORT * Tampon = cstrNomPropriete.AllocSysString();
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, PageSetup_ID, Tampon, 1, ValeurCOleVariant);
 SysFreeString(Tampon);


 // Date Heure  dans l'en pied central
 cstrNomPropriete = "CenterFooter";
 ValeurCOleVariant = "&D &T";
 Tampon = cstrNomPropriete.AllocSysString();
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, PageSetup_ID, Tampon, 1, ValeurCOleVariant);
 SysFreeString(Tampon);


 // Page / Pages dans l'en pied droit
 cstrNomPropriete = "RightFooter";
 ValeurCOleVariant = "&P &N";
 Tampon = cstrNomPropriete.AllocSysString();
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, PageSetup_ID, Tampon, 1, ValeurCOleVariant);
 SysFreeString(Tampon);


 
 // Sauvegarde
 COleVariant CheminVariant = "C:\\essai.xls";
 COleVariant Retour;
 AutoWrap(DISPATCH_METHOD, &Retour, Feuille_ID, L"SaveAs", 1,  CheminVariant );




 // Termine Excel
 AutoWrap(DISPATCH_METHOD, NULL, Excel_ID, L"Quit", 0);




 Feuille_ID->Release();
 Classeur_ID->Release();
 Classeurs_ID->Release();
 Excel_ID->Release();


}


 


//
// AutoWrap() - Automation helper function...
//
HRESULT AutoWrap(int autoType, COleVariant *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
{
    va_list marker;
    va_start(marker, cArgs);


    ASSERT(pDisp!=NULL);


    // Variables used...
    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    HRESULT hr;
    CString buf;
    char szName[200];


   
    // Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
   
    // Get DISPID for name passed...
    hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
    if(FAILED(hr))
 {
  buf.Format(_T("IDispatch::GetIDsOfNames("%s") failed w/err 0x%08lx"), szName, hr);
        MessageBox(NULL, buf, _T("AutoWrap()"), 0x10010);
        _exit(0);


  va_end(marker);


        return hr;
    }
   
    // Allocate memory for arguments...
    COleVariant *pArgs = new COleVariant[cArgs+1];
    // Extract arguments...
    for(int i=0; i<cArgs; i++)
 {
        pArgs[i] = va_arg(marker, COleVariant);
    }
   
    // Build DISPPARAMS
    dp.cArgs = cArgs;
    dp.rgvarg = pArgs;
   
    // Handle special-case for property-puts!
    if(autoType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }


   
    // Make the call!
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
 if(FAILED(hr)) {


        buf.Format(_T("IDispatch::Invoke("%s"=%08lx) failed w/err 0x%08lx"), szName, dispID, hr);
        TRACE(NULL, buf, _T("AutoWrap()"), 0x10010);
        return hr;
    }
    // End variable-argument section...
    va_end(marker);
   
    delete [] pArgs;
   
    return hr;
}

8 réponses

Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Moi perso je n'utilise pas CString , sinon  j'ai jamais testé les pieds de page, dsl.
    VARIANT parm;
    VariantClear(&parm);
    parm.vt = VT_BSTR;
    parm.bstrVal = SysAllocString(str);

    AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlSheet, L"Name", 1, parm);

    SysFreeString(parm.bstrVal);
    VariantClear(&parm);
Messages postés
5
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2007

Merci de votre réponse

J ai aussi essaye comme le bout de code plus bas, avec des variants, proches de votre code
Le plus fort c est que une chaine libre ( genre toto ) va parfaitement la ou on veut
Mais &D &T ( pour Date et Heure )   ne passe pas.

J ai meme essayé de doubler les & : &&D && T.
Et ca donne &[Page] &[Fichier] dans l enpied !!!

Si vous avez 5 minutes pour essayer d'integrer le bout de code suivant dans votre source :)
Cordialement
Dominique

  IDispatch * PageSetup_ID;
   {

    VARIANT result;
    VariantInit(&result);

 // Recupere l'objet "pagesetup"
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"PageSetup", 0);
 PageSetup_ID = result.pdispVal;

 // Date Heure  dans l'en pied central
    VARIANT parm;
    parm.vt = VT_BSTR;
    parm.bstrVal = ::SysAllocString(L"&D &T");
  AutoWrap(DISPATCH_PROPERTYPUT, NULL, PageSetup_ID, L"CenterFooter", 1, parm);
    VariantClear(&parm);

   }

 
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben apres mes test ca marche avec
parm.bstrVal = SysAllocString(L"&[Date]");
mais je suis obligé de valider mes pied de page perso dans excel a la main pour que cela marche sinon ca m'affiche "Date]".

En fait ces commandes modifient le combobox de pied de page preselectionné en mettant n'importe quoi et les pieds de pages personnalisés mais necessite une validation.

Ps: j'ai une vielle version d'excel mais normallement ca influe pas trop.
Messages postés
5
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2007

Effectivement ce sont les commandes  &D, &T, &N etc qui n ont pas l air de bien passer a 100 %
Elles sont interpretés je ne sais pas comment.
Le truc qui marche , c est &F a gauche , et &N a doite
Mais mon client veut plus :(

Merci quand meme d avoir essayé

Dominique
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Pourquoi tu essayes pas avec &[Date]&[Heure]&[Chemin d'accès]&[Fichier] celle la marchent chez moi mais il reste a valider et la je connais pas les commandes pour l automation.
Messages postés
5
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2007

Je vais essayer, oui.
 
Mais j aimerais comprendre pourquoi la forme preconisée marche pas, pour :
1 ) le principe,
2 ) la portabilité vers un Excel eventuellement etranger, nos softs etant multilangues.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben j'ai cherché partout j'ai pas trouvé ou ca parlait de &D chez moi sa s'apelle &[date], tu as quoi comme version d'excell ?
Il ont peut etre justement preferé garder les vielles balises plus compatibles.
Messages postés
5
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2007

J ai la version Excel 2000.

Si tu enregistres une macro sous Excel qui fait une mise en page des pieds de page et si tu l edites ensuite tu verras par exemple :

    With ActiveSheet.PageSetup
       .LeftFooter = "&D &T"
       .CenterFooter = "&P &N"
       .RightFooter = "&F &A"

Ce sont les codes a envoyer.
J aiessayé ton astuce, ca met Date], en effet. Je peux pas livrer ca :)