Pied de Page Excel

DominiquedeLapasse Messages postés 5 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 28 septembre 2007 - 26 sept. 2007 à 10:12
DominiquedeLapasse Messages postés 5 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 28 septembre 2007 - 28 sept. 2007 à 07:15
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

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
26 sept. 2007 à 16:59
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);
0
DominiquedeLapasse Messages postés 5 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 28 septembre 2007
26 sept. 2007 à 17:24
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);

   }

 
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
26 sept. 2007 à 18:45
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.
0
DominiquedeLapasse Messages postés 5 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 28 septembre 2007
26 sept. 2007 à 19:11
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
26 sept. 2007 à 20:16
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.
0
DominiquedeLapasse Messages postés 5 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 28 septembre 2007
27 sept. 2007 à 16:14
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
27 sept. 2007 à 17:47
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.
0
DominiquedeLapasse Messages postés 5 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 28 septembre 2007
28 sept. 2007 à 07:15
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 :)
0
Rejoignez-nous