Page 1 sur 1

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

Publié : jeu. 26/oct./2006 21:26
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>

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

Publié : ven. 27/oct./2006 10:58
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à !!!

Purexls

Publié : mar. 10/févr./2009 4:40
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.

Publié : mar. 10/févr./2009 5:22
par MetalOS
oui moi aussi ça m'intéresse cette lib.

Publié : mar. 10/févr./2009 10:51
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 !! :?

Publié : mar. 10/févr./2009 10:58
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

Publié : jeu. 12/févr./2009 18:43
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

Publié : ven. 13/févr./2009 9:38
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.

Publié : sam. 14/févr./2009 13:01
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.

Publié : sam. 14/févr./2009 15:04
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.

Publié : dim. 15/févr./2009 1:44
par Smartfx
Oui j'ai essayé sur excel 2007 et cela fonctionne. Il sauvegarde le fichier en excel 97-2003.