2016-03-25 13 views
5

Acumaticaには明らかに、システム内のさまざまな場所からExcelファイルを作成する機能があります。Excelファイル生成 - API /メソッド公開?

Excelファイルを生成するために使用されたメソッドは、偶然公開され、標準のグリッド、レポート、インポートサービスの外部で使用できますか?

私のアクションの1つからExcelファイルを生成し、これを添付ファイルとして添付する必要があります。私は、EPPlus dllなどのルートを下る前に、可能であれば組み込みのExcelメソッドを使用して簡単にしたいと考えています。

はあなたがExcelファイルを生成するためにPX.Export.Excel.Core.Packageを利用することができます任意の情報

答えて

10

いただきありがとうございます。

生成された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(); 
     } 
    } 
} 
関連する問題