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

Delphi Discussion :

Ouvrir Excel dans un panel


Sujet :

Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Ouvrir Excel dans un panel
    Bonjour à tous,
    Voila je me heurte à un problème que je n'arrive pas à résoudre, je suis en panne d'idées après deux jours de recherches.
    J'en appelle donc à vos lumières.

    Voila ma problématique, je voudrais ouvrir un fichier Excel dans un panel de ma fiche de manière à ce que l'utilisateur puisse modifier son fichier Excel. Au dessus du panel, je vais avoir des boutons d'action pour ajouter des éléments (articles, ...).
    J'arrive à placer Excel dans le panel en faisant le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Var FoleExcel : variant;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FoleExcel := CreateOleObject('Excel.Application');
      FoleExcel.visible := true;
      FoleExcel.WorkBooks.Open('c:\xls\test.xls');
     
      Winapi.Windows.SetParent(FoleExcel.hwnd, Panel1.Handle);
      MoveWindow(FoleExcel.hwnd, 0, 0, Panel1.Width, Panel1.Height, True);
    end;
    Maintenant je veux faire un truc tout bête c'est activer la seconde feuille du fichier Excel (en vrai ce n'est pas ce que je veux vraiment faire, mais ça permet de mettre en lumière le souci).
    Pour cela, j'ai un bouton avec un événement clic dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      FoleExcel.Worksheets.item[2].Activate;
    end;
    A ce moment là le programme ne plante pas et Excel change bien la feuille.
    Par contre si je clique à nouveau sur le bouton en demandant de se repositionner sur la feuille 2, cela plante.
    Il faut que je clique sur la grille Excel en allant sur une cellule pour que l'action remarche.

    Si on regarde bien le caption de Excel, on voit bien que quelque chose ne va pas.

    Image 1 : Ouverture du fichier Excel dans le panel
    Nom : Image1.png
Affichages : 841
Taille : 39,7 Ko

    Image 2 : Changement de feuille
    Nom : Image2.png
Affichages : 807
Taille : 37,3 Ko

    Image 3 : Changement de feuille à nouveau et erreur
    Nom : Image3.png
Affichages : 858
Taille : 38,8 Ko

    Si on regarde bien après le changement de feuille la barre de titre de Excel a changé. C'est passé de "test.xls - Mode de compatibilité - Excel" à "Excel".
    C'est comme si Excel avait perdu le fil. Si on clique dans un cellule le titre se repositionne comme il faut.

    Image 4 : Clic dans une cellule, la barre de titre change
    Nom : Image4.png
Affichages : 809
Taille : 39,4 Ko

    J'ai essayé en ajoutant des choses comme :
    FAppThreadID := GetWindowThreadProcessId(FoleExcel.hwnd, nil);
    AttachThreadInput(GetCurrentThreadId, FAppThreadID, True);

    Mais rien n'y fait. Si vous avez une idée, je suis preneur car là je sèche complètement

    Si on ne place pas Excel dans le panel. Aucune erreur se produit et on peut cliquer sur le bouton de changement de feuille sans souci (la barre de titre est bien mise à jour).

    Pour info, je travaille avec la version 10.1 Berlin
    Merci à tous pour votre aide

  2. #2
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 213
    Points : 222
    Points
    222
    Par défaut
    Ce ne serait pas plutôt ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FoleExcel.Worksheets.item[1].Activate;

  3. #3
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Salut,

    j'ai testé ton code. Je n'ai pas de plantage.
    J'ai Delphi 10.2 mais je ne pense pas que cela influe.
    Par contre j'utilise excel 2007. Tu utilises quelle version de ton côté ?

    Ta variable FOleExcel est toujours bien assignée quand tu cliques sur ton bouton ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par oneDev Voir le message
    Ce ne serait pas plutôt ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FoleExcel.Worksheets.item[1].Activate;
    Merci la réponse, non dans Excel les indices commencent à 1 et non 0. Donc c'est bien 2 pour la feuille 2

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par blonde Voir le message
    Salut,

    j'ai testé ton code. Je n'ai pas de plantage.
    J'ai Delphi 10.2 mais je ne pense pas que cela influe.
    Par contre j'utilise excel 2007. Tu utilises quelle version de ton côté ?

    Ta variable FOleExcel est toujours bien assignée quand tu cliques sur ton bouton ?
    Oui je confirme que la variable FOleExcel est toujours bien assignée.
    Pour Delphi, je ne pense pas non plus que la version influe.
    Pour Excel j'utilise la version Office 365, je vais essayer de trouver une machine avec une autre version d'Excel pour voir si la version d'Excel influe.

    Pas de plantage même en cliquant plein de fois sur le bouton d'activation de feuille ?
    En fait tout se passe, comme si Excel basculait en mode ouverture sans fichier.

  6. #6
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Et j'imagine que si tu demandes n'importe quelle méthode ou propriété, l'OLE plante de la même façon ?

  7. #7
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    J'ai trouvé ça sur le net

    https://stackoverflow.com/questions/...nd-office-2013

    Tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FoleExcel.WorkBooks.Open('c:\xls\test.xls');

    Il faudrait utiliser la variable retournée par excel au moment de l'ouverture de ton classeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Workbook: OleVariant;
     
     Workbook := FoleExcel.WorkBooks.Open('c:\xls\test.xls');
     
    // et donc utiliser la variable retournée par excel
    Workbook.Sheets[1].Range['A1'].Value := 'HELLO';

    Tu em diras si ça corrige ton problème ? Moi je ne peux pas tester là.

  8. #8
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 084
    Points : 5 604
    Points
    5 604
    Par défaut
    Dans ton cas est-ce qu'un "TOleContainer" ne serait pas mieux indiqué qu'un TPanel ?

    C'est un container que l'on peut instancier sur une fiche spécialement conçu pour instancier un object OLE à l’intérieur (un classeur Excel par exemple)

    Je l'ai jamais utilisé dans ce contexte mais j'imagine que cela ne doit pas poser de problème particulier...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par blonde Voir le message
    Tu em diras si ça corrige ton problème ? Moi je ne peux pas tester là.
    Merci beaucoup pour les réponses.
    Le fait de m'indiquer des appels à Workbook.Sheets[1] m'a permis de solutionner quelques problèmes mais le soucis premier est toujours le même.
    J'ai cependant pu résoudre le problème en rebondissant grâce à tes réponses. Surtout en utilisant le workbook renvoyé par le open.

    Pour résoudre la chose, il faut faire les choses suivantes pour écrire par exemple "HELLO" dans la sélection en cours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FoleExcel.Selection;
      OleSelect.Formula := 'HELLO';
    Le problème c'est que Excel perd un peu les pédales.
    Alors une fois que j'ai effectué les actions nécessaires dans Excel, je force une réactivation de la feuille en cours.

    Cela ne suffit pas car la sélection car la grille Excel perd le focus et la sélection n'est plus visible et il faut cliquer de nouveau dans la grille.
    J'ai donc récupéré le handle de la grille Excel en faisant un EnumChildWindows lors de la création de l'OLE Excel.
    Donc une fois les traitement effectués et l'activation de la feuille effectuée, j'envoi un message WM_LBUTTONDOWN sur le handle trouvé.
    On voit un peu de clignotement mais c'est léger. Mais cela résout le problème.

    Un grand merci.

    ps : je ne met pas le sujet en solutionné, car je compte poster une réponse plus propre en détaillant les différentes actions que je fais. Mais il faut que je fasse du code plus propre.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par sergio_is_back Voir le message
    Dans ton cas est-ce qu'un "TOleContainer" ne serait pas mieux indiqué qu'un TPanel ?

    C'est un container que l'on peut instancier sur une fiche spécialement conçu pour instancier un object OLE à l’intérieur (un classeur Excel par exemple)

    Je l'ai jamais utilisé dans ce contexte mais j'imagine que cela ne doit pas poser de problème particulier...
    Merci pour la réponse,
    J'ai essayé avec un TOleContainer mais ca pose pas mal de soucis car je dois avoir des composants (compo , edit) au dessus de la grille Excel et des que je clique dans une combobox de sélection, le container perd le focus et cela flash de partout.
    En plus l'application que je dois faire est une application MDI (exigence du client ) et on est parti sur des formes sans barre de titre pour un design plus sympa et ça pose pas mal de soucis avec le container. MDI + Form design + Excel : on aime se faire du mal.

    En tous cas merci pour la réponse

Discussions similaires

  1. [XL-2003] FileDialog: ouvrir excel dans autres instance et pouvoir ouvrir les autres fichiers.
    Par perpitou dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/12/2011, 20h30
  2. ouvrir excel dans la page
    Par night_flyers dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 09/07/2009, 16h46
  3. ouvrir excel dans la page
    Par night_flyers dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/05/2009, 10h15
  4. [D7] Ouvrir Excel dans une form
    Par MiJack dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/12/2007, 20h17
  5. Ouvrir excel dans delphi
    Par Nadirov dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2006, 20h23

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