在当今的商业环境中,企业需要将来自不同后端服务器应用程序(如SAP或Siebel)的业务数据集成到企业门户中,以提供丰富的解决方案给最终用户,而无需编写任何代码。这种集成解决方案允许将任何其他数据源集成到MOSS 2007环境中。通过在业务数据目录中注册业务数据,创建描述数据库或Web服务的元数据,业务数据目录使用这些元数据来调用正确的数据源以检索相关数据。
客户最迫切的需求之一是能够将业务数据目录中的搜索结果导出。业务数据实体可用于以下业务数据功能:业务数据Web部件、业务数据列表、业务数据搜索和用户配置文件中的业务数据。因此,客户希望将这些业务数据实体导出到Excel或PDF。遗憾的是,Microsoft没有提供任何导出到任何格式的设施。因此,本文提出了一种将业务数据实体导出到Excel/PDF的方法。
有两种方法可以将业务实体导出到Excel:
第一种选项在希望导出使用业务数据开发的企业搜索结果(例如,SAP R/3、PeopleSoft等其他系统的用户配置文件信息)时非常有用。
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/vnd.ms-excel";
NamedLobSystemInstanceDictionary ObjInstances = ApplicationRegistry.GetLobSystemInstances();
LobSystemInstance ObjInstance = ObjInstances["实例名称"];
Entity ObjEntity = ObjInstance.GetEntities()["实体名称"];
MethodInstance ObjMethodInst = ObjEntity.GetFinderMethodInstance();
IEntityInstanceEnumerator ObjEntityInstanceEnumerator = (IEntityInstanceEnumerator)prodEntity.Execute(ObjMethodInst, ObjInstance);
while (ObjEntityInstanceEnumerator.MoveNext())
{
IEntityInstance IE = prodEntityInstanceEnumerator.Current;
foreach (Field f in prodEntity.GetFinderView().Fields)
{
context.Response.Write(IE[f]);
context.Response.Write('\t');
}
context.Response.Write('\n');
}
}
第二种选项是调用通用调用器来执行MethodInstance,然后将返回结果导出到Excel:
// 应用程序定义
<Method Name="ExportExcel">
<Properties>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="ExportToExcel" Type="GenericInvoker" ReturnParameterName="ExportPlantsExcel" />
</MethodInstances>
</Method>
WebPart示例:
protected override void CreateChildControls()
{
lbExcel = new HyperLink();
lbExcel.Text = "导出到Excel";
lbExcel.NavigateUrl = SPContext.Current.Web.Url + "/Export.ashx?format=excel&instance=ExcelInstance";
lbExcel.Load += new EventHandler(lbExcel_Load);
lbExcel.ImageUrl = "/_layouts/images/ICXLS.GIF";
lbPdf = new HyperLink();
lbPdf.Text = "导出到PDF";
lbPdf.Load += new EventHandler(lbPdf_Load);
lbPdf.NavigateUrl = SPContext.Current.Web.Url + "/Export.ashx?format=pdf&instance=PDFInstance";
lbPdf.ImageUrl = "/_layouts/images/pdf.gif";
// ...
}
会话对象必须持有GenericInvoker MethodInstance的结果:
void lbPdf_Load(object sender, EventArgs e)
{
System.Web.HttpContext.Current.Session["PDFInstance"] = BdcHelpers.ExecuteGenericInvoker(lobSystemInstance, entityName, "ExportToExcel");
}
void lbExcel_Load(object sender, EventArgs e)
{
System.Web.HttpContext.Current.Session["ExcelInstance"] = Helpers.ExecuteGenericInvoker(lobSystemInstance, entityName, "ExportToExcel");
}
public static Object ExecuteGenericInvoker(string lobSystemInstance, string entityName, string methodInstance)
{
NamedLobSystemInstanceDictionary instances = ApplicationRegistry.GetLobSystemInstances();
LobSystemInstance instance = instances[lobSystemInstance];
Entity entity = instance.GetEntities()[entityName];
MethodInstance methInst = entity.GetMethodInstances()[methodInstance];
return entity.Execute(methInst, instance);
}
最后,需要注册处理程序:
<httpHandlers>
<remove verb="GET,HEAD,POST" path="*" />
<add verb="*" path="Export.ashx" type="BDCWebParts.ExportHandler, BDCWebParts" />
</httpHandlers>