Générer des fichiers Excel XP/2002/2003

Programmation d'applications complexes
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Générer des fichiers Excel XP/2002/2003

Message par Flype »

J'avais besoin pour le taf de faire une include pour générer un classeur Excel. Dans le passé les classeurs Excel d'Office était dans un format propriétaire (BIFF) tellement propriétaire qu'il était très difficile de générer à la volée des classeurs. Toutefois, ca reste possible - même pour PureBasic - voir ici : http://www.purebasic.fr/english/viewtop ... ight=excel

Mais depuis quelques versions (XP il me semble) les classeurs de MS Office peuvent être au format XML. Un fichier XML avec l'extension habituelle .XLS
Du coup, il devient facile de créer un générateur d'autant plus que la documentation Microsoft est disponible sur MSDN.

C'est juste un début. Il y a l'include et un fichier d'exemple.

Pensez vous que çà vaut le coup de continuer à améliorer cette lib ?

PureXLS -> UserLib_PB40_PureXLS.zip
Image

Entête de l'include (PureXLS.pbi) :
;-
;- File: PureXLS.pbi
;- Version: 0.1 - October 2006
;-
;- Author: flype
;- Contact: mailto:flype44@gmail.com
;-
;- Compiler: PureBasic 4.0
;- HomePage: http://www.purebasic.com
;-
;- Description: API for writing - not reading - Microsoft Office Excel documents
;- The file format is in XML and only support Microsoft Office XP, 2002, 2003, or better.
;-
;- XML in Excel and the Spreadsheet Component
;- MSDN: http://msdn.microsoft.com/library/defau ... mlinss.asp
;-
et voici en gros comment les balises XML d'un classeur Excel sont organisées :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?>

<Workbook>
    
    <Styles>
        <Style>
            <Alignment/>
            <Borders>
                <Border/>
            </Borders>
            <Font/>
            <Interior/>
        </Style>
    </Styles>
    
    <Worksheet>
        <Table>
            <Column/>
            <Row>
                <Cell>
                    <Data/>
                </Cell>
            </Row>
        </Table>
    </Worksheet>

</Workbook>
Image
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Re: Générer des fichiers Excel XP/2002/2003

Message par lionel_om »

Flype a écrit :Pensez vous que çà vaut le coup de continuer à améliorer cette lib ?
Oui bien sûr, faudrait aussi prévoir une doc et pas mal d'exemples explicatifs. Mais c'est super bien déjà !!!
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Smartfx
Messages : 10
Inscription : mer. 23/avr./2008 12:08

Purexls

Message par Smartfx »

Est-ce qu'il existe une version plus récente ou ce projet en est rester la.
j'aimerais pouvoir exporter des informations provenant d'une base de données, mais je doit contrôler excel. mise en page, en-tête, pied de page, fusion de cellule. La librairie de pureXls est la beta et déja je trouve cela très bien.
merci d'avance.
Avatar de l’utilisateur
MetalOS
Messages : 1498
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Message par MetalOS »

oui moi aussi ça m'intéresse cette lib.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

c'est clair !!

pouvoir remplir a la main une feuille de tableur
pour ensuite l'exploiter dans un logiciel (jeux ou autre)
c'est plus parlant d'inscrire
'ennemi' ' 20' etc .... dans une feuille d'un tableur
pour ensuite l'exploiter dans un logiciel , que d'avoir une myriades de variables, pas toujours bien classé dans un prg :)



rien que pour cela, ça vaut le cout !!


mince ! je viens de voir qu'i s'agit d'un vieux posts !! :?
mdnews
Messages : 9
Inscription : jeu. 29/janv./2009 10:56

Message par mdnews »

ExcelWriter est intéressant et simple à utiliser.
Attention, il ne sert qu'à écrire dans un fichier Excel
http://www.purebasicpower.de/?ExcelWriter

Fonctions incluses:

XLS_CloseFile
XLS_CreateFile
XLS_InsertHorizPageBreak
XLS_PrintGridLines
XLS_ProtectSpreadsheet
XLS_SetColumnWidth
XLS_SetDefaultRowHeight
XLS_SetFilePassword
XLS_SetFont
XLS_SetFooter
XLS_SetHeader
XLS_SetMargin
XLS_SetRowHeight
XLS_WriteDate
XLS_WriteInteger
XLS_WriteNumber
XLS_WriteText

Sinon, il y a aussi Comate de nxSoftware
http://www.purecoder.net/comate.htm
mais là il faut connaître la manipulation des objets COM
Smartfx
Messages : 10
Inscription : mer. 23/avr./2008 12:08

Message par Smartfx »

oui mais excel writer ne fonctionne que sous les anciennes versions
d'excel avant excel 2003.

J'ai travaillé une création de feuille Excel avec COmate. Mon problème est
que je n'arrive pas`mettre les bordures.

Voici les résultats, cela fonctionne Avec Excel 2007 devrait aussi fonctionner avec excel 2003. ne fonctionnera pas avec version antérieur a 2003.

Code : Tout sélectionner

;/////////////////////////////////////////////////////////////////////////////////
;***COMate***  COM automation through iDispatch. SRod
;Some code are base from Excel Demo from Srod
;*===========
;
;A very special mention to Srod for the COMate
;
;*Excel demo.
;/////////////////////////////////////////////////////////////////////////////////
;Excel Hierarchy, Organigramme excel  From Flype (PureXLs)
;<Workbook>
;  <Styles>
;    <Style>
;      <Alignment/>
;      <Borders>
;        <Border/>
;      </Borders>
;      <Font/>
;      <Interior/>
;      <NumberFormat/>
;      <Protection/>
;    </Style>
;  </Styles>
;  <Worksheet>
;    <Table>
;      <Column/>
;      <Row>
;        <Cell>
;          <Data/>
;        </Cell>
;      </Row>
;    </Table>
;  </Worksheet>
;</Workbook>
;}

IncludePath "M:\Purebasic\Source"
XIncludeFile "COMate.pbi"

Global StrgHeader.s = "&C Voici Mon Titre"  ; "&C" to center 


date$ = FormatDate("%dd/%mm/%yyyy", Date())

Define.COMateObject oXL, Application
Define.COMateObject oWbk, WorkBook
Define.COMateObject oWkSht, WorkSheet
Define.COMateObject oSht, Sheet
Define.COMateObject oRng, Range

oXL = COMate_CreateObject("Excel.Application")
If oXL
  If oXL\SetProperty("Visible = #True") = #S_OK
    ;------------------------------------------------------------------------------------------------
    ;Setting Application Preference,  Choisir les préférences par défault de l'application
    ;------------------------------------------------------------------------------------------------
    ;
    ; Setting default Font for Application, Modifier la police par défaut de l'application
    oXL\SetProperty ("StandardFont = 'Arial' ")
    ; Setting default Font size for Application,  Modifier la grandeur de la police de l'application
    oXL\SetProperty ("StandardFontSize = 10 ")
    ;Opening a new workbook with only 1 sheet,  ouvrir un nouveau classeur avec 1 seule feuille
    oXL\setproperty("SheetsInNewWorkbook = 1")
    ;------------------------------------------------------------------------------------------------  
    ;------need to restart the application to apply default,  l'application doit être réouverte pour que cela s'applique
    ;
    ;Workbook---------------------------------------------------------------------------
    ;Add a worbook,  ajout d,un classeur
    oWbk= oXL\GetObjectProperty("Workbooks\Add")
    ;------------------------------------------------------------------------------------
    ;
    ;-------------------------------WorkSheet, Feuille-----------------------------------------
    ;set the activeworksheet, initialiser la feuille active
    oWkSht = oWbk\GetObjectProperty("ActiveSheet")
    ;Give the Active Sheet a Name, Donnez un nom à la feuille active
    oWkSht\SetProperty("Name = 'Janvier'")
    ;Setting up Center Header,(same For leftHeader, Right header,  Config en-tête centre, même chose pour en-ête droite et gauche
    oWkSht\setproperty("PageSetup\CenterHeader = '" + StrgHeader + "' AS String ")
    ;Setting up Right Footer,(same For Center footer, Right Footer). &P = page number. Config pied-de-page, même chose pour  droite et gauche
    oWkSht\setproperty("PageSetup\RightFooter = '&P' ")
    ;------------------------------------------------------------------
    ;Setting up margins, Configuration des marge
    oWkSht\setproperty("PageSetup\TopMargin = 36")  ; 36 = 1/2" or 1.27cm
    oWkSht\setproperty("PageSetup\BottomMargin = 36") 
    oWkSht\setproperty("PageSetup\LeftMargin = 36")
    oWkSht\setproperty("PageSetup\RightMargin = 36")
    ;-------------------------------------------------------------------
     ;Setting Column's width, ajuster la largeur de la colonne
    oWkSht\setproperty("Range('A1')\Columnwidth = 20")
    oWkSht\setproperty("Range('E1')\Columnwidth = 15")
    ;----------------------------------------------------------------------------------------
    
    ;--------------------------with Range,---avec une Sélection -----------------------------
    ; setting Range,   configuration d'une sélection de cellules
    oRng = oXL\GetObjectproperty("Range('A1:F1')")
    ;oRng\setproperty("Range('A1:F1')\HorizontalAlignment =xlHAlignCenter");
    ; setting font style to bold on the range,   Configurer le style de police en gras sur la selection de cellule
    oRng\setproperty("Range('A1:F1')\Font\Bold = #True")
    ; Merging a range of cell,  Fusionner une sélection de cellules      
    oRng\setproperty("Range('A5:B5')\MergeCells = #True")
    
    
    ;------------HorizontalAlignment Constants center = -4108, left = -4131, right= -4152, justify = -4130
    ;------------Constante d'alignement Horizontal   centré = -4108, gauche = -4131, droite = -4152, justifié = -4130   
    
    ;Setting HorizontalAlignment for range, , Config  Alignement Horizontal d'une sélection de cellule
    oRng\setproperty("Range('A1:A5')\HorizontalAlignment = -4108") 
    ;Setting Horizontal Alignment for Columns, , Config  Alignement Horizontal sur une colonne
    oWkSht\SetProperty("Columns('B')\HorizontalAlignment = -4131")
    ;Setting Horizontal Alignment for a cell, , Config  Alignement Horizontal sur une cellule                                                      
    oWkSht\SetProperty("Cell(1,1)\HorizontalAlignment = -4152")
    ;-----------------------------------------------------------------------------------
    oWkSht\SetProperty("Borders(xledgeBottom)\linestyle = 1")
    oWkSht\SetProperty("Borders(xledgeBottom)\weight = xlThin")
    oWkSht\SetProperty("Borders(xledgeBottom)\Colorindex = 1")
    oWkSht\SetProperty("XLPageBreak = -4135")
    ;-----------------------------------------------------------------------------------
   
    If oWbk
      ;-changing font font size font color of 1 cell,  changer police, Grandeur de police ou couleur dans une cellule
      ;---------------------------------------------------------------------------------------------------
      ; Font manipulation ,  Manipulation des polices dans une cellule
      ; set Font Name,  Changer police
      oWkSht\SetProperty("Cells(1,1)\Font\name = 'ArialNarrow'")
       ; set Font size,  Dimension
      oWkSht\SetProperty("Cells(1,1)\Font\Size = 12")
      ; set Font Style , Style de police
      oWkSht\SetProperty("Cells(1,1)\Font\FontStyle = 'Italic'")  ;Bold, Italic, Bold Italic as string
      ; set Font underline,  Police Soulignée
      oWkSht\SetProperty("Cells(1,1)\Font\underline = #False")  ;As boolean (#True, false) 
      ;  Text Color index  Index de couleur du texte
      ; 1 = noir 2 = Blanc ?, 3 =Rouge, 4 =vert,  5 = Blue, 6 = Jaune, 7 = Rose, 8 = Turquoise as integer etc.....
      oWkSht\SetProperty("Cells(1,1)\Font\Color =  5") 
      ;Write Text in a sheet cell  écrire du texte dans une cellule de la feuille spécifiée
      oWkSht\SetProperty("Cells(1,1)\interior\Colorindex = 6")
      ;------------------------------------------------------------------------------------------------------------
      ; Writting some text in cells,  écrire du texte dans les cellules
      oWkSht\SetProperty("Cells(1,1) = 'Hello'")
      oWkSht\SetProperty("Cells(1,2) = 'from'")
      oWkSht\SetProperty("Cells(1,3) = 'COMate!'")
      oWkSht\SetProperty("Cells(1,4) = 'is working'") 
      oWkSht\SetProperty("Cells(1,5) = 'Today$0027s date is'")  ;$0027 is a hex escape code used to insert a ' (ascii 39) character.
      oWkSht\SetProperty("Cells(1,6) = '" + date$ + "' AS DATE")
      oWkSht\SetProperty("Cells(4,1) = 6.25")
      oWkSht\SetProperty("Cells(5,1) = 'C$0027est vraiment pas façile'")
      oRng\Release()
      oWkSht\Release()
      oWbk\Release()
      oXL\Invoke("Quit()") 
      
    EndIf
  EndIf
  oXL\Release()
Else
  MessageRequester("COMate -Excel demo", "Couldn't create the application object!")
EndIf
mdnews
Messages : 9
Inscription : jeu. 29/janv./2009 10:56

Message par mdnews »

oui mais excel writer ne fonctionne que sous les anciennes versions d'excel avant excel 2003.
J'ai utilisé ExcelWriter avec succès vers Excel 2002 et 2007

Cela fonctionne. La différence étant qu'en ouvrant un document sous Excel 2007, il y a un message d'avertissement quand on importe un champs numérique vers un champs texte (dans mon cas, c'est voulu, car ce sont des numéros de référence qui commencent par un zéro)

Excel ouvre le document en mode "compatible" (office 97/2000) et il suffit ensuite de le réenregistrer en mode office 2007 (*.XLSX)

Cela dit, dans mon cas, je ne me sert que des fonctions XLS_WriteInteger XLS_WriteNumber (car c'est juste pour importer des fichier CSV) je n'ai dont pas essayé les autres fonctions.

L'ennui d'ExcelWriter est qu'il ne peut pas écrire des formules. J'aimerais bien que l'auteur continue son développement car cette lib est plus facile à utiliser que Comate.
Smartfx
Messages : 10
Inscription : mer. 23/avr./2008 12:08

Message par Smartfx »

Oui excel writer ouvrira un fichier existant, mais je n'ai pu en créer un nouveau avec excel 2003 et plus.

La manipulation de Comate est un petit peu plus ardu je le concède.
mdnews
Messages : 9
Inscription : jeu. 29/janv./2009 10:56

Message par mdnews »

Oui excel writer ouvrira un fichier existant, mais je n'ai pu en créer un nouveau avec excel 2003 et plus.
Le problème doit venir d'ailleurs (droit sur le répertoire?): je viens de refaire un test à l'instant (en utilisant l'exemple du package) et cela fonctionne parfaitement bien.

Windows Vista
Excel 2007

(je n'ai pas d'Excel 2003, juste Excel 2002 (XP) et Excel 2007)
La manipulation de Comate est un petit peu plus ardu je le concède.
Effectivement.
Smartfx
Messages : 10
Inscription : mer. 23/avr./2008 12:08

Message par Smartfx »

Oui j'ai essayé sur excel 2007 et cela fonctionne. Il sauvegarde le fichier en excel 97-2003.
Répondre