Crear Excel a partir de un Template en GeneXus 16


En uno de los sistemas en que trabajo como desarrollador se me presento un requerimiento el cual explicaba que al momento de generar un excel se debía imprimir el logo de la empresa.

Lo primero que hice fue crearme un excel que tuviese el logo de la empresa, y luego en un procedure de genexus usar el mismo excel como un template. 

Al momento de crear el procedimiento en gx, en las propiedades se debe colocar la propiedad Call protocol en HTTP para que pueda funcionar el getHttpContext() que usaremos mas adelante:


Variables del Procedimiento:



Source del Procedimiento:

Java [!&Path!] = getHttpContext().getDefaultPath(); //Call protocoll = HTTP

&ExcelDocument.Template = &Path.Trim() + &File.Separator.Trim() + !"templates" + &File.Separator.Trim() + !"TemplateConLogo.xlsx" //cargo el excel con el logo

&NombreArchivo = !"Reporte_de_Clientes_" + !".xlsx" //nombre del nuevo excel
&RutaTempStorage = &Path.ToString().Trim() + &File.Separator.Trim() + !"PublicTempStorage" + &File.Separator.Trim() + &NombreArchivo.Trim() //coloco el excel en una carpeta temporal

&ExcelDocument.Open(&RutaTempStorage.Trim()) //abro el excel
Do 'CheckStatus'

&ExcelDocument.Clear() //limpio el excel, esto no elimina el logo

&CellRow = 8
&FirstColumn = 1
&ExcelDocument.Cells(&CellRow, &FirstColumn).Size = 15
&ExcelDocument.Cells(&CellRow, &FirstColumn).Bold = True
&ExcelDocument.Cells(&CellRow, &FirstColumn).Text = "Fecha del Reporte"
&DiaHora = ServerNow()
&ExcelDocument.Cells(&CellRow, &FirstColumn + 1).Date = &DiaHora

&CellRow += 2
&ColumnIndex = 0

&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Bold = True
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Text = 'Nombre'
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Color = 12

&ColumnIndex+=1
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Bold = True
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Text = 'Apellido'
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Color = 12

For each Client
&CellRow += 1
&ColumnIndex = 0
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Text = ClientName
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Color = 12
&ColumnIndex+=1
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Text = ClientLastName
&ExcelDocument.Cells(&CellRow, &FirstColumn + &ColumnIndex).Color = 12
Endfor

&ExcelDocument.Save()
Do 'CheckStatus'
&ExcelDocument.Close()

&HttpResponse.AddHeader(!"Content-Type", !"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
&HttpResponse.AddHeader(!"Content-Disposition", !"attachment;filename=" + &NombreArchivo.Trim())
&HttpResponse.AddHeader(!"X-Frame-Options", !"deny")
&HttpResponse.AddHeader(!"X-Content-Type-Options", !"nosniff")
&HttpResponse.AddFile(&RutaTempStorage.Trim()) //guardo el excel en la carpeta temporal

//sub que permite saber si hubo errores al gestionar el excel
Sub 'CheckStatus'
If (&ExcelDocument.ErrCode <> 0)
&ErrorMessage = &ExcelDocument.ErrDescription
&HttpResponse.AddString('ERROR: ' + &ErrorMessage.Trim())
Return
Endif
Endsub

Comentarios