Создание файла Excel - API / методы доступны?

Очевидно, что Acumatica может создавать файлы Excel из разных мест в системе.

Являются ли методы, используемые для создания файла Excel, публично открытыми случайно и могут ли использоваться за пределами стандартной сетки, отчетов и служб импорта?

Мне нужно иметь возможность сгенерировать файл Excel из одного из моих действий и прикрепить его как вложение файла. Я бы предпочел использовать встроенные методы Excel для простоты, если это возможно, прежде чем я пойду по пути включения EPPlus dll или аналогичных.

Спасибо за любую информацию


person Jeff Williams    schedule 25.03.2016    source источник


Ответы (1)


Вы можете использовать PX.Export.Excel.Core.Package для создания Excel файла.

Сгенерированный файл Excel можно либо загрузить с помощью PXRedirectToFileException исключения перенаправления, либо отправить в виде вложения по электронной почте с помощью шаблона уведомления и TemplateNotificationGenerator.

using System;
using System.Linq;
using System.Text;
using PX.Objects.SO;
using PX.Objects.CR;
using PX.Common;
using PX.Data;
using PX.SM;
using System.IO;

namespace PXDemoPkg
{
    public class SOOrderEntryPXExt : PXGraphExtension<SOOrderEntry>
    {
        public PXAction<SOOrder> ExportToExcelAndSendEmailAttachment;
        [PXUIField(DisplayName = "Export To Excel And Send Email Attachment", MapViewRights = PXCacheRights.Select, MapEnableRights = PXCacheRights.Update)]
        [PXButton]
        protected virtual void exportToExcelAndSendEmailAttachment()
        {
            if (Base.Document.Current == null ||
                Base.Document.Cache.GetStatus(Base.Document.Current) == PXEntryStatus.Inserted) return;

            var excel = new PX.Export.Excel.Core.Package();
            var sheet = excel.Workbook.Sheets[1];

            //Add Header
            sheet.Add(1, 1, "Line #");
            sheet.Add(1, 2, "Transaction Description");
            sheet.Add(1, 3, "Ordered Quantity");

            //Add Data
            var index = 2;
            foreach (PXResult<SOLine> lineItem in Base.Transactions.Select())
            {
                SOLine dataRow = (SOLine)lineItem;
                sheet.Add(index, 1, Convert.ToString(dataRow.LineNbr));
                sheet.Add(index, 2, dataRow.TranDesc);
                sheet.Add(index, 3, Convert.ToString(dataRow.OrderQty));
                index++;
            }
            sheet.SetColumnWidth(1, 20);
            sheet.SetColumnWidth(2, 45);
            sheet.SetColumnWidth(3, 35);

            //ExportFile(excel);
            SendEmail(excel);
        }

        //To download generated Excel    
        private void ExportFile(PX.Export.Excel.Core.Package excel)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                excel.Write(stream);
                string path = String.Format("SO-{0}-Transaction Info.xlsx", Base.Document.Current.OrderNbr);
                var info = new PX.SM.FileInfo(path, null, stream.ToArray());
                throw new PXRedirectToFileException(info, true);
            }
        }

        //Email generated Excel as an attachment
        private void SendEmail(PX.Export.Excel.Core.Package excel)
        {
            bool sent = false;

            //Notiftcaion with name "SOTransactionInfo" should be created via screen SM204003 prior to using this code.
            Notification rowNotification = PXSelect<Notification,
                                               Where<Notification.name,
                                                   Equal<Required<Notification.name>>>>
                                           .Select(Base, "SOTransactionInfo");

            if (rowNotification == null)
                throw new PXException("Notification Template for is not specified.");

            var sender = PX.Objects.EP.TemplateNotificationGenerator.Create(Base.Document.Current,
                                                                        rowNotification.NotificationID.Value);
            sender.MailAccountId = rowNotification.NFrom.HasValue ?
                                   rowNotification.NFrom.Value :
                                   PX.Data.EP.MailAccountManager.DefaultMailAccountID;

            sender.To = "[email protected]";

            //Attach Excel
            using (MemoryStream stream = new MemoryStream())
            {
                excel.Write(stream);
                string path = String.Format("SO-{0}-Transaction Info.xlsx", Base.Document.Current.OrderNbr);
                sender.AddAttachment(path, stream.ToArray());
            }
            sent |= sender.Send().Any();
        }
    }
}
person DChhapgar    schedule 28.04.2016