*-------------------------------------------------------------------------------- * Sauve le bloc de donnée dans un fichier XLS via un RUNPY OSfile prog.py *-------------------------------------------------------------------------------- * En exploitant la bibliothèque de python xlutils/xlrd/xlwr on peut créer des fichier au format pur excel. * Il faut que le programme appelant prépare les données telle que : * PARAM<1> : FILE.DEST : nom du fichier de destination * PARAM<2> : directory : local ! sbc remote * PARAM<3> : ouvre immédiatement _oui/_non * PARAM<4> : FILE_OF_PYSCRIPT_CANVAS ; optionnel defaut INDEFN * PARAM<5> : RECORDID_OF_PYSCRIPT_CANVAS ; optionnel defaut PY.DTA.TO.XLS * PARAM<6,mv> : TITLE : titre du tableau tag #TITLE# * PARAM<7> : orientation des tableaux header/data : (1=defaut) VM,AM (les lignes en VM ; les colonnes en AM) (2) AM,VM (les lignes en am ; les colonnes en vm) * PARAM<8,mv,sv> : COL.HEADER : entête des colonnes ; orienté selon <5> * PARAM<9,mv,sv> : COMMENT : commentaire ajouté au bas de la feuille * PARAM<10,mv> : SHEET.NAME : titre de la page tag #SHEET# si vide alors on prend title * PARAM<11+,y> : COL.DATA : données des colonnes au format : am=ligne ; vm = colonnne ou l'inverse : am = colonne ; vm = ligne ; *-------------------------------------------------------------------------------- *ATTENTION AUX STRUCTURES: * si pages multiple, TITLE, SHEET.NAME, COL.HEADER, COL.COMM, COL.DATA et COMMENT * doivent contenir le même nombre d'éléments * Pour les données, le changement de page est marqu' par une ligne contenant "####" *Exemple pour voir la structure à respecter : *TITLE = "[Conversion en tableau Excel via Python feuille 1,Conversion en tableau Excel via Python feuille 2]" *SHEET.NAME = "[Feuille 1,Feuille 2]" *COL.HEADER = "[[u'Colonne1 feuille 1',u'Colonne2 feuille 1',u'Colonne3 feuille 1'],[u'Colonne1 feuille 2',u'Colonne2 feuille 2',u'Colonne3 feuille 2']" *COL.DATA = "[[" ;* tableau des données feuille 1 *COL.DATA :='["Cellule1 Ligne1","Cellule2 Ligne1","Cellule3 Ligne1"],' ;* Peu importe le sens des ' "" ' ou " '' " mais s'y tenir sur la ligne *COL.DATA :="['Cellule1 Ligne2','Cellule2 Ligne2','Cellule3 Ligne2']," ;* Si on veut entrer une donnÔÇÜe "['":E.TRD:"',etc *COL.DATA :="['Cellule1 Ligne3','Cellule2 Ligne3','Cellule3 Ligne3']," ;* Si la donnÔÇÜe est du texte u' avant ... *COL.DATA :="],[" ;* Changement de feullie de calcul, tableau des données feuille 2 *COL.DATA :='["Cellule1 Ligne1","Cellule2 Ligne1","Cellule3 Ligne1"],' ;* Peu importe le sens des ' "" ' ou " '' " mais s'y tenir sur la ligne *COL.DATA :="['Cellule1 Ligne2','Cellule2 Ligne2','Cellule3 Ligne2']," ;* Si on veut entrer une donnÔÇÜe "['":E.TRD:"',etc *COL.DATA :="['Cellule1 Ligne3','Cellule2 Ligne3','Cellule3 Ligne3']," ;* Si la donnÔÇÜe est du texte u' avant ... *COL.DATA :="]]" *COL.COMM = "['Voici le commentaire sous le tableau feuille 1','Voici le commentaire sous le tableau feuille 2']" *-------------------------------------------------------------------------------- * History : * * 30/03/15 [EFV] : Initial Release ; en s'inspirant de AOBASIC AO.PY.SCR.JET.02 * 17/06/2016 [Th] : Possibilité de créé plusieurs feuille (onglet) dans un même document * Ajout paramètre nom des feuille (SHEET.NAME) * Correction orientation des données * 24/06/2016 [TH] : Ajout commentaire sous le tableau * 30/05/2018 [EFV] : adapter pour utiliser RUNPY de uv11.3.1 *-------------------------------------------------------------------------------- LOCAL PARA,OVAL,PAR,RET,CAPT,ERNO,UVTMP OVAL = @VALUE PARA = @PARAM EQU P.DEST.FILE TO 1 EQU P.DEST.DIR TO 2 EQU P.DEST.OPEN TO 3 EQU P.CANVAS.FILE TO 4 EQU P.CANVAS.ID TO 5 EQU P.TITLE TO 6 EQU P.ORIENTATION TO 7 EQU P.HEADER TO 8 EQU P.COMMENT TO 9 EQU P.SHEETNAME TO 10 *-------------------------------------------------------------------------------- LOCAL JS.TITLE, JS.SHEETNAME, JS.HEADER,JS.DATA,JS.COMMENT,I,II,III,NBI,NBII,NBIII,BUF,SAVEAS,BNEWSHEET,NBHEADER * data to json *-------------------------------------------------------------------------------- * TITLE *JS.TITLE = PARA JS.TITLE = '' NBI = DCOUNT(PARA,@VM) FOR I = 1 TO NBI IF I > 1 THEN JS.TITLE = JS.TITLE :',' JS.TITLE = JS.TITLE : "u'": REPL("'","\'",PARA) :"'" NEXT I JS.TITLE = '[':JS.TITLE:']' *-------------------------------------------------------------------------------- * SHEET.NAME IF PARA = "" THEN JS.SHEETNAME = JS.TITLE END ELSE JS.SHEETNAME = '' NBI = DCOUNT(PARA,@VM) FOR I = 1 TO NBI IF I > 1 THEN JS.SHEETNAME = JS.SHEETNAME :',' JS.SHEETNAME = JS.SHEETNAME : "u'": REPL("'","\'",PARA) :"'" NEXT I JS.SHEETNAME = '[':JS.SHEETNAME:']' END *-------------------------------------------------------------------------------- * COMMENT IF PARA = '' THEN PARA = PARA JS.COMMENT = '' NBI = DCOUNT(PARA,@VM) FOR I = 1 TO NBI IF I > 1 THEN JS.COMMENT = JS.COMMENT :',' JS.COMMENT = JS.COMMENT : "u'": REPL("'","\'",PARA) :"'" NEXT I JS.COMMENT = '[':JS.COMMENT:']' *-------------------------------------------------------------------------------- IF PARA = 1 OR PARA = '' THEN * (1=defaut) VM,AM (les lignes en VM ; les colonnes en AM) * SENS HABITUELLE EN MV'ED *-------------------------------------------------------------------------------- * HEADER JS.HEADER = '' BUF = REPL(@SVM,@VM,REPL(@VM,@AM,PARA)) NBI = DCOUNT(BUF<1>,@VM) NBHEADER =0 FOR I = 1 TO NBI IF I > 1 THEN JS.HEADER = JS.HEADER :',' JS.HEADER = JS.HEADER : "[" NBII = DCOUNT(BUF,@AM) IF NBHEADER < NBII THEN NBHEADER = NBII FOR II = 1 TO NBII ; ;* [EFV 1] on commence avec une ligne de header NBII IF II > 1 THEN JS.HEADER = JS.HEADER : ',' JS.HEADER = JS.HEADER : "u'": REPL("'","\'",BUF) :"'" NEXT II JS.HEADER = JS.HEADER : "]" NEXT I JS.HEADER = '[':JS.HEADER:']' *-------------------------------------------------------------------------------- * DATA JS.DATA = '' NBI = DCOUNT(PARA<11>,@VM) NBII = DCOUNT(PARA,@AM) BNEWSHEET = 0 FOR I = 1 TO NBI II = 11 IF PARA = "####" THEN JS.DATA = JS.DATA :'],[' BNEWSHEET = 1 I = I + 1 END ELSE BNEWSHEET = 0 END IF I > 1 AND BNEWSHEET = 0 THEN JS.DATA = JS.DATA : ',' JS.DATA = JS.DATA :'[' FOR II = 11 TO NBII IF II > 11 THEN JS.DATA = JS.DATA :',' X = PARA IF NUM(X) THEN X = REPL('.',',',X) IF MATCHES(X,"2N'-'2N'-'4N") THEN X = REPL('-','/',X) JS.DATA = JS.DATA : "u'" : REPL("'","\'",X) : "'" NEXT II JS.DATA = JS.DATA :']' NEXT I JS.DATA = '[[':JS.DATA:']]' END ********************************************************************************* IF PARA = 2 THEN * (2) AM,VM (les lignes en am ; les colonnes en vm) *-------------------------------------------------------------------------------- * HEADER JS.HEADER = '' BUF = REPL(@SVM,@VM,REPL(@VM,@AM,PARA)) NBHEADER = DCOUNT(BUF<1>,@VM) JS.HEADER = "[[u'" JS.HEADER= JS.HEADER : REPL(@AM,"'],[u'", REPL(@VM,"',u'",REPL("'","\'",BUF))) JS.HEADER = JS.HEADER :"']]" *-------------------------------------------------------------------------------- *DATA JS.DATA = '[[' NBI = DCOUNT(PARA,@AM) BNEWSHEET = 0 FOR I = 11 TO NBI NBII = DCOUNT(PARA,@VM) FOR II = 1 TO NBII X = PARA IF NUM(X) THEN X = REPL('.',',',X) ; PARA = X IF MATCHES(X,"2N'-'2N'-'4N") THEN X = REPL('-','/',X); PARA = X NEXT II IF PARA = "####" THEN JS.DATA = JS.DATA :"],[" BNEWSHEET = 1 END ELSE IF I > 11 AND BNEWSHEET = 0 THEN JS.DATA = JS.DATA : "," BNEWSHEET = 0 PARA ='-' JS.DATA = JS.DATA :"['" : REPL(@VM,"','",REPL("'","\'",PARA)) :"']" END NEXT I JS.DATA = JS.DATA:']]' END *-------------------------------------------------------------------------------- JS.TITLE = REPL(CHAR(13):CHAR(10),'\n',JS.TITLE) ; JS.TITLE = REPL(CHAR(10),'\r',JS.TITLE) JS.COMMENT = REPL(CHAR(13):CHAR(10),'\n',JS.COMMENT) ; JS.COMMENT = REPL(CHAR(10),'\r',JS.COMMENT) JS.HEADER = REPL(CHAR(13):CHAR(10),'\n',JS.HEADER) ; JS.HEADER = REPL(CHAR(10),'\r',JS.HEADER) JS.DATA = REPL(CHAR(13):CHAR(10),'\n',JS.DATA) ; JS.DATA = REPL(CHAR(10),'\r',JS.DATA) LOCAL CANVAS.FILE,CANVAS.ID,CANVAS IF PARA = '' THEN CANVAS.FILE = 'INDEFN' ELSE CANVAS.FILE = PARA IF PARA = '' THEN CANVAS.ID = 'PY.DTA.TO.XLS' ELSE CANVAS.ID = PARA @RTN.FLAG = 0 READ CANVAS FROM CANVAS.FILE,CANVAS.ID IF @RTN.FLAG = 1 THEN @RTN.FLAG = 0 ; READ CANVAS FROM 'INDEFN','PY.DTA.TO.XLS' IF @RTN.FLAG = 1 THEN EXEC "GP.ERROR,PAS DE CANVAS PY (INDEFN PY.DTA.TO.XLS) ! STOP" ; @RTN.FLAG = 1 ; GOTO 9999 END SAVEAS = PARA : @SB.CONT<22> : PARA CANVAS = REPL('#SAVEAS#' ,SAVEAS ,CANVAS) CANVAS = REPL('#NBR.COL#',DCOUNT(JS.HEADER,']')-2,CANVAS) CANVAS = REPL('#TITLE#' ,JS.TITLE ,CANVAS) CANVAS = REPL('#COMMENT#' ,JS.COMMENT ,CANVAS) CANVAS = REPL('#SHEET#', JS.SHEETNAME,CANVAS) CANVAS = REPL('#HEADER#' ,JS.HEADER,CANVAS) CANVAS = REPL('#DATA#' ,JS.DATA ,CANVAS) UVTMP = 'UVTEMP.DIR' WRITE 'F':@AM:SYSTEM(38):@AM:'D_VOC' ON 'MD',UVTMP WRITE CANVAS ON UVTMP,'XLS.OUT.':@PORT:'.PY' CAPT='';ERNO='' CALL SB.EXECUTE ('RUNPY UVTEMP.DIR XLS.OUT.':@PORT:'.PY', 1, 'C', '', '', CAPT, ERNO, '', '') *WRITE CAPT ON 'F.TRACE','EFV' *DELETE UVTMP,'XLS.OUT.':@PORT:'.PY' DISP 3,'Le fichier Excel > ':SAVEAS:' < est disponible.' *-------------------------------------------------------------------------------- 9999 @VALUE = OVAL