Accueil Blog Comment créer un processus d'exportation Excel personnalisé

Comment créer un processus d'exportation Excel personnalisé

Joe Jacob | 8 janvier 2020

Introduction

Il existe de nombreuses façons d'extraire des données d'Acumatica. Vous pouvez par exemple créer une enquête ou un rapport générique. La plupart des formulaires d'Acumatica contiennent une grille et offrent la possibilité d'exporter des colonnes de données vers Excel en cliquant simplement sur l'icône disponible sur l'écran d'Acumatica. Souvent, cependant, les utilisateurs peuvent avoir besoin d'une exportation personnalisée vers Excel directement à partir d'un écran. Dans ce billet, je vous montrerai comment construire un processus d'exportation Excel simple et personnalisé et vous fournirai un exemple de code pour commencer.

Processus d'exportation Excel

Considérons le modèle de conception suivant. Dans notre exemple, nous allons créer un bouton sur l'écran des notes de frais afin d'exporter certaines informations de l'en-tête et de remplir des colonnes spécifiques de la grille vers Excel.

Comment créer un processus d'exportation Excel personnalisé

Résultat souhaité :

Comment créer un processus d'exportation Excel personnalisé

La première étape consiste à inclure PX.Export comme référence dans votre projet Visual Studio, comme suit :

Comment créer un processus d'exportation Excel personnalisé

Vous devez maintenant inclure les espaces nominatifs suivants :

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

 

Le code mentionné ci-dessus devrait fournir suffisamment de bases pour vous aider à concevoir vos propres exportations personnalisées. Cette méthode vous permettra de disposer d'une plus grande liberté dans la mise en page et de contrôler les points de données spécifiques que vous et vos clients souhaitez voir - au lieu d'utiliser les scénarios d'exportation plus limités.

 

 

Auteur du blog

Joe est développeur senior chez Crestwood Associates. Il conçoit et développe des projets logiciels liés à l'ERP depuis plus de 14 ans, à l'origine chez SSYH, Inc. qui est aujourd'hui Crestwood Associates. Le parcours de Joe comprend plus de 30 ans d'expérience en programmation dans différents langages. Il maîtrise VB.NET, C# et le développement SQL Server, ainsi que plusieurs technologies basées sur le web. Joe a commencé sa carrière en tant que contrôleur de gestion, ce qui lui permet de fournir des informations précieuses lorsqu'il travaille avec des clients. Au cours de l'année écoulée, Joe a adopté de manière agressive la plate-forme et le cadre Acumatica. Il gère maintenant plusieurs projets allant de simples projets de personnalisation au développement de solutions intégrées plus spécifiques aux clients. Joe a également joué un rôle clé dans la migration des personnalisations Dynamics SL vers Acumatica pour les clients existants de Crestwood. C'est la première année de Joe en tant que développeur Acumatica MVP et il est impatient de poursuivre sa croissance sur la plateforme Acumatica.

Recevez les mises à jour du blog dans votre boîte de réception.