我需要创建一个HTML表格并将其作为电子表格发送给用户。我已经在普通的旧ASP.NET中多次完成了这项工作,但它在SharePoint中扼杀了我。它是一个带有事件处理程序的简单Button,它调用存储在模块中的3个文件(可通过沙盒解决方案访问),然后尝试将文本与适当的内容类型和内容处置一起推送给用户。当我使这部分工作时,SampleData.txt部分将被替换为来自多个列表的数据。不幸的是,该页面进行了回发,但没有提供给用户打开或下载的文件。
我在一些地方读到Response.Write在网页部件中无法使用,但肯定有其他方法可以完成这项任务......?这就是我想做的事 - 有没有可用的选择?
protected override void CreateChildControls()
{
Button ReportButton = new Button();
ReportButton.Text = "Generate DCPDS Report";
ReportButton.Click += new EventHandler(ReportButton_Click);
this.Controls.Add(ReportButton);
}
protected void ReportButton_Click(Object sender, EventArgs e)
{
string header = "";
string sampleData = "";
string footer = "";
using (SPWeb webRoot = SPContext.Current.Site.RootWeb)
{
header = webRoot.GetFileAsString("SpreadsheetParts/Header.txt");
sampleData = webRoot.GetFileAsString("SpreadsheetParts/SampleData.txt");
footer = webRoot.GetFileAsString("SpreadsheetParts/Footer.txt");
}
StringBuilder sb = new StringBuilder();
sb.Append(header);
sb.Append(sampleData);
sb.Append(footer);
Page.Response.Clear();
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=June2010Spreadsheet.xls");
HttpContext.Current.Response.Write(sb.ToString());
//HttpContext.Current.Response.End();
}
答案 0 :(得分:1)
我没有对此进行过测试,这会产生一个有趣的概念证明,但我没有任何处女SharePoint 2010服务器可供测试,因此我无法为您测试。但是,作为一个想法,你不能把excel表的内容放在一个隐藏的领域,并做一些像:
HTML:
<script type="text/javascript">
function downloadExcel() {
location.href='data:application/download,' + encodeURIComponent(
document.getElementById('<%= hfExcelData.ClientID %>').value
);
}
</script>
C#:
protected override void CreateChildControls()
{
Button ReportButton = new Button();
ReportButton.Text = "Generate DCPDS Report";
ReportButton.Click += new EventHandler(ReportButton_Click);
this.Controls.Add(ReportButton);
}
protected void ReportButton_Click(Object sender, EventArgs e)
{
string header = "";
string sampleData = "";
string footer = "";
using (SPWeb webRoot = SPContext.Current.Site.RootWeb)
{
header = webRoot.GetFileAsString("SpreadsheetParts/Header.txt");
sampleData = webRoot.GetFileAsString("SpreadsheetParts/SampleData.txt");
footer = webRoot.GetFileAsString("SpreadsheetParts/Footer.txt");
}
StringBuilder sb = new StringBuilder();
sb.Append(header);
sb.Append(sampleData);
sb.Append(footer);
this.hfExcelData.value = sb.ToString();
Page.ClientScript.RegisterStartupScript(this.GetType(), "ExcelUploader", "downloadExcel();", true)
}
答案 1 :(得分:0)
我正在努力与类似。我的理解是,在沙箱中,SP实际上是代理对页面的调用,获取响应,然后将其自己的响应返回给客户端。该代理不允许HttpContext或SP类的所有功能。在我的测试中,不返回ContentType和标头。 SP(在沙盒代码中)将始终返回text / html并忽略webpart中的任何其他内容。
获取所需内容的 HTML 部分的一种方法是使用asp:literal。您可以按照these steps创建一个包含webpart的应用程序页面。删除母版页引用和占位符,以便返回的仅事物是您的webpart内容。在webpart中,添加文字并将文本设置为HTML表。此时,您将拥有一个只将表作为HTML返回的页面。这是another post outlining the exact technique。但是,您仍然无法更改内容类型或添加标头。 也许结合第一个可以为您提供解决方案的答案?
答案 2 :(得分:0)
在按钮或链接按钮上使用默认的javascript函数 STSNavigate(DURL);
调用创建HttpContext.Current.Response
的页面