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 :

Ecrire dans un fichier .xls (Excel)


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut Ecrire dans un fichier .xls (Excel)
    Bonjour,

    je sais que c'est possible de lire dans un fichier Exel, j'ai deja la partie de code qui fait ca, par ailleurs j'aimerais pouvoir écrire aussi dans certain case de ce même fichier .xls

    Malheuresement je ne trouve pas trop de code parlant de ca sur internte, est ce que certains ici on deja eu a faire ca? Quelqu'un a une idée ou un lien?

    Merci bien...

  2. #2
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    As-tu recherché dans la FAQ

    plus précisément sur Office ?
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Il y a plusieurs solutions dépendant de la version de Delphi et des composants qui y sont, ou non, en standard.

  4. #4
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    j'ai delphi 5, et j'ai suivis la manip du site, j'ai ca :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComObj,
      StdCtrls, OleServer, Excel97;
     
    type
      TForm1 = class(TForm)
        GroupBox1: TGroupBox;
        Button1: TButton;
        Button2: TButton;
        ExcelApplication1: TExcelApplication;
        ExcelWorksheet1: TExcelWorksheet;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      vMSExcel,vWorksheet : variant;
     
    implementation
     
    {$R *.DFM}
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        vMSExcel := GetActiveOleObject('Excel.Application');
        vMSExcel.Visible := true;
     
        try
        vMSExcel := GetActiveOleObject('Excel.Application');
        except
        vMSExcel := CreateOleObject('Excel.Application');
        end;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
        aValue, aRange : AnsiString;
        vCell : variant;
    begin
        aRange := 'D3';
        vCell := vWorksheet.Range[aRange];
        aValue := vCell.Value;
        ShowMessage(aValue);
    end;
     
    end.
    le bouton 1 servant a se connecter a linterface existance, et le bouton 2 a chercher la valeur d'une case, mais ca me provoque une erreur avec le

    pourtant il y a écrit ca :s

  5. #5
    Membre confirmé Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Par défaut Code qui marche avec Delphi 7 et excel 2002
    Salut.

    Dans 1 premier temps, tu pose sur ta feuille un composant OLE Excel.
    Le click sur le bouton va provoquer la connection à excel, l'envoie de données et même son ouverture


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    {-------------------------Au click sur le BTN Excel ---------------------------}
     
    procedure TForm2.Button2Click(Sender: TObject);
    begin
    try     // Excel est ouvert
        Excel := GetActiveOleObject('Excel.Application');
        ExcelOpened := True;
    Except
        on EOleSysError do
        ExcelOpened := False;
    end;
    try
    Excel := CreateOleObject('Excel.Application');// création du lien OLE pour la classe référencée par Excel dans la base de registre "Excel.Application"
    {On effectue l'exportation}
    SaveAsExcelFile(grille,ExtractFilePath(Application.ExeName) + 'Test2006.xls');
    if ExcelOpened = False then
    begin
     Excel.Quit;
     Excel := Unassigned;
    end;
     except
       ShowMessage('Microsoft Excel n''est pas installé. Cette fonctionnalité n''est pas accessible');
       Abort;
    end;
     
    {On ouvre le fichier}
    ouvrir_Excel;
    end;
     
    {------------------------------------------------------------------------------}
     
    procedure TForm2.XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
      const AValue: string);
    var
      L: Word;
    const
      {$J+}
      CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
      {$J-}
    begin
      L := Length(AValue);
      CXlsLabel[1] := 8 + L;
      CXlsLabel[2] := ARow;
      CXlsLabel[3] := ACol;
      CXlsLabel[5] := L;
      XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
      XlsStream.WriteBuffer(Pointer(AValue)^, L);
    end;
     
    {------------------------------------------------------------------------------}
    function TForm2.SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean;
    const
      {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-}
      CXlsEof: array[0..1] of Word = ($0A, 00);
    var
      FStream: TFileStream;
      I, J: Integer;
    begin
      FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
      try 
        CXlsBof[4] := 0;
        FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
        for i := 0 to AGrid.ColCount - 1 do
          for j := 0 to AGrid.RowCount - 1 do 
            XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]);
        FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); 
        Result := True;
      finally
        FStream.Free;
      end;
    end;

  6. #6
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Sur quelle instruction se produit ton erreur

  7. #7
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    ahh, j'ai mis le TExcelOLEObject et ca marche, avant j'avais mis ExcelApplication et ExcelWorksheet c'est pour ca...

    dans mon cas je souhaite que le fichier excel soit ouvert en meme temps que le soft, mais je dois tout de meme gérer l'erreur lors de cette manip

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        vMSExcel := GetActiveOleObject('Excel.Application');
        vMSExcel.Visible := true;
    Si le fichier est fermé ca me renvoie une exeption EOleSysError et j'essais de pouvroir contenir l'erreur en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        try
        vMSExcel := GetActiveOleObject('Excel.Application');
        except
        on EOleSysError do
        ShowMessage('Fichier Excel non ouvert!');
        end;
     
        vMSExcel.Visible := true;
    mais ca n'a pas l'air d'etre ca :s

    j'ai une erreur quand je veux lire aussi la valeur de la case dans cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
        aValue, aRange : AnsiString;
        vCell : variant;
    begin
        aRange := 'D3';
        vCell := vWorksheet.Range[aRange];
        aValue := vCell.Value;
        ShowMessage(aValue);
    end;
    avec la variant ne référance pas un objet automation, precessus stopé!

  8. #8
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Salut

    Pour le try... except

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    vMSExcel := GetActiveOleObject('Excel.Application');
    except
    on EOleSysError do
    vMSExcel := CreateOleObject('Excel.Application');
    ShowMessage('Fichier Excel non ouvert!');
    end;
    vMSExcel.Visible := true;
    C'est en dehors de Delphi que tu dois tester l'exécutable sinon tu auras toujours le message d'erreur.

    Pour ce qui est de la deuxième erreur, je fait de ne pas ouvrir un classeur pourrait en être à l'origine.
    Fais une exécution pas à pas pour detecter l'instruction qui génère l'erreur.

    Bonne chance.

  9. #9
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    pareil :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
    procedure TForm1.Button2Click(Sender: TObject);
    var
        aValue, aRange : AnsiString;
        vCell : variant;
        MonClasseur : _workbook;
     
    begin
        //vWorksheet := vXLWorkbook.WorkSheets['feuil1'];
        If ExcelApplication1.Workbooks.Count>=1 Then
        MonClasseur:=ExcelApplication1.Workbooks[1];
     
        aRange := 'D3';
        vCell := vWorksheet.Range[aRange];
        aValue := vCell.Value;
        ShowMessage(aValue);
    end;
    l'erreur est générée par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vCell := vWorksheet.Range[aRange];

  10. #10
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Chez moi, ta source ne pose aucun problème, sauf une erreur à la compilation sur la déclaration : «MonClasseur : _workbook» qui est une instruction Ole Automation.

    Je me demande si tu ne mélanges pas les instruction Ole et Ole Automation.

    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        vCell := vWorksheet.Range[aRange];
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       vCell := vWorksheet.Cells[3,4];
    ou par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       vCell := vWorksheet.Cells.Item[3,4];
    Je serais curieux de savoir si une des deux fonctionne

  11. #11
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    oui peut etre que je mélange, je sais pas, les codes marches pas la, par contre ce code la m'ouvre un fichier excel et écrit dedans, le hic c'est que je veux qu'il écrire ds le fichier deja ouvert :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      MonClasseur : _workbook;
      MaFeuille   : _worksheet;
    begin
      ExcelApplication1.SheetsInNewWorkbook[0]:=1;
      MonClasseur:=ExcelApplication1.Workbooks.Add(EmptyParam,0);
      MaFeuille:=MonClasseur.Worksheets[1] as _worksheet;
      MaFeuille.Range['B1','B2'].Value:='BLOP'  ;
      ExcelApplication1.Visible[0]:=true;
    Pour capter l'attention d'un fichier xls ouvert avant j'utilisais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vMSExcel := GetActiveOleObject('Excel.Application');
    Edit :

    il fallait faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If ExcelApplication1.Workbooks.Count>=1 Then
      MonClasseur:=ExcelApplication1.Workbooks[1];
      MaFeuille:=MonClasseur.Worksheets[1] as _worksheet;
      MaFeuille.Range['B1','B2'].Value:='BLOP' ;
      MaFeuille.Cells.Item[1,1].value:='bzzzzz';
      ExcelApplication1.Visible[0]:=true;

Discussions similaires

  1. [Batch] Ecrire dans un fichier word / excel
    Par julien41 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 29/11/2012, 14h26
  2. Ecrire dans un fichier xls déjà ouvert
    Par alexis0587 dans le forum MATLAB
    Réponses: 4
    Dernier message: 04/09/2009, 09h43
  3. [C#] Comment écrire dans un fichier Excel ?
    Par chorokari dans le forum C#
    Réponses: 8
    Dernier message: 09/02/2007, 09h17
  4. [C#] Comment écrire dans un fichier Excel ?
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/05/2006, 15h29
  5. [VB]Ecrire dans un fichier excell
    Par Empty_body dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 07/02/2006, 12h55

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