Inicio Blog Cómo crear un proceso de exportación de Excel personalizado

Cómo crear un proceso de exportación de Excel personalizado

Joe Jacob | 8 de enero de 2020

Introducción

Hay muchas formas de extraer datos de Acumatica. Por ejemplo, puede crear una consulta genérica o un informe. Casi todos los formularios de Acumatica contienen una cuadrícula y tienen la capacidad de exportar columnas de datos a Excel con sólo hacer clic en el icono disponible en la pantalla de Acumatica. Sin embargo, a menudo los usuarios pueden necesitar una exportación personalizada a Excel directamente desde una pantalla. En este artículo, le mostraré cómo crear un proceso sencillo de exportación personalizada a Excel y le proporcionaré algunos ejemplos de código para empezar.

ExcelExportProcess

Considere el siguiente patrón de diseño. En nuestro ejemplo, crearemos un botón en la pantalla de Reclamación de Gastos para exportar cierta información del encabezado y rellenar columnas específicas de la cuadrícula a Excel.

Cómo crear un proceso de exportación de Excel personalizado

Resultado deseado:

Cómo crear un proceso de exportación de Excel personalizado

El primer paso es incluir PX.Export como referencia para su proyecto de visual studio de la siguiente manera:

Cómo crear un proceso de exportación de Excel personalizado

Ahora tendrás que incluir los siguientes espacios de nombre:

public class ExpenseClaimEntry_Extension : PXGraphExtension<ExpenseClaimEntry>
    {
        #region Event Handlers

        #region Button 
        public PXAction<EPExpenseClaim> exportGridToExcel;
        
        [PXUIField(DisplayName = "Export to Excel", MapEnableRights = PXCacheRights.Select)]
        [PXButton(Tooltip = "Export to Excel")]

        protected virtual void ExportGridToExcel()
        {
EPExpenseClaimDetails details = Base.ExpenseClaimDetails.Current as EPExpenseClaimDetails;
            if (details == null) return;

            PXLongOperation.StartOperation(Base, delegate ()
            {
                var excel = new PX.Export.Excel.Core.Package();
                var sheet = excel.Workbook.Sheets[1];

                string fileNumber = GetUniqueFileNumber();
                int headingRow = 1;
                int titleRow = 4;
                int gridRow = 5;

                // Heading Information
                sheet.Add(headingRow, 1, "Reference Number:");
                sheet.Add(headingRow, 2, Base.ExpenseClaim.Current.RefNbr);

                sheet.Add(headingRow + 1, 1, "Description:");
                sheet.Add(headingRow + 1, 2, Base.ExpenseClaim.Current.DocDesc ?? string.Empty);

                // Create Excel column titles
                // adjust column width
                sheet.SetColumnWidth(1, 20);
                sheet.SetColumnWidth(2, 20);
                sheet.SetColumnWidth(3, 40);
                sheet.SetColumnWidth(4, 40);

                sheet.Add(titleRow, 1, "Expense Date");
                sheet.Add(titleRow, 2, "Expense Item");
                sheet.Add(titleRow, 3, "Description");
                sheet.Add(titleRow, 4, "Claim Amount");

                foreach (EPExpenseClaimDetails row in Base.ExpenseClaimDetails.Select())
                {
                    // get inventory CD for display
                    InventoryItem inventoryItem = PXSelect<InventoryItem,
                        Where<InventoryItem.inventoryID, 
                        Equal<Required<InventoryItem.inventoryID>>>>.Select(Base, row.InventoryID);

                    sheet.Add(gridRow, 1, Convert.ToString(row.ExpenseDate));
                    sheet.Add(gridRow, 2, Convert.ToString(inventoryItem?.InventoryCD ?? string.Empty));
                    sheet.Add(gridRow, 3, row.TranDesc);
                    sheet.Add(gridRow, 4, Convert.ToString(row.ClaimCuryTranAmtWithTaxes));

                    gridRow++;
                }

                using (MemoryStream stream = new MemoryStream())
                {
                    excel.Write(stream);
                    string path = String.Format("ExpenseClaimExport-{0}.xlsx", fileNumber);
                    var info = new PX.SM.FileInfo(path, null, stream.ToArray());
                    throw new PXRedirectToFileException(info, true);
                }
            });

        }
        #endregion

        public static string GetUniqueFileNumber()
        {
            string dTime = DateTime.Now.ToString("yyMMddHHmmssff");
            return $"{dTime}";
        }

        #endregion

 

El código anterior debería proporcionarle los elementos básicos para ayudarle a diseñar sus propias exportaciones personalizadas. Este método le proporcionará mucha más libertad de diseño y control de los puntos de datos específicos que a usted y a sus clientes les gustaría ver, en lugar de utilizar los escenarios de exportación más limitados.

 

 

Autor del blog

Joe es desarrollador senior en Crestwood Associates. Lleva más de 14 años diseñando y construyendo proyectos de software relacionados con ERP, originalmente con SSYH, Inc. que ahora es Crestwood Associates. Joe cuenta con más de 30 años de experiencia en programación en diversos lenguajes. Domina el desarrollo en VB.NET, C# y SQL Server, así como varias tecnologías basadas en web. Desde que Joe comenzó su carrera como Controlador Corporativo, aporta valiosos conocimientos cuando trabaja con Clientes. Durante el último año, Joe ha adoptado agresivamente la plataforma y el marco de Acumatica. Ahora gestiona varios proyectos que van desde simples proyectos de personalización hasta el desarrollo de soluciones integradas más específicas para el cliente. Joe también ha sido clave en la migración de personalizaciones de Dynamics SL a Acumatica para clientes existentes de Crestwood. Este es el primer año de Joe como Desarrollador MVP de Acumatica y espera seguir creciendo en la plataforma Acumatica.

Reciba las actualizaciones del blog en su bandeja de entrada.