*--------------------------------------------------------------------------------
* 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