【发布时间】:2016-07-13 13:12:45
【问题描述】:
Acumatica 显然能够从系统中的不同位置创建 excel 文件。
生成excel文件的方法是否偶然公开,可以在标准网格、报表、导入服务之外使用?
我需要能够从我的一项操作中生成一个 excel 文件并将其作为文件附件附加。为了简单起见,我更喜欢使用内置的 excel 方法,然后再继续使用 EPPlus dll 或类似方法。
感谢您提供任何信息
【问题讨论】:
Acumatica 显然能够从系统中的不同位置创建 excel 文件。
生成excel文件的方法是否偶然公开,可以在标准网格、报表、导入服务之外使用?
我需要能够从我的一项操作中生成一个 excel 文件并将其作为文件附件附加。为了简单起见,我更喜欢使用内置的 excel 方法,然后再继续使用 EPPlus dll 或类似方法。
感谢您提供任何信息
【问题讨论】:
您可以利用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 = "demo@demo.com";
//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();
}
}
}
【讨论】: