Funcion para Generar Excel – ABL Progress

/* inclucion de constantes de excel*/
{libConstExcel.i}

PROCEDURE pGeneraExcel:
/*------------------------------------------------------------------------------
  Purpose: Generar Archivo Excel a partir de una TEMP-TABLE o CSV    
  Parameters:  INPUT PARAMETER pihTT             AS HANDLE
               INPUT PARAMETER picProperties     AS CHARACTER                
  Notes:      
------------------------------------------------------------------------------*/
    /*--- definicion de parametros ---*/
    DEFINE INPUT PARAMETER pihTT             AS HANDLE                    NO-UNDO.
    DEFINE INPUT PARAMETER picProperties     AS CHARACTER                 NO-UNDO.
 
    /*--- definicion de varibles para invocacion de excel ---*/
    DEFINE VARIABLE chExcelApplication  AS COM-HANDLE NO-UNDO.
    DEFINE VARIABLE chWorkBook          AS COM-HANDLE NO-UNDO.
    DEFINE VARIABLE chWorkSheet         AS COM-HANDLE NO-UNDO.
 
    /*--- definicion de variable para la generacion del archivo ---*/
    DEFINE VARIABLE cUniqueFile     AS CHARACTER        NO-UNDO.
    DEFINE VARIABLE cRuta           AS CHARACTER        NO-UNDO.
    DEFINE VARIABLE cArchivo        AS CHARACTER        NO-UNDO.
    DEFINE VARIABLE cExtension      AS CHARACTER        NO-UNDO.
 
    /*--- local variable definitions ---*/
    DEFINE VARIABLE picExcelFileName  AS CHARACTER       NO-UNDO.
    DEFINE VARIABLE cColList        AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE cRange          AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE cRow            AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE cPropEntry      AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE cPropName       AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE cPropValue      AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE cFontName       AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE hQueryTT        AS HANDLE            NO-UNDO.
    DEFINE VARIABLE iRow            AS INTEGER           NO-UNDO.
    DEFINE VARIABLE iCol            AS INTEGER           NO-UNDO.
    DEFINE VARIABLE iPropNo         AS INTEGER           NO-UNDO.
    DEFINE VARIABLE iPos            AS INTEGER           NO-UNDO.
    DEFINE VARIABLE iFontSize       AS INTEGER           NO-UNDO.
    DEFINE VARIABLE vRow            AS INTEGER INITIAL 4 NO-UNDO.
    DEFINE VARIABLE cHeaderTitle     AS CHARACTER         NO-UNDO.
    DEFINE VARIABLE cReportTitle    AS CHARACTER         NO-UNDO.
    
    /*--- Validaciones ---*/
    IF NOT VALID-HANDLE(pihTT) THEN
        RETURN.
    /*--- validacion de App Excel ---*/
    CREATE "Excel.Application" chExcelApplication NO-ERROR.
    IF NOT VALID-HANDLE(chExcelApplication) THEN
        RETURN.
 
    /*--- creamos el nuevo libro de trabajo ---*/
    chWorkBook = chExcelApplication:Workbooks:ADD().
    chWorkSheet = chWorkBook:Worksheets(1).
 
 
     /*--- determinamos la version de excel para guardar archivo generado
           en el formato correcto ---*/
    IF INTEGER (chExcelApplication:Version) < 12 THEN
        cExtension = ".xls".
    ELSE
        cExtension = ".xlsx".  
 
    /*--- creamos identificador unico para archivo excel ---*/
    ASSIGN cUniqueFile = replace(STRING(TODAY, "99/99/9999"),"/","") + STRING(TIME).
 
    /*--- genera propiedade del archivo excel ---*/
    DO iPropNo = 1 TO NUM-ENTRIES(picProperties, '|'):
    
        ASSIGN
            cPropEntry = ENTRY(iPropNo, picProperties, '|')
            iPos       = INDEX(cPropEntry, '=')
            cPropName  = SUBSTRING(cPropEntry, 1, iPos - 1)
            cPropValue = IF iPos > 0 THEN SUBSTRING(cPropEntry, iPos + 1) ELSE ''.
    
        CASE cPropName:
            WHEN 'FileName' THEN ASSIGN picExcelFileName = cPropValue.
            WHEN 'PathSave' THEN ASSIGN cRuta = cPropValue.
            WHEN 'HeaderTitle' THEN ASSIGN cHeaderTitle = cPropValue.
            WHEN 'ReportTitle' THEN ASSIGN cReportTitle = cPropValue.
            WHEN 'Font:Name' THEN ASSIGN cFontName = cPropValue.
            WHEN 'Font:Size' THEN ASSIGN iFontSize = INTEGER(cPropValue) NO-ERROR.
            WHEN 'PageSetup:Orientation' THEN
                chWorkSheet:PageSetup:Orientation = INTEGER(cPropValue) NO-ERROR.
            WHEN 'PageSetup:Zoom' THEN
                chWorkSheet:PageSetup:Zoom = cPropValue.
            WHEN 'PageSetup:PrintGridlines' THEN
                chWorkSheet:PageSetup:PrintGridlines = CAN-DO('YES,TRUE,Y,T',cPropValue).
            WHEN 'PageSetup:PrintTitleRows' THEN
                chWorkSheet:PageSetup:PrintTitleRows = cPropValue.
            WHEN 'PageSetup:PrintTitleColumns' THEN
                chWorkSheet:PageSetup:PrintTitleColumns = cPropValue.
            WHEN 'PageSetup:LeftHeader' THEN
                chWorkSheet:PageSetup:LeftHeader = cPropValue.
            WHEN 'PageSetup:CenterHeader' THEN
                chWorkSheet:PageSetup:CenterHeader = cPropValue.
            WHEN 'PageSetup:RightHeader' THEN
                chWorkSheet:PageSetup:RightHeader = cPropValue.
            WHEN 'PageSetup:LeftFooter' THEN
                chWorkSheet:PageSetup:LeftFooter = cPropValue.
            WHEN 'PageSetup:CenterFooter' THEN
                chWorkSheet:PageSetup:CenterFooter = cPropValue.
            WHEN 'PageSetup:RightFooter' THEN
                chWorkSheet:PageSetup:RightFooter = cPropValue.
            WHEN 'PageSetup:CenterHorizontally' THEN
                chWorkSheet:PageSetup:CenterHorizontally = CAN-DO('YES,TRUE,Y,T',cPropValue).
            WHEN 'PageSetup:CenterVertically' THEN
                chWorkSheet:PageSetup:CenterVertically = CAN-DO('YES,TRUE,Y,T',cPropValue).
            WHEN 'PageSetup:FitToPagesWide' THEN
                chWorkSheet:PageSetup:FitToPagesWide = INTEGER(cPropValue) NO-ERROR.
            WHEN 'PageSetup:FitToPagesTall' THEN
                chWorkSheet:PageSetup:FitToPagesTall = INTEGER(cPropValue) NO-ERROR.
            WHEN 'Visible' THEN
                /*--- Mantenemos visible Excel mientras se genera el archivo ---*/
                chExcelApplication:Visible = CAN-DO('YES,TRUE,Y,T',cPropValue).
        END CASE. /* cPropName */
    
    END. /* DO iPropNo = 1 TO NUM-ENTRIES(picProperties): */
    
    /*--- establecemos fuente ---*/
    IF cFontName = '' THEN
    ASSIGN cFontName = "Arial Narrow".
    
    
    /*--- set the column attributes for the Worksheet ---*/
    ASSIGN cColList = 'A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'
                  + ',AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM'
                  + ',AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ'
                  + ',BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM'
                  + ',BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ'
                  + ',CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM'
                  + ',CN,CO,CP,CQ,CR,CS,CT,CU,CV,CW,CX,CY,CZ'
                  + ',DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM'
                  + ',DN,DO,DP,DQ,DR,DS,DT,DU,DV,DW,DX,DY,DZ'
                  + ',EA,EB,EC,ED,EE,EF,EG,EH,EI,EJ,EK,EL,EM'
                  + ',EN,EO,EP,EQ,ER,ES,ET,EU,EV,EW,EX,EY,EZ'
                  + ',FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ,FK,FL,FM'
                  + ',FN,FO,FP,FQ,FR,FS,FT,FU,FV,FW,FX,FY,FZ'
                  + ',GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK,GL,GM'
                  + ',GN,GO,GP,GQ,GR,GS,GT,GU,GV,GW,GX,GY,GZ'.    
 
    /*--- validamos nombre de excel---*/
    IF picExcelFileName <> '' THEN DO:
        ASSIGN cArchivo = picExcelFileName.
    END.
    ELSE DO:
        ASSIGN cArchivo = "ReporteGeneraExcel".
    END.
 
    IF cRuta = "" THEN
        ASSIGN cRuta = "C:\tmp\".    
    
    IF cHeaderTitle <> "" THEN DO:
        chWorkSheet:Range("A1:" + ENTRY(pihTT:NUM-FIELDS,cColList) + "1"):Merge.
        chWorkSheet:Range("A1:" + ENTRY(pihTT:NUM-FIELDS,cColList) + "1"):HorizontalAlignment = 3.
        chWorkSheet:Range("A1"):VALUE = cHeaderTitle.
        chWorkSheet:Range("A1"):FONT:BOLD = TRUE.
        chWorkSheet:Range("A1"):FONT:SIZE = 18.
        chWorkSheet:Range("A1"):FONT:ColorIndex = 55.
    END.
    ELSE DO:
        vRow = vRow - 2.
    END.
    
    IF cReportTitle <> "" THEN DO:
        chWorkSheet:Range("A2:" + ENTRY(pihTT:NUM-FIELDS,cColList) + "2"):Merge.
        chWorkSheet:Range("A2:" + ENTRY(pihTT:NUM-FIELDS,cColList) + "2"):HorizontalAlignment = 3.
        chWorkSheet:Range("A2"):VALUE = cReportTitle.
        chWorkSheet:Range("A2"):FONT:BOLD = TRUE.
        chWorkSheet:Range("A2"):FONT:SIZE = 12.
    END.
    ELSE DO:
        vRow = vRow - 2.
    END.
    
    /*--- Colocamos Panel fijo para titulos y nombre de columnas---*/
    chWorkSheet:Rows(STRING(vRow) + ":" + STRING(vRow)):Font:Bold = TRUE.
    chWorkSheet:Rows(STRING(vRow + 1) + ":" + STRING(vRow + 1)):Activate.
    chExcelApplication:ActiveWindow:FreezePanes = TRUE.
    
    /*--- construimos cabezera de columnas---*/
    DO iCol = 1 TO pihTT:NUM-FIELDS:
        chWorkSheet:Range(ENTRY(iCol,cColList) + STRING(vRow)):Value = pihTT:BUFFER-FIELD(iCol):LABEL.
        chWorkSheet:Columns(ENTRY(iCol,cColList)):Font:Name = cFontName.
        IF iFontSize > 0 THEN
            chWorkSheet:Columns(ENTRY(iCol,cColList)):Font:Size = iFontSize.
        IF pihTT:BUFFER-FIELD(iCol):DATA-TYPE = "DECIMAL" THEN
            chWorkSheet:Columns(ENTRY(iCol,cColList)):Cells:NumberFormat = "#,###,##0.00".
        ELSE IF pihTT:BUFFER-FIELD(iCol):DATA-TYPE = "CHARACTER" THEN
            chWorkSheet:Columns(ENTRY(iCol,cColList)):Cells:NumberFormat = "@".
    END. /* DO iCol = 1 TO pihTT:NUM-FIELDS: */
 
    
    chWorkSheet:Range("A" + STRING(vRow) + ":" + ENTRY(pihTT:NUM-FIELDS,cColList) + STRING(vRow)):borders({&xlEdgeLeft}):LineStyle       = {&xlContinuous}.
    chWorkSheet:Range("A" + STRING(vRow) + ":" + ENTRY(pihTT:NUM-FIELDS,cColList) + STRING(vRow)):borders({&xlEdgeTop}):LineStyle        = {&xlContinuous}.
    chWorkSheet:Range("A" + STRING(vRow) + ":" + ENTRY(pihTT:NUM-FIELDS,cColList) + STRING(vRow)):borders({&xlEdgeBottom}):LineStyle     = {&xlContinuous}.
    chWorkSheet:Range("A" + STRING(vRow) + ":" + ENTRY(pihTT:NUM-FIELDS,cColList) + STRING(vRow)):borders({&xlEdgeRight}):LineStyle      = {&xlContinuous}.
    chWorkSheet:Range("A" + STRING(vRow) + ":" + ENTRY(pihTT:NUM-FIELDS,cColList) + STRING(vRow)):borders({&xlInsideVertical}):LineStyle = {&xlContinuous}.
                          
    /*
     pintamos contenido de la tabla temporal
    */
    /*--- set the query ---*/
    CREATE QUERY hQueryTT.
    hQueryTT:SET-BUFFERS(pihTT).
    hQueryTT:QUERY-PREPARE("FOR EACH " + pihTT:NAME).
    hQueryTT:QUERY-OPEN.
    
    ASSIGN iRow = vRow.
    REPEAT:
        hQueryTT:GET-NEXT.
        IF hQueryTT:QUERY-OFF-END THEN LEAVE.
        ASSIGN iRow = iRow + 1
               cRow = STRING(iRow).
        DO iCol = 1 TO pihTT:NUM-FIELDS:
            chWorkSheet:Range(ENTRY(iCol,cColList) + cRow):Value = pihTT:BUFFER-FIELD(iCol):BUFFER-VALUE.
        END.
    END. /* REPEAT: */
    
    hQueryTT:QUERY-CLOSE.
    DELETE OBJECT hQueryTT.
 
    chWorkSheet:PageSetup:CenterHorizontally = TRUE.
    chWorkSheet:PageSetup:BottomMargin = chExcelApplication:InchesToPoints(0.42).
    chWorkSheet:PageSetup:Zoom = 90.
    chWorkSheet:PageSetup:ORIENTATION = 2.
    chWorkSheet:pagesetup:PrintTitleRows = "$1:$" + STRING(vRow) .
    chWorkSheet:Range('A:' + ENTRY(pihTT:NUM-FIELDS,cColList) ):EntireColumn:AutoFit().
 
    chExcelApplication:DisplayAlerts = FALSE.
    chWorkBook:SaveAs( cRuta + cArchivo + "_" + cUniqueFile  + cExtension,,,,,,,).
 
    IF VALID-HANDLE(chWorkSheet) THEN
        RELEASE OBJECT chWorkSheet.
    IF VALID-HANDLE(chWorkBook) THEN
        RELEASE OBJECT chWorkBook.
    IF VALID-HANDLE(chExcelApplication) THEN
        RELEASE OBJECT chExcelApplication.
 
    MESSAGE "Generacion de Excel Terminada. " SKIP(1)  
            "Directorio: " cRuta  SKIP  
            "Nombre Excel: " (cArchivo + "_" + cUniqueFile + cExtension)
        VIEW-AS ALERT-BOX INFO BUTTONS OK.


Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.