IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

c++ builder 2007 + ole excel


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut c++ builder 2007 + ole excel
    Bonjour,

    je rencontre des problème lors de l'enregistrement d'un document excel généré par mon programme.

    je suis me suis inspiré de ces deux sources pour coder :

    http://lfe.developpez.com/Excel/
    http://cpp.developpez.com/faq/bcb/?p...elworkbooksave

    donc mon 1ere problème est lorsque je fourni le chemin d'enregistrement a partir d'un variable j'ai une jolie exception..

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FileFormat = -4143;
        vSaveChanges = true ;
        vFileName = AnsiString(CheminSortie+"SaveName.xls").c_str();
     
        vXLWorkbook.OleFunction("Close", vSaveChanges, vFileName,FileFormat);
    Chemin sortie est un ansiString contenant le chemin du répertoire de destination.

    si j'écris vFileName = "c:\\SaveName.xls"; mon fichier s'enregistre correctement sans erreur..

    par contre , et c'est la mon 2e problème, lorsque j'ouvre le fichier génér avec excel celui ci me dit que que le format ne correspond pas l'extension et me demande si je veux quand même l'ouvrir .
    quel réglage a l'enregistrement faut'il faire pour ne plus avoir se probleme de format et donc ce message??
    je suis sous office 2010.


    merci de votre aide

    cordialement

    édit: le 1er problème est résolue, ca marche forcement moins bien quand on donne pas un chemin valide...

    par contre le2e problème est toujours d'actualité..

    merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Pour les chemins, il faut utiliser des chaines compatibles COM, genre BSTR, ça doit être des WideString et non AnsiString

    Pour le problème de Format et d'Extension, c'est normal, Excel 2010 par défaut utilise un fichier XML et non l'ancien format binaire
    Il faut forcer le type, voir http://www.rondebruin.nl/saveas.htm
    J'ai un code en Delphi qui en est inspiré, mais je n'ai pas encore eu le temps de tester sour Excel 2010 (je n'ai que Word 2000 sur mon poste, et j'ai pas du tout envie d'en changer)

    Mon chef de projet, normalement l'a testé sur plein différentes versions d'OS et d'Excel, il semble que cela fonctionne !

    Je modifie le Fichier Excel par TMS FlexCell, je change des valeurs, mais cela ne réactualise par les Calculs, j'ai fait cette fonction pour fournir un fichier Excel propre avec les calculs déjà effectués ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    procedure TCensure.FinalizeExcelFile(const TmpExcelFileName: string; const FinalExcelFileName: string);
    const
      Excel2000WorkbookNormal = $FFFFEFD1; // ou -4143
    var
      ExcelOLE: OLEVariant;
      SaveAsFileName, FinalizedExcelFileName: string;
    begin
      try
        // Code en LateBinding !
        ExcelOLE := ComObj.CreateOleObject('Excel.Application');
        try
          ExcelOLE.UserControl := False;
          ExcelOLE.Visible := False;
          ExcelOLE.WorkBooks.Open(TmpExcelFileName);
     
          SaveAsFileName := ChangeFileExt(ExtractFilePath(TmpExcelFileName) + ExtractFileName(FinalExcelFileName), '.xls');
          if FileExists(SaveAsFileName) then
            DeleteFile(SaveAsFileName);
     
          if CompareVersion(ExcelOLE.Version, '12') < 0 then
            ExcelOLE.ActiveWorkBook.SaveAs(Filename := SaveAsFileName, FileFormat := Excel2000WorkbookNormal)
          else
            ExcelOLE.ActiveWorkBook.SaveAs(Filename := SaveAsFileName, FileFormat := 56); // http://www.rondebruin.nl/saveas.htm
     
          ExcelOLE.ActiveWorkBook.Close(SaveChanges := False);
     
          FinalizedExcelFileName := ChangeFileExt(SaveAsFileName, ExtractFileExt(FinalExcelFileName));
          if not SameText(ExtractFileExt(FinalizedExcelFileName), ExtractFileExt(SaveAsFileName)) then
            RenameFile(SaveAsFileName, FinalizedExcelFileName);
     
          FExtracteurInVS.ArchiveFile(FinalizedExcelFileName);
     
          DeleteFile(TmpExcelFileName);
        finally
          ExcelOLE := Unassigned;
        end;
      except
        on E: Exception do
          raise ECensureError.CreateFmt('Erreur durant la Consolidation du Fichier Excel %s : %s', [ExtractFileName(FinalExcelFileName), E.Message]);
      end;
     
      FExportedFileNameList.Add(FinalizedExcelFileName);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    merci pour ton aide mais même avec fileformat = 56 j'ai ce message de format...

    par contre comment fait on en c++ pour récupérer la version d'excel avec OLE?

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut hdreport
    Peut etre comme ceci (XP pack2 Excel2003)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    vMSExcel = Variant::CreateObject("Excel.Application");
            vMSExcel.OlePropertySet("Visible", true);
                    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
                            vXLWorkbook = vXLWorkbooks.OleFunction("Add");
                    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
     
    // affichage version Excel
    Label1->Caption = vMSExcel.OlePropertyGet("Version");
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    parfait merci c'est nikel!

    par contre j'ai toujours de message de format lors de l'ouverture du fichier excel que mon programme génère.. même en mettant 56 pour le format..

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Sur les dernieres versions d'Excel l'extension n'est plus " .xls " a verifier sur un document Excel cree par Excel
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    problème résolue merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OLE Excel] Aller jusqu'à la dernière cellule rempli
    Par JBrek dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 07/08/2009, 19h21
  2. Piloter OLE Excel, VBE avec C++Builder
    Par Sunchaser dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 26/11/2006, 11h31
  3. Petit prob avec l'OLE EXCELL sous builder
    Par vladi dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/03/2005, 19h30
  4. [OLE Excel] Récupérer une colonne d'un coup
    Par Nemerle dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/05/2004, 15h56
  5. [OLE Excel] Erreur
    Par JBrek dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 23/03/2003, 18h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo