Probleme de Pied de Page d Excel par Automation, C++ ( VS6)

Probleme de Pied de Page d Excel par Automation, C++ ( VS6) - C++ - Programmation

Marsh Posté le 28-09-2007 à 10:24:45    

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'enpied 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.  
 
Les commandes en francais ( &N, &J, &H, &P, &T ) marchent, mais pas celles en Anglais sur un Excel 2000 Version francaise, or j aimerais une version internationale, et il me semble que les commandes anglaises marchent sous toutes les versions de langue.
 
Si quelqu'un a une idée...  
 
   
 
   
 
void CTestExcelDlg:nOK()  
{  
 
 // 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;  
}  

Reply

Marsh Posté le 28-09-2007 à 10:24:45   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed