{"id":672,"date":"2026-04-30T11:39:08","date_gmt":"2026-04-30T14:39:08","guid":{"rendered":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/?p=672"},"modified":"2026-04-30T11:39:08","modified_gmt":"2026-04-30T14:39:08","slug":"%f0%9f%93%84-exportacion-de-datos-desde-api-gam-a-excel-genexus","status":"publish","type":"post","link":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/?p=672","title":{"rendered":"\ud83d\udcc4 Exportaci\u00f3n de datos desde API GAM a Excel (GeneXus)"},"content":{"rendered":"<h1>\ud83d\udcc4 Exportaci\u00f3n de datos desde API GAM a Excel (GeneXus)<\/h1>\n<h2>\ud83d\udd39 Contexto<\/h2>\n<p>Esta implementaci\u00f3n permite exportar a Excel datos provenientes de la API de GAM respetando el estado actual de una grilla en pantalla (paginaci\u00f3n, cantidad de filas y filtros aplicados).<\/p>\n<p>\ud83d\udc49 Aplica para cualquier entidad de GAM:<\/p>\n<ul>\n<li>\n<p>Roles<\/p>\n<\/li>\n<li>\n<p>Permisos<\/p>\n<\/li>\n<li>\n<p>Usuarios<\/p>\n<\/li>\n<li>\n<p>Permisos asignados a usuarios<\/p>\n<\/li>\n<li>\n<p>etc.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h2>\ud83d\udd39 Objetivo<\/h2>\n<p>Generar un archivo Excel que refleje exactamente lo que el usuario visualiza en pantalla:<\/p>\n<ul>\n<li>\n<p>P\u00e1gina actual<\/p>\n<\/li>\n<li>\n<p>Cantidad de registros por p\u00e1gina<\/p>\n<\/li>\n<li>\n<p>Filtros aplicados<\/p>\n<\/li>\n<li>\n<p>Contexto funcional (rol, usuario, aplicaci\u00f3n, etc.)<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h2>\ud83d\udd39 Flujo ordenado de implementaci\u00f3n<\/h2>\n<h3>1) Guardar datos en sesi\u00f3n (desde el Web Panel)<\/h3>\n<pre><code>&amp;WebSession.Set(\"EXP_ROLE_ID\", &amp;RoleId.ToString())\r\n&amp;WebSession.Set(\"EXP_APP_ID\", &amp;ApplicationId.ToString())\r\n&amp;WebSession.Set(\"EXP_FIL_NAME\", &amp;FilName)\r\n&amp;WebSession.Set(\"EXP_GRID_SIZE\", &amp;GridState.ToJson())\r\n<\/code><\/pre>\n<hr \/>\n<h3>2) Recuperar datos en el objeto de exportaci\u00f3n (Procedure \/ Web Panel)<\/h3>\n<pre><code>&amp;RoleId = &amp;WebSession.Get(\"EXP_ROLE_ID\").ToNumeric()\r\n&amp;AppId  = &amp;WebSession.Get(\"EXP_APP_ID\").ToNumeric()\r\n&amp;FilName = &amp;WebSession.Get(\"EXP_FIL_NAME\")\r\n\r\n&amp;GridStateJSON = &amp;WebSession.Get(\"EXP_GRID_SIZE\")\r\n&amp;GridState.FromJson(&amp;GridStateJSON)\r\n<\/code><\/pre>\n<hr \/>\n<h3>3) Definir ruta y nombre del archivo (ANTES de toda la operaci\u00f3n)<\/h3>\n<pre><code>&amp;Filename = 'Export.xlsx'\r\n\r\nif &amp;file.Separator = '\\\\'\r\n    &amp;Path = 'Reportes\\\\' + &amp;Filename\r\nelse\r\n    &amp;Path = 'Reportes\/' + &amp;Filename\r\nendif\r\n<\/code><\/pre>\n<p>\ud83d\udc49 La carpeta <code>Reportes<\/code> debe existir en el servidor.<\/p>\n<hr \/>\n<h3>4) Crear el Excel<\/h3>\n<pre><code>&amp;ExcelDocument.Open(&amp;Path)\r\n&amp;ExcelDocument.Clear()\r\n<\/code><\/pre>\n<hr \/>\n<h3>5) Cargar entidad GAM (ejemplo)<\/h3>\n<pre><code>&amp;GAMRole.Load(&amp;RoleId)\r\n<\/code><\/pre>\n<p>\ud83d\udc49 Esto es variable:<\/p>\n<ul>\n<li>\n<p>Puede ser <code>GAMUser<\/code><\/p>\n<\/li>\n<li>\n<p>Puede ser <code>GAMApplication<\/code><\/p>\n<\/li>\n<li>\n<p>Depende de qu\u00e9 quieras exportar<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>6) Definir filtros<\/h3>\n<pre><code>&amp;PermissionFilter = new()\r\n&amp;PermissionFilter.ApplicationId = &amp;AppId\r\n\r\nif not &amp;FilName.IsEmpty()\r\n    &amp;PermissionFilter.Name = \"%\" + &amp;FilName.Trim() + \"%\"\r\nendif\r\n<\/code><\/pre>\n<p>\ud83d\udc49 Los filtros dependen del m\u00e9todo que uses.<\/p>\n<hr \/>\n<h3>7) Obtener paginaci\u00f3n desde GridState<\/h3>\n<pre><code>&amp;PageSize = &amp;GridState.PageSize.ToNumeric()\r\n&amp;CurrentPage = &amp;GridState.CurrentPage\r\n&amp;Start = ((&amp;CurrentPage - 1) * &amp;PageSize) + 1\r\n<\/code><\/pre>\n<hr \/>\n<h3>8) Aplicar paginaci\u00f3n al filtro<\/h3>\n<pre><code>&amp;PermissionFilter.Limit = &amp;PageSize\r\n&amp;PermissionFilter.Start = &amp;Start\r\n<\/code><\/pre>\n<p>Limit \u2192 Es el limite a exportar de filas en grilla (si tenemos 15 filas exporta 15 no mas).<\/p>\n<p>Start \u2192 Indica la pagina que debe exportar (si nos encontramos en la pagina 3 de nuestra grilla exporta los datos ubicados en esa pagina).<\/p>\n<hr \/>\n<h3>9) Llamar a la API de GAM (extracci\u00f3n de datos)<\/h3>\n<pre><code>&amp;Permisos= &amp;GAMRole.GetPermissions(&amp;PermissionFilter, &amp;Errors)\r\n<\/code><\/pre>\n<p>\ud83d\udc49 IMPORTANTE:<\/p>\n<ul>\n<li>\n<p>Este m\u00e9todo cambia seg\u00fan el caso<\/p>\n<\/li>\n<\/ul>\n<p>Ejemplos:<\/p>\n<table>\n<thead>\n<tr>\n<th>Caso<\/th>\n<th>M\u00e9todo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Permisos de rol<\/td>\n<td><code>GetPermissions()<\/code><\/td>\n<\/tr>\n<tr>\n<td>Permisos no asignados<\/td>\n<td><code>GetUnassignedPermissions()<\/code><\/td>\n<\/tr>\n<tr>\n<td>Usuarios<\/td>\n<td><code>GetUsers()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ud83d\udc49 Cada m\u00e9todo puede soportar distintos filtros<\/p>\n<hr \/>\n<h3>10) Crear encabezados del Excel<\/h3>\n<pre><code>&amp;ExcelDocument.Cells(1,1).Text = \"T\u00edtulo del reporte\"\r\n&amp;ExcelDocument.Cells(1,1).Bold = 1\r\n\r\n&amp;ExcelDocument.Cells(3,1).Text = \"Columna 1\"\r\n&amp;ExcelDocument.Cells(3,2).Text = \"Columna 2\"\r\n\r\n&amp;ExcelDocument.Cells(3,1).Bold = 1\r\n&amp;ExcelDocument.Cells(3,2).Bold = 1\r\n<\/code><\/pre>\n<hr \/>\n<h3>11) Rellenar el Excel<\/h3>\n<pre><code>&amp;Row = 4\r\n\r\nFor &amp;GAMPermission in &amp;Permisos\r\n\r\n    &amp;ExcelDocument.Cells(&amp;Row,1).Text = &amp;GAMPermission.Name\r\n    &amp;ExcelDocument.Cells(&amp;Row,2).Text = &amp;GAMPermission.Description\r\n\r\n    &amp;Row += 1\r\n\r\nEndFor\r\n<\/code><\/pre>\n<hr \/>\n<h3>12) Guardar y cerrar el Excel<\/h3>\n<pre><code>&amp;ExcelDocument.Save()\r\n&amp;ExcelDocument.Close()\r\n<\/code><\/pre>\n<hr \/>\n<h3>13) Limpiar variables de sesi\u00f3n<\/h3>\n<pre><code>&amp;WebSession.Remove('EXP_ROLE_ID')\r\n&amp;WebSession.Remove('EXP_APP_ID')\r\n&amp;WebSession.Remove('EXP_FIL_NAME')\r\n&amp;WebSession.Remove('EXP_GRID_SIZE')\r\n<\/code><\/pre>\n<hr \/>\n<h3>14) Descargar el archivo autom\u00e1ticamente<\/h3>\n<pre><code>&amp;HttpResponse.AddHeader(\"Content-Type\", \"application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet\")\r\n&amp;HttpResponse.AddHeader(\"Content-Disposition\", \"attachment;filename=\" + &amp;Path)\r\n&amp;HttpResponse.AddFile(&amp;Path)\r\n<\/code><\/pre>\n<hr \/>\n<h2>\ud83d\udd39 Consideraciones<\/h2>\n<h3>\u2714 GridState<\/h3>\n<p>Permite replicar:<\/p>\n<ul>\n<li>\n<p>P\u00e1gina actual<\/p>\n<\/li>\n<li>\n<p>Cantidad de filas<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>\u2714 Filtros<\/h3>\n<p>Deben guardarse manualmente<\/p>\n<hr \/>\n<h3>\u26a0\ufe0f Case Sensitive<\/h3>\n<p>GAM diferencia may\u00fasculas\/min\u00fasculas<\/p>\n<hr \/>\n<p>Este flujo es reutilizable para cualquier exportaci\u00f3n basada en GAM.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcc4 Exportaci\u00f3n de datos desde API GAM a Excel (GeneXus) \ud83d\udd39 Contexto Esta implementaci\u00f3n permite exportar a Excel datos provenientes de la API de GAM respetando el estado actual de una grilla en pantalla (paginaci\u00f3n, cantidad de filas y filtros aplicados). \ud83d\udc49 Aplica para cualquier entidad de GAM: Roles Permisos Usuarios Permisos asignados a usuarios [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-672","post","type-post","status-publish","format-standard","hentry","category-docs"],"_links":{"self":[{"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=\/wp\/v2\/posts\/672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=672"}],"version-history":[{"count":0,"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=\/wp\/v2\/posts\/672\/revisions"}],"wp:attachment":[{"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wiki.gobiernoriocuarto.gob.ar\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}