2016-03-25 2 views
5

Acumatica hat offensichtlich die Fähigkeit, Excel-Dateien von verschiedenen Stellen im System zu erstellen.Excel-Datei-Generierung - API/Methoden ausgesetzt?

Werden die Methoden, die zum Generieren der Excel-Datei verwendet werden, zufällig öffentlich angezeigt und können außerhalb des Standardgitters verwendet werden, Bericht, Importdienste?

Ich habe die Notwendigkeit, eine Excel-Datei aus einer meiner Aktionen zu generieren und diese als Dateianhang anhängen. Ich würde es vorziehen, wenn möglich, die eingebauten Excel-Methoden aus Gründen der Einfachheit zu verwenden, bevor ich den Weg der Aufnahme von EPPlus-DLLs oder ähnlichem beschreite.

Vielen Dank für alle Informationen

Antwort

10

Sie PX.Export.Excel.Core.Package nutzen können eine Excel-Datei zu erzeugen.

Und generierte Excel kann entweder mit PXRedirectToFileException Umleitung Ausnahme heruntergeladen werden oder kann als E-Mail-Anhang mit Benachrichtigungsvorlage und TemplateNotificationGenerator gesendet werden.

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(); 
     } 
    } 
}