Page 1 sur 1

Migrer d’une ListIconGadget vers l’Excel.

Publié : dim. 14/juin/2009 13:16
par Mytic
Voici une petite procédure qui permet de copier du contenu ListIconGadget vers l'Excel !
J’ai analysé la structure du Clipboard lors d’une Copie Excel pour la créer, et je me suis dis que ça pourrait servir à quelqu’un pour créer des applications compatibles avec Excel.
:)

Exécutez le code, et ouvrez l’Excel, puis faites un Coller

Code : Tout sélectionner


  Procedure Copy_LIG_to_Excel(Gadget.l,LigneDep.l,ColonneDep.l,LigneFin.l,ColonneFin.l)
  ;=================================================================
  ;| Procédure pour copier du contenu ListIconGadget vers l'Excel   |
  ;|    Version : 0.1                                               |
  ;|                  By  Mytic..                                   | 
  ;=================================================================
   Protected x.l =0
   Protected y.l = 0
   Protected CB.s = ""
    For y = LigneDep To LigneFin Step 1
       For x = ColonneDep To ColonneFin Step 1
          CB = CB + GetGadgetItemText(Gadget, y,x)
          If x <> ColonneFin : CB+Chr(9) : EndIf
       Next x
       If y <> LigneFin : CB+Chr(13)+Chr(10) : EndIf
    Next y
    SetClipboardText(CB) 
  EndProcedure
  
  
  
  If OpenWindow(0, 0, 0, 400, 300, "ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 

    TextGadget    (6,  10,  10, 300, 20, "TEST", #PB_Text_Center)
    ListIconGadget(0,  10,  25, 300, 200, "Colonne 1", 100)
          
      For b = 2 To 4 
        AddGadgetColumn(0, b, "Colonne " + Str(b), 65)
      Next
      For b = 0 To 2
        AddGadgetItem(0, b, "Elément 1"+Chr(10)+"Elément 2"+Chr(10)+"Elément 3"+Chr(10)+"Elément 4")
      Next
      
      
      Copy_LIG_to_Excel(0,0,0,2,3)

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

:idea:

Publié : dim. 14/juin/2009 14:10
par Jacobus
Excellent! très pratique cette procédure.

Publié : dim. 14/juin/2009 20:47
par Geo Trouvpatou
Salut.

Ma parole Mytic, tu lis dans mes pensées.
Il y a exactement 4 jours, je recherchais un logiciel que j'avais utilisé il y a pas mal de temps et je ne me rappellais plus de son nom.
J'ai fini par le retrouver il s'agit d'un tout petit truc qui s'appelle "WhichFiles_1.0".

Son principe : tu le démarre, tu met un CD ou DVD dans ton lecteur, les fichiers s'affichent dans la fenêtre du prog., tu fais un copier et un coller dans Excel.

Ses inconvénients :
- Ne fonctionne qu'avec un CD ou DVD (On ne peut pas lister un dossier).
- Ne récupère pas le poids du fichier (Je dois me taper cette étape à la main).

Avec ton code, un petit openFileRequester permettra de récupérer mes fichiers même sur le disque dur, ensuite suffira de récupérer le poids du fichier etc...

Trop merci à toi :wink:.

[EDIT] et en plus un code portable :D
[EDIT 2] Par contre la variable a des boucles, elle sort d'où ?

Bye.

Publié : dim. 14/juin/2009 21:36
par Le Soldat Inconnu
le a, c'est une erreur

ici a = 0 et la listicon est le gadget 0 donc ça va, coup de bol

Soit tu remplaces a par 0
soit tu fais
a = listicongadget(#pb_any, ....)

Publié : dim. 14/juin/2009 21:41
par Geo Trouvpatou
Allez un 1er jet fait vite fait avec la doc ;)

Code : Tout sélectionner

EnableExplicit
Global Evenement.l, Quit.l, FichierParDefaut$, Fichier$, Resultat.q, nbLigne.l, ligneSelectionnee.l

Enumeration
    #Window_principale
    #Bouton_ouvrir
    #Bouton_supprimer
    #Bouton_copier
    #ListIconGadget
EndEnumeration

Procedure Copy_LIG_to_Excel(Gadget.l,LigneDep.l,ColonneDep.l,LigneFin.l,ColonneFin.l)
    ;=================================================================
    ;| Procédure pour copier du contenu ListIconGadget vers l'Excel   |
    ;|    Version : 0.1                                               |
    ;|                  By  Mytic..                                   | 
    ;=================================================================
    Protected x.l =0
    Protected y.l = 0
    Protected cb.s = ""
    For y = LigneDep To LigneFin Step 1
        For x = ColonneDep To ColonneFin Step 1
            cb = cb + GetGadgetItemText(Gadget, y,x)
            If x <> ColonneFin : cb+Chr(9) : EndIf
        Next x
        If y <> LigneFin : cb+Chr(13)+Chr(10) : EndIf
    Next y
    SetClipboardText(cb) 
EndProcedure


If OpenWindow(#Window_principale, 0, 0, 500, 340, "ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    
    ButtonGadget(#Bouton_ouvrir, 6, 10, 100, 24, "Ouvrir")
    
    ListIconGadget(#ListIconGadget,  10,  50, 480, 250, "Nom du fichier", 400)
    AddGadgetColumn(#ListIconGadget, 1, "Poids ", 80)
    
    ButtonGadget(#Bouton_supprimer, 10, 312, 100, 24, "Supprimer")
    ButtonGadget(#Bouton_copier, 124, 312, 100, 24, "Copier")
    
    ;/ On bride le bouton Suppression par défaut
    DisableGadget(#Bouton_supprimer, 1)
    
EndIf


;- Ma loop
Repeat
    Evenement = WaitWindowEvent()
    
    ;/ Evènements Window
    If Evenement = #PB_Event_CloseWindow
        Select EventWindow() 
                
            Case #Window_principale : Quit = 1
                
        EndSelect    
    EndIf
    
    
    ;/ Evènements Boutons (Gadgets en général)
    If Evenement =  #PB_Event_Gadget
        Select EventGadget()
                
            Case #Bouton_ouvrir
                FichierParDefaut$ = "D:\"   ; Répertoire et fichier par défaut qui seront affichés
                
                Fichier$ = OpenFileRequester("Choisissez un ou plusieurs fichiers à charger", FichierParDefaut$, "", 0, #PB_Requester_MultiSelection)
                If Fichier$
                    
                    While Fichier$
                        
                        Resultat = FileSize(Fichier$) / 1024 ; Valeur en ko en divisant par 1000
                        ;Debug Fichier$ +" : "+ Str(Resultat)
                        
                        ; On ne met que le nom et on supprime le chemin complet du fichier.
                        Fichier$ = GetFilePart(Fichier$) 
                        AddGadgetItem(#ListIconGadget, 0, Fichier$ + Chr(10) + Str(Resultat))
                        
                        Fichier$ = NextSelectedFileName()
                        
                    Wend
                    ;MessageRequester("Information", "Vous avez choisi le fichier suivant :"+ Chr(10) + Fichier$, 0)
                    
                Else
                    MessageRequester("Information", "La sélection a été annulée.", 0)
                EndIf 
                
                ;/ Si la ListIconGadget n'est pas vide alors on débride le bouton "Supprimer"
                nbLigne = CountGadgetItems(#ListIconGadget)
                If nbLigne <> 0
                    DisableGadget(#Bouton_supprimer, 0)
                EndIf 
                
                
            Case #Bouton_supprimer
                ligneSelectionnee = GetGadgetState(#ListIconGadget)
                RemoveGadgetItem(#ListIconGadget, ligneSelectionnee)
                
                ;/ Si la ListIconGadget est vide alors on bride le bouton "Supprimer"
                nbLigne = CountGadgetItems(#ListIconGadget)
                If nbLigne = 0
                    DisableGadget(#Bouton_supprimer, 1)
                EndIf
                
                
            Case #Bouton_copier
                nbLigne = CountGadgetItems(#ListIconGadget) 
                ;Debug nbLigne - 1
                
                ;/ Pour copier dans le presse-papier
                Copy_LIG_to_Excel(#ListIconGadget, 0, 0, (nbLigne - 1), 1)
                
                
        EndSelect
    EndIf
    
Until Quit = 1
- Reste à faire en sorte de n'afficher que le nom du fichier et pas son chemin [Fait].
- Multi-sélection des fichiers [Fait].

Et quelques bricoles.

[EDIT 1] La Multi-sélection des fichiers est faite.
[EDIT 2] L'affichage uniquement du nom de fichier est faite.
[EDIT 3] Avant je divisais par 1000 au lieu de 1024 et du coup je n'avais pas les mêmes valeurs que windows.
[EDIT 4] Ajout du bouton supprimer, mais aussi du bouton copier, pour éviter des problèmes si l'on supprimait ou ajoutait des fichiers.
[EDIT 5] Ajout du bridage du bouton "Suppression" si la "ListIconGadget" est vide.

Publié : dim. 14/juin/2009 21:43
par Geo Trouvpatou
Merci LSI de ta réponse, mais je m'en suis douté par la suite.

En tout cas je suis bien content de ce code de Mytic.
Ca va m'épargner du boulot.

Publié : dim. 14/juin/2009 23:34
par Mytic
Pour la variable a c'est un reste de l'exemple fourni avec la doc :roll: , j'avais pas trop le temps de faire un exemple de l'utilisation de la procédure, donc j'ai pris l'exemple de la doc et je l'ai un peu modifié :)


je compte ajouter plus d'options à la Procédure , genre couleur du texte , et les attributs , mais pour cela je dois décrypter la DATA dans le Clipboard via API !
Merci..

Publié : lun. 15/juin/2009 0:38
par Geo Trouvpatou
Bon j'ai mis mon code à jour dans mon post ci-dessus.

J'ai fait ça pour mon cas personnel, c'est pour cela que j'ai mis D:\ par défaut et que j'ai divisé par 1024 pour avoir la valeur en "Ko" en sachant que je n'ai aucun fichier inférieurs à 1Ko.

Bon ben encore mieux que "WhichFiles_1.0".
Je vais encore faire quelques bidouilles pour que cela fasse ce que je veux et tout roulera.

Trop cool ce petit code Mytic.
Si tu savais le nombre de fichiers auxquels j'ai dû ajouter manuellement le poids.
Rien que d'y penser j'vais tomber dans les pommes.
De plus avec l'autre logiciel, j'aurais dû graver tous mes fichiers sur un DVD pour pouvoir récupérer uniquement les noms.

Je crois que demain je vais carburer.

Bye.

Publié : ven. 26/juin/2009 14:46
par kernadec
bonjour
voila un ptit site très bien fait pour macro Excel:
http://boisgontierjacques.free.fr/index2.htm
avec un exemple XLS sur cette adresse
http://boisgontierjacques.free.fr/fichi ... urseur.xls

cordialement

Publié : sam. 27/juin/2009 23:29
par GeBonet
Salut à tous,

J'ai remarqué un certain intérêt de passer des données de Excel vers PB et inversement.
Excel, Access et d'autres exportent souvent des données en format ".txt"…
J'ai aussi vu que la plupart du temps on utilise beaucoup de fichiers séquentiel…
Dans les deux sens en passant par un arrangement du type ci-après !

Sujet|Titre|NomFamille|Nom Editeur|AnnéeCopyright (<<< les entêtes)
Album enfant|Echappée belle, L'|Sauer|Actes Sud Junior|1998
Album enfant|ABC Dinosaures|Pienkowski|Albin Michel Jeunesse|1994
Album enfant|Pingu le petit fripon|Von Flüe et Wolf|Artis-Historia|1992
Album enfant|Pingu le malchanceux|Von Flüe et Wolf|Artis-Historia|1993
Album enfant|Pingu et ses amis|Von Flüe et Wolf|Artis-Historia|1991
Album enfant|Pingu et sa famille|Von Flüe et Wolf|Artis-Historia|1991
Album enfant|Pingu le magicien|Von Flüe et Wolf|Artis-Historia|1994
Album enfant|Pingu et la rentrée des classes|Von Flüe et Wolf|Artis-Historia|1992

La première ligne étant utilisé comme libellé de chaque colonne séparée par un séparateur :lol: (normal non !)
Ici le caractère "|" … mais pouvant être ";" ou "," ou tout autre caractère non utilisé à l'intérieur d'un champs.

Aussi j'ai réalisé le code suivant à partir de morceaux glanés ci et là… Et arrangé à ma manière.

Le but de ce code est de lire tout fichier organisé comme ci-dessus venant d'exportation Excel, Access et autres et de pouvoir le traiter sous PureBasic. C'est-à-dire "Modifier", "Supprimer", ou même "ajouter" un enregistrement. Ce fichier étant alors accessible aussi via l'importation aux programmes qui l'aurait exporté ou même créer un fichier sous cette forme le gérer sous PB et l'utiliser ailleurs si utile.

Voilà, c'est tout !

PS: Pour tout test du programme vous copier les lignes ci-dessus (en bleu) et les sauver via le bloc notes sous forme "NomFichier.txt" ou vous exporter un de vos fichier Excel en n'omettant pas de donner le séparateur…

Note : Je l'ai commenté autant que je croyais utile, mais bon ce n'est pas forcément suffisant. Tout comme sa structure ou les fonctions utilisée ne sont pas forcément du goût des puristes PB… Mais l'intérêt est peut là aussi, comme quoi on peu écrire ça aussi…

Code : Tout sélectionner

; =============================================================================================
;  Lecture de fichier DIVERS  (.TXT)                                  Vers. 1.1       2009-06-26                                                      *  Gerhard J.   *                         
;  ******************************************************************************************************************************************
;  J'utilise une librairies de GNOZAL : 1- PureLVSORT qui permet de trier les colonnes d'un tableau)
;                                                           2- Procédure de redimensionne l'écran (Resize grace à ProcedureResize.pbi)  Du Forum ??    
;   Merci à eux...... 
; =============================================================================================
;  NOTE : Objet de ce programme est de lire des fichiers séquentiel venant d'autres applications avec la première Ligne descriptive
;               Donc aucune Structure de fichier n'est définie elles sont données par la première ligne du fichier à lire !!!! 
;        
;               Forme = Expression 1 | Expression 2 | E.... | Expression n | Expression n+1 et  "|" étant ICI le séparateur des données ...                            
;
;               Soit, ce que tout gestionnaire de fichiers est normalement capable de produire sous forme "Nom de fichier.TXT"
; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------                     
;  Avec par la suite et après la lecture ..... 
;                                   1- Possibilité de créer un fichier à accès direct et indéxé ou HashCodé ou seulement séquentiel à la sortie                             
;                                   2- Créer un fichier à  Arborescence relationnelle..                                                                              
;                                   3- D'autres formes que je donnerais par la suite...                                               
;                                   4- Ou en faire une base de donnée avec SQlite ou autre !!!
; ==============================================================================================
;  	ATTENTION : 
;   *****************                                                                                                                                                                                                      
;   Dans le programme les données sont luent dans un répertoire relatif au programme qui est  Rep$+"Mes_Data\" 
;   Rep$ étant le répertoire ou se trouve le programme...   
; 
; ==============================================================================================
;  Constantes  *
; -----------------*
Enumeration ;{
    #Fenetre_main=0
    #Fenetre_ajouter=1
    #Fenetre_Init
EndEnumeration;}
Enumeration ;{
    #file               : #Dfiles			:#Liste   
    #bouton_valide    : #bouton_annule
    #bouton_Suivant : #bouton_Precedent    
    #cadre_0
EndEnumeration ;}
Enumeration ;{
    #menu_Ajoute     :   #menu_Modifier
    #menu_Effacer   :   #menu_Sauver
    #menu_Quitter    :   #menu_Infos
EndEnumeration ;}
;{ ----------------------        GLOBAL --------------------------------------------------
    Global Modification, NonOk, MaxL=10,  Ref, IndexFiltre                                ; Flags 
    Global Nbr_Enreg , Nbr_Champs, Nb_Colonne, ligne, PremiereCol           ; 
    Global Lng_Enreg , LgMax, nMax, PosX, PosY, PosYDep
    Global Hauteur_Fenetre, HauteurBouton, Milieu
        
    Global Rep$, NomFile$, RepData$, FichierParDefaut.s
    Global Enreg$, Separateur$, TitreFichier$
    Global Cr$=Chr(10)+Chr(13)
    
    Global Dim Tableaux.s(MaxL)
    Global Dim TableFichier.s(10,MaxL)
    Global Dim Lg_Table.i(j)
    Global Dim Lng_Champs.i(MaxL)
    
    Define.L Event, EventWindow, EventGadget, EventType, EventMenu
;}    
; ***************************************************************************************
;  XIncludeFile "Mes_Pbi\ProcedureResize.pbi"
;  OU les deux procédures Ci-Dessous ....  sous le nom de "ProcedureResize.pbi"
;****************************************************************************************
;  Procédures de redimensionnement de la fenêtre  
; ************************************************************
Procedure sauve_taille_gadget(id_window,nb_max_gadget)
   
    Structure gadget
        id.L
        x.L
        y.L
        L.L
        h.L
    EndStructure

    Global Dim gadget.gadget(1)
    nb_gadget=0
    For num_gadget=0 To nb_max_gadget ; #PB_Compiler_EnumerationValue
        If IsGadget(num_gadget)
            ;Debug num_gadget
            nb_gadget=nb_gadget+1
            ReDim gadget.gadget(nb_gadget)
            gadget(nb_gadget)\id=num_gadget
            gadget(nb_gadget)\x=GadgetX(num_gadget)
            gadget(nb_gadget)\y=GadgetY(num_gadget)
            gadget(nb_gadget)\h=GadgetHeight(num_gadget)
            gadget(nb_gadget)\L=GadgetWidth(num_gadget)
        EndIf
    Next
    gadget(0)\id=nb_gadget
    gadget(0)\h=WindowHeight(id_window)
    gadget(0)\L=WindowWidth(id_window)
EndProcedure
;                        Redimentionnement
Procedure resize_gadget(id_window)
    hw=gadget(0)\h
    lw=gadget(0)\L
    nhw=WindowHeight(id_window)
    nlw=WindowWidth(id_window)
    For num_gadget=1 To gadget(0)\id
        If IsGadget(gadget(num_gadget)\id)
            nx=gadget(num_gadget)\x*nlw/lw
            ny=gadget(num_gadget)\y*nhw/hw
            nh=gadget(num_gadget)\h*nhw/hw
            nl=gadget(num_gadget)\L*nlw/lw
            ResizeGadget(gadget(num_gadget)\id,nx,ny,nl,nh)
        EndIf
    Next
   
EndProcedure
; ===================================================================
;{  --------------------               DECLARATION                          ----------------------------------
;    
    Declare Main_0(ww,wh)
    Declare LectureFichier()      
    Declare Ajoute_Enregistrement()
    
    Declare RemoveGadget()
    Declare Sauver()
    Declare Nouvelle()
    Declare AfficheModification()
;}
;{ ==============     Préhambule       ======================================
    ecranx = GetSystemMetrics_(#SM_CXSCREEN) ;  Largeur de l'écran Si on veux partir de dimension relative au dimensions réelles... !!!
    ecrany = GetSystemMetrics_(#SM_CYSCREEN) ;  Hauteur   ""     ""
    Largeur=600:Hauteur=260:Milieu=Largeur/2
    ;
    Orig_X=ecranx/2-Largeur/2:     Orig_Y=ecrany/2-Hauteur/2-100     ;  Nouveau coin sup gauche... Milieu +/-
    ;
    If OpenWindow(#Fenetre_Init,Orig_X,Orig_Y,Largeur,Hauteur+20,"",#PB_Window_BorderLess )
        ;
        Gosub Message0                                  ; Les textes 
        TextGadget(85,60,10,500,30,Text0$)
        SetGadgetFont(85,LoadFont(85, "Comic Sans MS", 16))
        SetGadgetColor(85,#PB_Gadget_FrontColor, $E25048) 
        ;     
        TextGadget(97,30,40,Largeur-60,Hauteur-60,Text$,#PB_Text_Border)
        SetGadgetColor(97, #PB_Gadget_BackColor, $7CF7FC)
        SetGadgetFont(97, LoadFont(97, "Arial", 11, 16))
        ButtonGadget(99,30+10, Hauteur-10,60,20, "Arrêter ?" )
        ButtonGadget(98,Largeur-100,Hauteur-10,60,20, "Continuer ?" )
        Repeat
            Select WaitWindowEvent ()       ;  Traite les boutons....
                 Case #PB_Event_Gadget
                     Select EventGadget ()      ; Selectionne en fonction de ....???
                        Case 99                          ; VALIDE         
                            OK=2        
                        Case 98                          ; Arreter
                            OK=1        
                    EndSelect
            EndSelect                
        Until OK<>0
        If OK=2:End:EndIf    
        sauve_taille_gadget(#Fenetre_Init,100) ;100 c'est le nombre de gadget max, comme dans mes programme l'énumeration 
    EndIf
    ; ----------------------------------------------------------------------------------------------------
    Rep$=GetPathPart(ProgramFilename())  ; Repertoire actuel du programme.
	RepData$="Mes_Data\"                            ; Répertoire relatif
	Rep$+RepData$                                       ; Composition du répertoire complet du fichier                   
	SetCurrentDirectory(Rep$)                       ; Permet de stabiliser le répertoire... 
	; 	
	NomFile$+"|*.txt":Typ$=".txt"        
	IndexFiltre = 0 
	NomFile$ = GetFilePart(OpenFileRequester("Choisissez le nom de votre bibliothèque", FichierParDefaut, NomFile$, IndexFiltre))
	TitreFichier$=Left(NomFile$,FindString(NomFile$,Typ$,1))
	If Len(TitreFichier$)=0:End:EndIf                                        ; Arrêt par defaut de nom....
	Debug Rep$
	Debug NomFile$
    ; ------------------------------------------------------- 
    Saisie$ = InputRequester("InputRequester","Donnez le séparateur ( | , ou point-virgule, vigule ou autre ) : ","|")
    Separateur$=Saisie$
    If Saisie$ > ""
        a$ = " Vous avez donné comme séparateur :" + Chr(10)  ; Chr(10) nécessaire seulement
        a$ + Saisie$                                                             ; pour faire un saut de ligne
    Else 
        a$ = " La saisie a été annulée ou il n'y a pas de séparateur ":KKKo=1
    EndIf
    MessageRequester("Information",a$,0)
    CloseWindow(#Fenetre_Init)
    If KKKo=1:End:EndIf                                             ; Pas de Séparateur
  ; ----------------------------------------------------------------------------------------
;}   
;========================================================================
;                      ****   Boucle du programme  principal ****
;========================================================================
    LectureFichier()         ; Chargement du fichier 
    ww=570 :wh=335      ; Dimensions de la fenêtre principale....  POUR utiliser la fenêtre redimensionnable !!!! 
    Main_0(ww,wh)  		   ; Fenêtre principale
;========================================================================
;                                           * P R O C E D U R E S *    
; ==========================================================================
;  Procedure de lecture d'un fichier séquentiel avec première ligne descriptive (libellé des colonnes)
;  et chaque donnée séparée par un MARQUEUR définit et connus... Fichier excell ou autre par exemple
;  Utilisation de Tableaux une DIM pour lire les enregistrements et DIM (I,J) pour Ligne et Colonne...
; ==========================================================================
; *********************************************************************************
;           *************    Procedure d'affichage de fenetre      *************     
; *********************************************************************************
Procedure Main_0(ww,wh)

    ValOptions = 0
    ValOptions | #PB_Window_SizeGadget        : ValOptions | #PB_Window_MinimizeGadget 
    ValOptions | #PB_Window_MaximizeGadget:ValOptions | #PB_Window_SystemMenu      
    ValOptions | #PB_Window_ScreenCentered ;:ValOptions | #PB_Window_TitleBar
    ;
    If OpenWindow(#Fenetre_main,0,0,ww,wh,"Lecture de "+TitreFichier$,ValOptions)
        ; ---------------------- Menu Barre ----------------------------------------------------
        If CreateMenu(0,WindowID(#Fenetre_main))   ;   Le Menu
            MenuTitle("Fichier")
            MenuItem(#menu_Ajoute,"Ajoute une Fiche")
            MenuItem(#menu_Modifier,"Modifier une Fiche")
            MenuItem(#menu_Effacer,"Effacer une Fiche")
            MenuItem(#menu_Sauver,"Sauvergarde la liste")
            MenuItem(#menu_Quitter,"Quitter")
            MenuTitle("Aides/Infos")
                MenuItem(#menu_Infos,"Informations")
        EndIf
        ; ---------------------- Status Barre ----------------------------------------------------
        Lgww=ww/3-10  
        CreateStatusBar(0,WindowID(0))
        If CreateStatusBar(0, WindowID(0))
            AddStatusBarField(Lgww-20)
            AddStatusBarField(Lgww+20)
            AddStatusBarField(#PB_Ignore)
            ; --------------------------------------------
            Statu01$="Nombre de Champs : "+Str(Nb_Colonne)+".."
            Statu02$="Nombre d'enregistrements : "+Str(ligne)+".."
            StatusBarText(0, 0, Statu01$)
            StatusBarText(0, 1, Statu02$)
            StatusBarText(0, 2, "  Affichage Automatique selon fichier lus ! ") 
         EndIf
        ;-------------------------- La grille des données ------------------------------------
        ; PART 1                
        For j=1 To Nb_Colonne                                           ;             Première Ligne et première colonne... ENTETE
            Mot$=TableFichier(1,j)
            If j=1
                Caract=0
                Caract | #PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes
                Caract | #PB_ListView_Clickselect|#PB_ListIcon_FullRowSelect
                Caract | #PB_ListIcon_AlwaysShowSelection:Mot$=Right(Mot$,Lg_Table(1)+2)
                ListIconGadget(#Liste,10,20,ww-10,wh-70,Mot$+":",25+Lg_Table(j)*6,Caract)
            Else
                AddGadgetColumn(#Liste, j ,Mot$+":",20+Lg_Table(j)*4) ;
            EndIf
        Next j
        ;  * * * * * * * * * * * * * * * * * * * * * AFFICHAGE dans la grille du fichier * * * * * * * * * * * * * * * * * * *        
        ; PART 2
        For i=2 To ligne                                                      ;                   Autres Lignes et colonnes                 DONNEES
            Verifie$=""
            For j=1 To Nb_Colonne
                Verifie$+TableFichier(i,j)+Chr(10) 
            Next j
			; Passage du tableau vers ListeGadget
            Verifie$+TableFichier(ligne,Nb_Colonne)
            AddGadgetItem ( #Liste ,-1,Verifie$)            
        Next i
        ; Préserve pour redimensionnement dans module "ProcedureResize.pbi"
        sauve_taille_gadget(#Fenetre_main,100) ;100 c'est le nombre de gadget max, comme dans mes programme l'énumeration 
        ;
    EndIf
    
EndProcedure
;
;{=========   Boucle PRINCIPALE       ===============================================
	; Initialise pour triage... 
	PureLVSORT_SelectGadgetToSort(#Liste, #True) 
	If PureLVSORT_SelectGadgetToSort(#Liste, #True) = #PureLVSORT_Ok
		For j=1 To Nb_Colonne                     ;             Première ligne et première colonne... ENTETE
			;Type=TableType(j)			            ;             Prise du type si necessaire pour définir les différents type de tri pour les colonnes....
			NomChamp$=TableFichier(1,j)		;             Prise du nom d'entête 
			If FindString(NomChamp$,"Date",1)<>0   ; C'EST une date... Alors   
				PureLVSORT_SetColumnType(#Liste, j-1, #PureLVSORT_DateDDMMYYHHMM) ; On fixe un format date pour le trie de cette colonne.
			Else												         	; #PureLVSORT_DateDDMMYYYY					
				PureLVSORT_SetColumnType(#Liste, j-1, #PureLVSORT_String) ; default, not necessary
			EndIf
		Next j
	EndIf
	;=============================================================================
    Repeat
		Event = WaitWindowEvent()
		If EventType() = #PB_EventType_LeftDoubleClick 
			PureLVSORT_ClearGadget(#Liste)
		Else
			Select Event
				Case #PB_Event_Menu ;
					Select EventMenu()
					
						Case #menu_Ajoute       ; Procédure nouvelle adresse...
							Modification=0             ; Flag  pas de Modif.. Mais Nouvelle fiche à créer... 
							Nouvelle()                    ; Effectue Saisie des données 
							Sauver()                      ; Procédure pour SAUVER après AJOUT
							; ------------------------------------------------------------------  Note : Après chaque modification du fichier il est sauvé !!! 
							Main_0(ww,wh)           ; Fenêtre principale
							LectureFichier()           ; Chargement du fichier 
						Case #menu_Modifier     
							Modification=1             ; Flag de Modif.. Mais procédure ID Nouvelle
							Nouvelle()                    ; Effectue Modif..
							Modification=0 :Ref=0 ;  Remets les Flags à 0  
							Sauver()                      ; Procédure pour SAUVER après MODIF
							;-------------------------------------------------------------------
							Main_0(ww,wh)           ; Fenêtre principale
							LectureFichier()           ; Chargement du fichier 
						Case #menu_Effacer     ; Procédure pour effacer une adresse marquée
						    ;
							RemoveGadget()        ; Après avoir retiré de la liste les élément
							Sauver()                      ; Marqués on sauve le fichier ....  EFFACEMENT  
							;-------------------------------------------------------------------
							Main_0(ww,wh)           ; Réaffiche origine..
							LectureFichier()          ; Chargement du fichier 
						Case #menu_Sauver
			    			NomFichier$ = InputRequester("Pour changer le nom du fichier !!!! ","Accepter ou changer le nom du fichier :",NomFile$)
                            NomFile$=NomFichier$
							Sauver()                     ; Procédure pour SAUVER le fichier
							LectureFichier()         ; Chargement du fichier 
					    Case #menu_Infos        ;
					        Gosub  message      ; Composition du message 
					        MessageRequester(Info$, Message$,#PB_MessageRequester_Ok)
						Case #menu_Quitter    ; Procédure pour QUITTER et SAUVER
							fermer_window0=1
						EndSelect
				Case #PB_Event_CloseWindow
					fermer_window0=1
				Case #PB_Event_SizeWindow       ; Redimensionne la fenêtre proportionellement 
					resize_gadget(0)                                       
			EndSelect
		EndIf
    Until fermer_window0=1
    
End ;}   
;
;---------------------------------------------------------------------------------------------
;               Lecture d'un Fichier 
;---------------------------------------------------------------------------------------------
Procedure LectureFichier()                         ; Lecture d'un fichier ".txt" avec délimiteurs connus dans "Marque$"
    ;                                                                 ; Et formatage des données des titres + prise de paramêtres 
    Marque$=Separateur$                              ; Séparateur introduit si c'est le cas .... 
    ligne=0:If Marque$="":Marque$="|":EndIf  ; Paramètres utile... avec Marque$="|" par defaut
    ;
    If OpenFile(#file,Rep$+NomFile$)<>0       ; Ouverture du fichier possible ??? +".txt"
        OpenFile( #file,Rep$+NomFile$)            ; OUI alors on y va +".txt"
        ;                                                                                       -------------------------------------------------------------------------
        While Eof (#file )=0                                                        ; Chargement du fichier complet  dans Tableaux.s(MaxL)
            ;                                                                                   -------------------------------------------------------------------------
            Reccord$=ReadString (#file )                                     ; lecture de l'enregistrement                           
            LgEnregActuel.Q=Len(Reccord$)                              ; Mesure de l'enrefistrement lu
            If LgEnregActuel>LgLgEnregAbsolu                           ; Est-il plus le plus grand  ? 
                LgLgEnregAbsolu=LgEnregActuel                          ; Oui on le garde comme tel   
            EndIf                                                                           ; ---------------------------------------     
            ligne+1                                                                       ; Nombre d'enregistrement 
            ;                                                                                   ; ------------------------------------- 
            If ligne<2                                                                    ;  
                Nb_Champs = CountString(Reccord$,Marque$)   ;  Nombre de champs ??       
                If Right(Reccord$,1)<>Marque$                            ;  Il y a t'il un CHAMP après le dernier séparateur à la fin.... ??? 
                    Nb_Champs=Nb_Champs+1                            ;  si OUI on ajoute un champs... 
                EndIf 
                Nb_Colonne= Nb_Champs                                    ;    Copie dans Nb_Colonne
            EndIf                                                                           ; 
            If ligne>MaxL                                                             ; -  Le total de ligne dépasse le dimension Maximum
                MaxL+1                                                                   ;    Augmente d'une ligne 
                ReDim Tableaux.s(MaxL)                                      ; -  Alors on augmente le maximum de "MaxL"
                ReDim Lg_Table.i(MaxL)                                       ;
            EndIf
            Tableaux(ligne)=Reccord$                                       ; -   Mémorisons de chaque enregistrement
        Wend
        ; --------------------------------------------------------------------------------------------------------------------------------------------
        ; Transfert des enregistrements de Tableaux.s(MaxL) dans un tableau deux dimensions TableFichier( i , j )
        ; --------------------------------------------------------------------------------------------------------------------------------------------
        Global Dim TableFichier.s(ligne+2,Nb_Colonne)       ; Dimension réelle du fichier... + 2 Ligne pour Ajout SI UTILE ! Cela parce que :
        ;                                                                                      ; IMPOSSIBLE en PB de Redimensionner Ligne dans TableFichier( Ligne,Nb_Colonne)
        Global Dim Lng_Champs(Nb_Colonne)                      ;  ********************************************************************************************  
        nMax=Len(Str(ligne))												       ; nombre de caractère utile pour représentanter le nombre de ligne du fichier...
		;             
        For i=1 To ligne                                                                       ; De 1 jusqu'au Nombre de ligne    
			Enreg$=Tableaux(i)	                	         	                           ; laissant tel quel
            For j = 1 To Nb_Colonne                                                      ; Nombre de colonne à charger ( J )
                TableFichier(i,j)=StringField(Enreg$, j, Marque$)              ; extraction de chaque colonne
                If i=1:Lng_Champs(j)=Len(TableFichier(i,j)): EndIf          ; Memorise la longueur des titres
                ;
                If i>1                                                                                   ;  SI i > 1 ALORS 
                    LongueurDutitre=Lng_Champs(j)                                  ; Longueur du Titre (entête de colonne)
                    LgChampActuel=Len(TableFichier(i,j))                          ; <<<  Longueur actuelle ============ *
                    If LongueurDutitre>=LgChampActuel                            ; Longueur du Titre > Celle champs actuel
                        LgChampActuel=LongueurDutitre                              ; Oui alors Titre devient plus grande longeur
                    EndIf                                            
                    ;                                                                                       ; Le champ actuel est-il plus grand que celui enregistré ?   
                    If LgChampActuel>Lg_Table(j)                                       ; Si OUI il devient la plus grande longueur de champs 
                        Lg_Table(j)=LgChampActuel                                      ; En principe on sort avec une table Lg_Table(j) contenant                
                    EndIf                                                                                ; les plus grande longueur de contenu de chaque colonne                                       
                    If Lg_Table(j)>LgMax
                        LgMax=Lg_Table(j)                                                      ; et ici avec le plus grand champs             
                    EndIf
                    ;                                                                                       ;
                    If j=1  And Val(TableFichier(i,1))<>0                              ; Si j=1  Alors je cale à droite 
                        TableFichier(i,1)=RSet(Trim(TableFichier(i,1)),Lg_Table(1))
                    EndIf
                EndIf
            Next j
            ;                                                                                                ; 
        Next i                                                                                           ; 
    EndIf
  
EndProcedure
;---------------------------------------------------------------------------------------------
;               Efface un enregistrement 
;----------------------------------------------------------------------------------------------------------------------
Procedure RemoveGadget()          ; **** Effacer les éléments avec Check_Box = ON ****
    
    Protected i.L,total_item.L   ; ---------------------------------------------
    total_item=CountGadgetItems(#Liste)-1                                  ; Nombre d'élément dans la liste 
    For i=total_item To 0 Step -1                 ; Recherche l'élément coché..
        If GetGadgetItemState(#Liste, i) & #PB_ListIcon_Checked
            Ok=1:Ref=i+2                                   ; Mémorise l'indice (Ref + 2 = 1 pour les titre et 1 pour la première ligne des gadgets)
            Break                                                ;  Trouvé on sort de boucle....
        EndIf
    Next i          ;   ================
    ;                   ;    Trouvé on Efface       ; Debug TableFichier(Ref,1)+"  =  "+TableFichier(Ref,2)
    If Ok=1       ;   ================
        For k=Ref To ligne-1                                 ; On Efface l'élément du ListIconGadget
            For j=1 To Nb_Colonne
                TableFichier(k,j)=TableFichier(k+1,j) ; decallage tableau 
            Next j                              
        Next k
        ligne-1:Ok=0                            
    Else
        MessageRequester("Information","La fiche non trouvée et non effacée ? ")        
    EndIf
    
EndProcedure
;-----------------------------------------------------------------------------------------------------------------------
;                      Ajoute / OU / Modifie une fiche ....
;-----------------------------------------------------------------------------------------------------------------------
Procedure Nouvelle()  ; ***   Ouverture de la Fenêtre d'Ajout ou Modification de donnée   ****
     
    HauteurBouton    =20                                 ; LgMax = Longueur du plus grand champs 
    ;                                                                  ; Container 
    H_Frame            = Nb_Colonne * 30         ; La hauteur = Nombre de colonne * 20 pour le champs + pour entre champs = 30
    L_Frame            = (100+LgMax)*2            ; Largeur de la fenêtre 2 fois le plus grand champs + les bord (2 fois 50)
    ;
    Largeur_fenetre  = L_Frame+20             ; Largeur de la fenêtre 
    Hauteur_Fenetre= H_Frame+HauteurBouton + 20+30 ; 30= Hauteur Titre
    ;
    Deb_Frame=30
    PosYBouton       =Hauteur_Fenetre-30       :Xt=25
    DebuChamps     =55             
    IndiceString        =DebutChamps+Nb_Colonne+1
    ; 
    If Modification=1 : ENTETE$="Modification":Else:ENTETE$="Nouvelle entrée":EndIf
    ; 
    ;--------------------------------------------------------------------------------------------------------------------------------
    If OpenWindow(#Fenetre_ajouter,0,0,Largeur_fenetre,Hauteur_Fenetre,ENTETE$,#PB_Window_TitleBar|#PB_Window_ScreenCentered)
        ; Ici ce sera uniquement pour les champs donc idem mais sans boutons ni bordure... 
          
        TextGadget(96,Largeur_fenetre/2-50,10,100,20,Nomfile$)
        Frame3DGadget(#cadre_0,10,Deb_Frame,L_Frame ,H_Frame ,"", #PB_Frame3D_Double) ; Largeur_fenetre-20; Hauteur_Fenetre-40
        ;
        PosYDep=35:Milieu=(L_Frame -20)/2 ; Largeur_fenetre
        PosY=PosYDep
        For i=1 To Nb_Colonne
            Titre$=TableFichier(1,i)                        
            TextGadget(DebuChamps+i,   15, PosY, Milieu-15,20,Titre$)  
            StringGadget(IndiceString+i, Milieu-10, PosY,120+Lg_Table(i),20,"")   ; 100+LgMax*2
            PosY+30
        Next i
        If Modification=0
            Num$=RSet(Str(Ligne+1),Lg_Table(1))
            StringGadget(IndiceString+1, Milieu-10, PosYDep,120+Lg_Table(1),20,Num$)   ;
        EndIf
        ;                                                                      ; Modification demandé pour l'éléments selectionné  
        If Modification=1                                            ; Recherche de la fiche selectionné 
            Nb_item.w=CountGadgetItems(#Liste)-1 ; pour compter l'élément 0
            For i=Nb_item.w To 0 Step -1                 ; Recherche l'élément coché..
                If GetGadgetItemState(#Liste, i) & #PB_ListIcon_Checked
                    Ok=1:Ref=i+2                                    ; Mémorise l'indice (Ref + 2 = 1 pour les titre et 1 pour la première ligne des gadgets)
                    Break                                                ;  Trouvé on sort de boucle....
                EndIf
            Next i      
            ;  =========================
            ;                  ;    Trouvé on affiche .... 
            If Ok=1       ;   ================
                PosY=PosYDep         
                For i=1 To Nb_Colonne
                    Enreg$=TableFichier(Ref,i)              ; Position dans ListGadget (0 pas utilisé ici + 1 pour première ligne des tires...          
                    StringGadget(IndiceString+i, Milieu-10, PosY,120+Lg_Table(i),20,Enreg$)
                    PosY+30
                Next i       
                Ok=0                             ; Modification alors Affichage du contenu....
            Else
                MessageRequester("Information","Impossible de modifier le fichier!")
            EndIf                                                           
        EndIf
        ;
        ;ButtonGadget(#bouton_Precedent,10,10,50,20," <<=")     
        ;ButtonGadget(#bouton_Suivant,Largeur_fenetre-60,10,50,20,"=>> ")
        
        ButtonGadget(#bouton_valide,   20,PosYBouton+5,120,20,"Valider")     
        ButtonGadget(#bouton_annule,Largeur_fenetre-140,PosYBouton+5,120,20,"Annuler")
    EndIf
    ;---------------------------------------------------------------------------------------
    ;*************   Après la saisie de la nouvelle fiche on ajoute a la liste  ***********
    ;---------------------------------------------------------------------------------------
    ;
    Repeat
        Select WaitWindowEvent ()       ;  Traite les boutons....
             Case #PB_Event_Gadget
                 Select EventGadget ()       ; Selectionne en fonction de ....???
                    Case #bouton_valide                      ; VALIDE         POUR modif OU ajout 
                        If Modification=1                          ; Effectue une MODIFICATION dans la liste en  REF
                            For i=1 To Nb_Colonne          ; ------------------------------------------------------------------
                                TableFichier(Ref,i)=GetGadgetText (i+IndiceString)     
                                Debug TableFichier(Ref,i)   
                            Next i       
                            Modification=0
                        Else                                              ; OU AJOUTE une NOUVELLE à la LIGNE +1 
                            Ligne+1                                     ; ------------------------------------------------------------------  
                            For i=1 To Nb_Colonne
                                TableFichier(Ligne,i)=GetGadgetText (i+IndiceString)     
                            Next i       
                        EndIf                                         
                        Fermer_window1=1   
                    Case #bouton_annule                     ; Annule l'entrée
                        Fermer_window1=1
                    Case #bouton_Suivant                   ; Suivant
                        Ref+1:Modification=1
                        AfficheModification()
                    Case #bouton_Precedent               ; Précédent
                        Ref-1:Modification=1
                        AfficheModification()
                EndSelect
        EndSelect
    Until Fermer_window1=1
    CloseWindow ( #Fenetre_ajouter )                 ; Fermeture de la fenêtre ajoute...
     
EndProcedure

Procedure AfficheModification()

EndProcedure
;----------------------------------------------------------------------------------------------------------------------
;               Sauve l'état du fichier 
;----------------------------------------------------------------------------------------------------------------------
Procedure Sauver()
     
    If CreateFile (#file ,Rep$+NomFile$) ;  Recréation du fichier 
        For i=1 To Ligne
            Enreg$="":Ajout$=Separateur$
            For j=1 To Nb_Colonne-1
                Enreg$+TableFichier(i,j)+Ajout$  
            Next j
            Enreg$+TableFichier(i,j) 
            WriteStringN(#file,Enreg$)
       Next
       CloseFile (#file)
    Else
        MessageRequester("Information","Impossible de créer le fichier!")
    EndIf
EndProcedure
;----------------------------------------------------------------------------------------------------------------------
Message0: ;{  Introduction 
        Text0$="Gestion de fichier format .Txt avec séparateurs"
        ;
        Text$="Ce programme lit les fichiers dont la première ligne est composée des descripteurs de colonnes." 
        Text$+"Ces descripteurs tout comme les colonnes seront séparés par des marqueurs tel que 'I' ou ';' ou "
        Text$+"tout autre caractère ne pouvant être confondu avec un élément des données qu'il doit séparer ! "
        Text$+"Il va donc vous être demandé de choisir un fichier et le séparateur qui est utilisé pour séparer les champs."
        Text$+Chr(10)+Chr(13)+Chr(13)
        Text$+"Ce programme a pour intérêt de travailler sur des fichiers sauvés à partir d'Excel, Access ou tout autre "
        Text$+"programme capable d'exporter ses fichiers sous format '.txt' ou assimilé et d'y inclure des séparateurs"
Return ;}
;----------------------------------------------------------------------------------------------------------------------
message: ;{  d'aides
    Info$="Aides et Informations"
    Message$=" 1- Si vous voulez avoir accès à une fiche pour Modifier"+Cr$
    Message$+"     ou Supprimer il suffit de cocher la fiche concernée"+Cr$
    Message$+" 2- Pour ordonner (trier) le fichier selon l'ordre croissant"+Cr$
    Message$+"     ou décroisssant Clicker sur l'entête"+Cr$
    Message$+" 3- Faire votre choix selon les options du MENU"+Cr$
    Message$+"     ======================================="+Cr$
    Message$+"     Les séparateurs peuvent-être des ',' ou ';' ou tout autre "+Cr$
    Message$+"     caractère n'étant pas inclus dans les données du fichier"+Cr$
    Message$+"     En espérant avoir été assez clair..."+Cr$
    Message$+"                                     "+Cr$
    Message$+"                                                                                  Merci"+Cr$
Return ;}
; ***************************************************************************************************************************
; IDE Options = PureBasic 4.31 (Windows - x86)
; CursorPosition = 412
; FirstLine = 95
; Folding = Agw
; HideErrorLog
; CurrentDirectory = C:\0 0 PureBasic30\PureBasic\
; CompileSourceDirectory
Voilà, voilà... Pour moi, il est fonctionnel, largement améliorable, c'est à vous !
GeBonet :)

Publié : lun. 29/juin/2009 10:50
par popstatic
Bonjour Bonjour à tous!

Il n'y a pas très longtemps j'ai voulu créer des fichiers compatibles excel, sans que l'on ai besoin de spécifier de séparateur (genre ; | # etc...) pour les champs, bref plus "user-friendly"

depuis Office XP (peut-être même avant) le xml est pris en charge.

Le mieux est de créer un fichier comme cela:


En-tête (pas besoin de la modifier):

Code : Tout sélectionner

<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>popstatic</Author>
  <LastAuthor>popstatic</LastAuthor>
  <Created>2009-06-10T15:31:21Z</Created>
  <Company>Euro Information</Company>
  <Version>10.2625</Version>
 </DocumentProperties>
 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  <DownloadComponents/>
  <LocationOfComponents HRef="file:///E:\"/>
 </OfficeDocumentSettings>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>6660</WindowHeight>
  <WindowWidth>10395</WindowWidth>
  <WindowTopX>120</WindowTopX>
  <WindowTopY>60</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Feuil1">
Nombre de colonnes/lignes: (XXX = nombre de colonnes, YYY = nombre de lignes)

Code : Tout sélectionner

<Table ss:ExpandedColumnCount="XXX" ss:ExpandedRowCount="YYY" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="120">
Titres de colonnes:

Code : Tout sélectionner

<Row>
    <Cell><Data ss:Type="String">Nom</Data></Cell>
    <Cell><Data ss:Type="String">Prénom</Data></Cell>
    <Cell><Data ss:Type="String">Hôpital</Data></Cell>
    <Cell><Data ss:Type="String">Adresse</Data></Cell>
    <Cell><Data ss:Type="String">Code Postal</Data></Cell>
    <Cell><Data ss:Type="String">Ville</Data></Cell>
    <Cell><Data ss:Type="String">Téléphone</Data></Cell>
    <Cell><Data ss:Type="String">Email</Data></Cell>
    <Cell><Data ss:Type="String">Evenement</Data></Cell>
    <Cell><Data ss:Type="String">Cocktail</Data></Cell>
</Row>
Ensuite on met autant de fois le bloc ci dessous qu'il y a de lignes dans la table (en oubliant pas de bien mettre les valeurs):

Code : Tout sélectionner

<Row>
    <Cell><Data ss:Type="String">nom$</Data></Cell>
    <Cell><Data ss:Type="String">prenom$</Data></Cell>
    <Cell><Data ss:Type="String">hopital$</Data></Cell>
    <Cell><Data ss:Type="String">adresse$</Data></Cell>
    <Cell><Data ss:Type="String">code_postal$</Data></Cell>
    <Cell><Data ss:Type="String">ville$</Data></Cell>
    <Cell><Data ss:Type="String">telephone$</Data></Cell>
    <Cell><Data ss:Type="String">email$</Data></Cell>
    <Cell><Data ss:Type="String">event$</Data></Cell>
    <Cell><Data ss:Type="String">cocktail$</Data></Cell>
</Row>
Puis on met ce code de fin de fichier (fermeture de balises, autres informations etc...)

Code : Tout sélectionner

 </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0.4921259845"/>
    <Footer x:Margin="0.4921259845"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <Selected/>
   <Panes>
    <Pane>
     <Number>3</Number>
     <ActiveRow>1</ActiveRow>
     <ActiveCol>2</ActiveCol>
    </Pane>
   </Panes>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Feuil2">
  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="60"/>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0.4921259845"/>
    <Footer x:Margin="0.4921259845"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Feuil3">
  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="60"/>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0.4921259845"/>
    <Footer x:Margin="0.4921259845"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 </Workbook>
On enregistre le fichier au format *.xls

Ca n'est pas la "bonne" structure de fichier pour les *.xls mais Excel le détecte et reconnais quand même donc c'est tout benef.

J'espère que ça pourra vous aider.

NB: dans cet exemple j'ai mis 10 colonnes et 1 ligne, mais ça peut être ce que vous voulez bien entendu.
NB2: toutes ces portions de XML doivent être simplement concaténées et mises dans le fichier (seul le bloc des données est répété autant de fois que nécessaire.

Publié : lun. 29/juin/2009 11:22
par GeBonet
Merci,

A tout hasard, ce code que j'ai posté ci-dessus, n'est pas spécialement dédié à Excel mais à un ou l'autre fichier qui serait produit sous forme "*.txt" et présenté sous la forme ci-dessus ce que la plupart des logiciels peuvent faire, y compris PB... Voir créer ou utiliser un fichier de ce type... :)