Aller directement à la fin des métadonnées
Aller au début des métadonnées

Vous regardez une version antérieure (v. /wiki/spaces/PAI/pages/11339530262/Module+de+liaison+OpenXML+pour+Microsoft+Excel+et+Word) de cette page.

afficher les différences afficher l'historique de la page

Vous regardez la version actuelle de cette page. (v. 1) afficher la version suivante »

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 ficheirs 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 4xx 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

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_GetEndColumn

  • cré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

  • char OpenXml_GetMsgError*
    Renvoi le texte de la dernière erreur

  • int OpenXml_Begin*
    Chargement de la dll DhdivaltoOpenXML.dll et initialisation de la dll
    Renvoi
    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

  • int OpenXml_End*
    Fin de l'utilisation de la dll DhdivaltoOpenXML
    Renvoi toujours 0

  • int OpenXml_FileOpen(fic,creation)*
    Chargement d'un fichier xlsx
    Paramètres
    1 fic A ;nom du fichier xlsx avec son chemin
    1 creation X = 0 ;0=ne pas créer le fichier s'il n'existe pas 1=créer le fichier s'il n'existe pas
    Renvoi
    0 si pas d'erreur
    1 si erreur

  • int OpenXml_FileClose*
    Fermeture du fichier xlsx en cours
    Renvoi
    0 si pas d'erreur
    1 si erreur

  • int OpenXml_ColumnWidth(colonne,taille)*
    Changement de la taille d'une colonne c'est unité de mesure Excel, par défaut c'est 10
    Paramètres
    1 colonne N
    1 taille N
    Renvoi
    0 si pas d'erreur

  • string OpenXml_GotoSheet(feuille,creation)*
    Gestion des feuilles de calcul selon la valeur du paramètre création
    Renvoi toujours le nom de la feuille en cours ou "1" si erreur
    Paramètres
    1 feuille Anom de la feuille
    1 creation x = 0 type d'opération création et autres opérations
    Renvoi
    Le nom de la feuille en cours si pas d'erreur
    "1" si erreur
    Types d'opérations selon les cas suivant :
    retour = OpenXml_GotoSheet(" " ,0)
    renvoi le nom de la feuille en cours quel que soit la valeur du champ creation.
    Si nom de la feuille n'est pas vide alors le champ création indique une opération
    retour = OpenXml_GotoSheet("xxx" ,0)
    permet d'aller sur la feuille xxx , si xxx n'existe pas alors il y aura une erreur
    retour = OpenXml_GotoSheet("xxx" ,1)
    permet d'aller sur la feuille xxx , si xxx n'existe pas alors on crée une feuille vide
    retour = OpenXml_GotoSheet(" " ,2)
    liste des feuilles séparer par des ; la liste est toujours clôturée par un dernier caractère point-virgule
    retour = OpenXml_GotoSheet("xxx" ,3)
    duplique la feuille en cours à la fin des feuilles et lui donne le nom xxx
    Attention il faut que la feuille en cours à dupliquer soit simple car openxml ne gère pas lLes feuilles complexes avec du graphique etc.
    retour = OpenXml_GotoSheet("xxx" ,4)
    suprime la feuille xxx
    Attention il faut que la feuille à supprimer soit simple car openxml ne gère pas les feuilles complexes avec du graphique etc.
    Si la feuille à supprimer est la feuille en cours alors on va sur la première feuille, et s'il n'y a plus de feuille alors on crée une feuille vierge et on se positionne dessus.

  • char OpenXml_Read(lig,col)*
    Lecture d'une cellule, renvoi le texte de la cellule , le retour peut être un type String ( type S en diva)
    Les dates sont toujours au format AAAAMMJJ quel que soit le format d'affichage des dates.
    Les datetimes sont toujours au format AAAAMMJJHHMMSS quel que soit le format d'affichage des datetimes.
    Paramètres
    1 lign ;numéro de ligne
    1 coln ;numéro de colonne

  • int OpenXml_GetTypeLastRead*
    Renvoi le type du contenu de la cellule qu'on vient de lire
    Renvoi
    0 inconnu, par défaut alpha
    1 alpha
    2 numérique
    3 time hhmmss
    4 date aaaammjj
    5 date time aaaammjjhhmmss

  • int* OpenXml_ GetSizeSheet
    Calcule la dimension de la feuille écrite, cela renvoi la surface lig/col de la première et la dernière cellule existante, après on peut appeler les fonctions
    OpenXml_GetStartRow ligne début
    OpenXml_GetEndRow ligne fin
    OpenXml_GetStartColumn colonne début
    OpenXml_GetEndColumn colonne fin
    Ceci permet de limiter la lecture de la feuille à la plage de cellules réélement existantes, Exemple :
    1 ligdebut L
    1 ligfin L
    1 coldebut L
    1 colfin L
    1 ll L
    1 cc L
    GetSizeSheet
    Ligdebut = OpenXml_GetStartRow
    Ligfin = OpenXml_GetEndRow
    Coldebut = OpenXml_GetStartColumn
    Colfin = OpenXml_GetEndColumn
    For ll = ligdebut to ligfin
    For cc = coldebut to colfin
    Retour = OpenXml_read ( ll , cc )
    Next
    Next

Format des polices et couleur de fond des cellules

Les couleurs de fond des cellules vont de 1 à 56, ce sont les couleurs standards d'Excel.
La couleur 0 indique 'ne pas changer la couleur si la cellule existe' sinon la couleur du fond de la nouvelle cellule sera la couleur de fond par défaut des cellules Excel ( ou de la colonne si la colonne a une couleur prédéfinie)
Liste des couleurs : nota la couleur 24 est souvent utilisé pour mettre en relief une cellule.

  • Les Polices :
    Pour pouvoir modifier la police par défaut qu'aura le texte de la cellule, il faut créer une description de la police dans les styles du fichier xlsx .
    Il faut appeler la fonction OpenXml_CreateFont pour créer la police et elle renvoi un indice qui doit être indiqué dans la fonction OpenXml_WriteFormat
    Attention cet indice n'est valide que dans le fichier xlsx en cours, c'est local au fichier xlsx.

  • int OpenXml_CreateFont(gras,taille,indexcouleur,nom,italique,soulignee,barree)*
    Création d'une police
    Paramètres
    1 gras x = 0 1=gras
    1 taille x = 0 0=taille par défaut sinon mettre une valeur entre 8 et 72
    1 indexcouleurx = 0 0=couleur des caractères par défaut
    1 nom 32 = " " nom de la police , espace indique la police pas défaut d'Excel
    1 italique x = 0 1=italique
    1 soulignee x = 0 1=soulignee
    1 barreex = 0 1=barree
    L'ordre des paramètres est fait pour mettre les paramètres les plus souvent modifiés en premier.
    La valeur 0, indique pas de gras, ou pas d'italique etc.
    La taille à 0 indique de prendre la hauteur par défaut de la police des cellules.
    La couleur à 0 indique de prendre la couleur des caractères par défaut, normalement le noir.
    Nom a espace inique de prendre la police par défaut de Excel pour les cellules en général Tahoma.
    Renvoi
    L'indice de la police

    Exemples
    1polx
    pol = OpenXml_CreateFont(1) ;mettre la police ne gras
    pol = OpenXml_CreateFont(1,16) ;mettre la police en gras et en taille 16
    pol = OpenXml_CreateFont(0,16) ;ne pas mettre la police en gras en taille 16
    pol = OpenXml_CreateFont(0,0,24);ne pas mettre la police en gras en taille par défaut et les
    ;caractères en couleur 24 (bleu ciel)
    pol = OpenXml_CreateFont(0,0,0,"Tahoma",0,0,) ;police Tahoma, taille par défaut

  • int OpenXml_WriteFormat(lig, col, valeur, form, decim, multi, zero,indexcouleurfond,p1)*
    Ecrit un texte ou une valeur dans une cellule avec un format.
    Attention cette fonction ne traite pas les formules et ne fait pas le recalcule des cellules.
    Pour que le recalcule du tableau se fasse il faut charger le fichier xlsx dans Excel et sauvegarder le résultat.
    Lorsqu'on modifie le fichier xlsx , on positionne une information pour indiquer a Excel que les calculs ne sont pas à jour t qu'il faut recalculer les formules.
    Paramètres
    1 lig 6,0 = 0 numéro de la ligne
    1 col 6,0 = 0 numéro de la colonne
    1 valeur U Contenu de la cellule
    1 form A = " " Format de la valeur "Texte", "Numeric", "Date",
    "DateHeure", "Heure", "HeureMinuteSeconde",
    "Multichoix","Duree"
    1 decim N = 0 Nombre de décimales si format "Numeric"
    1 multi A = " " Liste des multi-choix (séparer les choix par le caractère |)
    1 zero B = FalseAfficher les zéros (non affichés par défaut)
    si valeur = 0 alors on affiche un texte a espace
    1 indexcouleurfond x = 0couleur de fond 0 => ne pas changer la couleur de fond sinon
    C'est une de valeur 1 a 56
    1 p1 x = 0 numéro de police 0=> police par défaut sinon mettre
    l'indice qu'à renvoyer la fonction OpenXml_CreateFont
    Renvoi
    0 si pas d'erreur
    Les formats possibles sont
    "Texte" valeur représente un texte et le format d'affichage par défaut est "@"
    "Numeric" valeur numérique, le champ decim doit contenir le nombre de 0
    que l'on veut voir après la virgule
    "Date" valeur doit être au format AAAAMMJJ
    "DateHeure" valeur doit être au format AAAAMMJJHHMMSS
    "Heure" valeur doit être au format HHMM [SS], a zone secondes [SS] n'est pas lu,
    on peut la mettre ou pas, on fait comme si c'était 00
    "HeureMinuteSeconde" valeur doit être au format HHMMSS
    "Duree" valeur doit contenir un nombre en secondes
    " MultiChoix " valeur comtiens le numero de choix et le champ ulti doit contenir la liste
    Des choix possibles séparés par le caractère | le résultat est de type texte
    Example
    OpenXml_WriteFormat( lig, col, "10,126" , "Numeric", 2)
    OpenXml_WriteFormat( lig, col, "10,1239" , "Numeric", 3)
    OpenXml_WriteFormat( lig, col, "20140926", "Date" )
    OpenXml_WriteFormat( lig, col, "Simple texte" , "Texte")
    OpenXml_WriteFormat( lig, col, "201409261030" , "DateHeure")
    OpenXml_WriteFormat( lig, col, "103000", "Heure")
    OpenXml_WriteFormat( lig, col, "103000", "HeureMinuteSeconde")
    OpenXml_WriteFormat( lig, col, "70","Duree") ;1 minutes et 10 secondes
    OpenXml_WriteFormat( lig, col, 2, " MultiChoix ",0 , "Monsieur|Madame" )
    1 ppgras x = 0
    1 pptitre x = 0
    st = OpenXml_FileOpen(fic,0);ouverture du fichier
    ;ajout de type de modification de police et/ou de police dans les styles du fichier 'fic'
    ppgras = OpenXml_CreateFont(1) ;juste gras
    pptitre = OpenXml_CreateFont(1,16 ) ;gras et grande taille
    ;maintenant on peut écrire les cellules
    OpenXml_WriteFormat( lig, col, "10,126" , "Numeric", 2," ",false,0,ppgras) ;gras pas de couleur
    OpenXml_WriteFormat( lig, col, "10,1239" , "Numeric", 2," ",false,3,ppgras);gras et couleur 3 (rouge)
    OpenXml_WriteFormat( lig, col, "20140926", "Date" ," ",false,24,pptitre);grand titre et couleur 24 (bleu ciel)
    OpenXml_WriteFormat( lig, col, "Simple texte" , "Texte"," ",false,0,0) ;rien
    OpenXml_WriteFormat( lig, col, "201409261030" , "DateHeure"," ",false,0,0);rien
    OpenXml_WriteFormat( lig, col, "103000", "Heure"," ",false,24,pptitre) ;grand titre et couleur 24
    OpenXml_WriteFormat( lig, col, "103000", "HeureMinuteSeconde"," ",false,24)
    OpenXml_WriteFormat( lig, col, "70", "Duree") ;1 minutes et 10 secondes
    ;fermeture du fichier
    OpenXml_Close
    ppgras = 0 ;on vient de fermer le fichier donc ppgras et pptitre n'existe plus
    pptitre = 0;car ce sont des informations locales au fichier excel

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 " "  
  • Aucune étiquette