Généralités
Ce module permet la liaison avec des fichiers au format OpenXml, pour
lecture et l'écriture de cellules dans des fichiers excel au format xlsx (attention c'est uniquement du format xlsx)
lecture et écriture de texte dans des fichiers word au format docx (attention, c’est uniquement du format docx)
En mode client léger distant, ce module n'est exécutable que du côté serveur, le fichier xlsx/docx doit être donc du côté serveur et pas du côté client léger.
Le traitement des fichiers word est disponible depuis la version Harmony 411 uniquement
Liste des modules et des dll :
yopenxml.dhop : module diva de liaison avec la dll divalto open xml
DhdivaltoOpenXML.dll : dll qui contient les fonctionnalités de lecture et d'écriture des cellules excel
DocumentFormat.OpenXml.dll : dll qui contiens les fonctionnalités de lecture et d'écritures des fichiers excel .xlsx à travers des flux xml
WindowsBase.dll : dll qui contient des fonctions de base qui sont utilisées par les 2 dll précédentes
Avantages
La lecture et l'écriture des cellules sont nettement plus rapides qu'avec les fonctions OLE Automation, d'où un gain important de performance, notamment pour les imports ou les exports volumineux,.
Le module YOpenXml repose sur une librairie standard fournie par Microsoft, permettant de gérer les documents Word, Excel, Powerpoint, etc.
Il n'est pas nécessaire d'installer Office (MS ou Open) sur le serveur pour utiliser la librairie.
Les fichiers générés sont lisibles aussi bien dans Excel que dans Open-Office.
Contrairement à YOffice, le module YOpenXml s'exécute coté serveur. Il fonctionnera correctement avec le client HTML5.
Limitations
La couverture fonctionnelle de YOpenXML est moins importante que celle de YOffice.
Les fonctions « client léger » ne sont pas implémentées et le module s'exécute uniquement côté serveur.
Les formules de la feuille de calcul ne sont pas réévaluées lors de l'écriture d'une cellule (contrairement à Yoffice).
Les fonctions génèrent des documents pour Office 2007 et les versions ultérieures.
Mise en oeuvre
Le module YOpenXml s'exécute coté serveur uniquement. Si l'on veut utiliser l'ERP en client léger, le programme doit gérer les transferts du fichier entre le client et le serveur.
Si l'on veut modifier un fichier Excel existant, il conviendra donc dans un premier temps de le copier sur le serveur avec un appel à LCWinUpload. A la fin du traitement, la copie retour sur le client se fait avec un LCWinDownload.
Le programme Diva doit charger la Dll avant son utilisation en appelant la fonction OpenXml_Begin.
Il doit la décharger avant de se terminer en appelant la fonction OpenXml_End.
Fonctionnalités
Fonctionnalités Excel
On appellera la fonction OpenXml_FileOpen pour charger ou pour créer un fichier xlsx puis la fonction OpenXml_FileClose pour mettre le fichier à jour et le refermer.
Les fonctionnalitéd disponibles
Ouverture ou création d'un fichier XLSX.
Lecture de la valeur d'une cellule.
Gestion des onglets (ou feuilles) : choix de l'onglet (ou feuille), création, duplication, suppression.
Modification de la largeur d'une colonne.
Ecriture d'une cellule :
Plusieurs formats de donnée sont supportés : texte, date, numérique, etc.
Définition d'un style pour le texte de la cellule : police, couleur et taille des caractères, attributs gras/souligné.
Définition d'une couleur de fond pour la cellule.
Sauvegarde du fichier après modification.
Récupérer le texte de la dernière erreur produite
Principes Excel
OpenXML ne remplace pas yoffice, il permet principalement l'écriture ou de la lecture massivement de cellules Excel.
OpenXML ne contient donc pas toutes les fonctions de yoffice mais juste les fonctions de bases pour lire et écrire des cellules et l'écriture de cellule avec un format (formatage/couleur/police).
La dll OpenXML ne permet pas l'écriture de formules et ne fait pas le recalcul de la feuille des formules, pour cela il charger le fichier dans Excel, il est donc conseiller après avoir écrit des cellules et fermer le fichier xlsx:
d'ouvrir yoffice
de charger le fichier xlsx dans Excel avec les fonctions de yoffice, Excel va alors mettre à jour les résultats des cellules car dans OpenXML, si on modifie une cellule, alors on positionne une information dans le fichier xlsx qui indique a Excel qu'il faut refaire le calcul des formules.
puis de sauvegarder la feuille xlsx avec yoffice.
Seuls les fichiers Excel avec l'extension xlsx sont utilisables par OpenXML.
Ce sont des fichiers qui contiennent la description des feuilles et des cellules du tableau sous forme de flux XML et ensuite ces flux XML sont zipper pour en faire un seul fichier xlsx
La dll dé-zippe le fichier xlsx pour lire et modifier les flux XML du fichier.
Pour charger et décharger la dll il faut commencer et finir le programme diva par l'appel aux fonctions OpenXml_Begin() et OpenXml_End().
Puis appelé la fonction OpenXml_FileOpen(fic,creation) pour charger ou pour créer un fichier xlsx puis la fonction OpenXml_FileClose() permet de mettre a jour le fichier et de le fermer.
Lorsque le fichier est ouvert on peut :
se positionner sur une feuille avec la fonction OpenXml_GotoSheet(feuille,creation)
lire des cellules avec OpenXml_Read(lig,col)
-définir la taille des colonnes avec OpenXml_ColumnWidth(colonne,taille)
-connaitre la taille de la feuille Excel avec OpenXml_GetSizeSheet puis OpenXml_GetStartRow / OpenXml_GetEndRow / OpenXml_GetStartColumn / OpenXml_GetEndColumncréer une police avec la fonction OpenXml_CreateFont(gras, taille, indexcouleur, nom, italique, soulignee, barree)
écrire des cellules avec OpenXml_WriteFormat(lig, col, valeur, form, decim, multi, zero, indexcouleurfond)
Et enfin la fonction OpenXml_GetMsgError permet de récupérer le texte de la dernière erreur
Liste des fonctions de OpenXML
Voir la page dédiée YOpenXml new
Exemple de programme diva
procedure LectureTailleFeuille 1 car 1 beginp OpenXml_GetSizeSheet display " " display "Ligne debut = " & tostring(OpenXml_GetStartRow) display "Ligne fin = " & tostring(OpenXml_GetEndRow) display "Colonne debut = " & tostring(OpenXml_GetStartColumn) display "Colonne fin = " & tostring(OpenXml_GetEndColumn) input " " car display " " endp procedure demo 1 lig x 1 co lx 1 lig2 x 1 cc x = 0 1 pp x = 0 1 pp1 x = 0 1 pp2 x = 0 1 pp3 x = 0 1 TypeDeWritePourLaDemo x = 0 1 retour S 1 Choix x beginp if OpenXml_Begin <> 0 ;chargement du module openxml ; chargement de la dll DhdivaltoOpenXML.dll et initialisation de la dll ; 0 si pas d'erreur ; 1 si la dll n'existe pas ; 2 si une fonction n'existe pas, par exemple si la dll est une ancienne version ; 3 si erreur d'initialisation display OpenXml_GetMsgError programgoto " " endif fic = "C:\divalto\Test.xlsx" ;ouverture du fichier test.xlsx avec création s'il n'existe pas creation = 1 ;0=ne pas créer le fichier s'il n'existe pas 1=créer le fichier s'il n'existe pas if OpenXml_FileOpen(fic,creation) <> 0 display OpenXml_GetMsgError goto fini endif LectureTailleFeuille retour = OpenXml_GotoSheet(" ",0) display "Nom de la feuille en cours = " & left(retour) OpenXml_ColumnWidth(1,20) ;taille de la colonne 1 OpenXml_ColumnWidth(2,40) ;taille de la colonne 2 OpenXml_ColumnWidth(5,30) ;taille de la colonne 5 ;Création de polices pp1 = OpenXml_CreateFont(1) ; Police Gras pp2 = OpenXml_CreateFont(1,16) ; Police Gras taille 16 pp3 = OpenXml_CreateFont(0,16) ; Police taille 16 display "écriture de 20000 cellules " pp = 0 cc = 0 TypeDeWritePourLaDemo = 1 Choix = 1 for lig = 1 to 1000 for col = 1 to 20 switch TypeDeWritePourLaDemo case 1 OpenXml_WriteFormat( lig, col, "10,126" , "Numeric", 2, " ", false,cc,pp) case 2 OpenXml_WriteFormat( lig, col, "10,1239" , "Numeric", 3, " ", false,cc,pp) case 3 OpenXml_WriteFormat( lig, col, "20140926", "Date", 0, " ", false,cc,pp) case 4 OpenXml_WriteFormat( lig, col, "Simple texte" , "Texte", 0, " ", false,cc,pp) case 5 OpenXml_WriteFormat( lig, col, "201409261030" , "DateHeure", 0, " ", false,cc,pp) case 6 OpenXml_WriteFormat( lig, col, "103000", "Heure", 0, " ", false,cc,pp) case 7 OpenXml_WriteFormat( lig, col, "103000", "HeureMinuteSeconde", 0, " ", false,cc,pp) case 8 OpenXml_WriteFormat( lig, col, "70", "Duree", 0, " ", false,cc,pp) Case 9 OpenXml_WriteFormat( lig, col, choix, " MultiChoix ",0 , \ "Monsieur|Madame" ,false,ccp,pp) endswitch ;on fait ‘tourner’ les valeurs pour voir tous les cas possibles Choix++ If Choix > 2 Choix = 1 Endif TypeDeWritePourLaDemo++ if TypeDeWritePourLaDemo > 9 TypeDeWritePourLaDemo = 1 endif ;couleur prédefinie de excel de 1 a 56 cc++ if cc > 56 cc= 0 endif switch pp case 0 pp = pp1 case pp1 ;if pp = pp1 pp = pp2 case pp2 ;if pp = pp2 pp = pp3 case pp3 ;if pp = pp3 pp = 0 endswitch next next LectureTailleFeuille display " " display "lecture cellules " display " " for lig = 1 to 1000 for col = 1 to 20 retour = OpenXml_Read(lig,col) display left(retour) & " " 0 next display " " next OpenXml_FileClose() label fini OpenXml_End ; fin de l'utilisation de la dll DhdivaltoOpenXML endp main demo programgoto " "