2

我需要创建一个 HTML 表格并将其作为电子表格发送给用户。我在普通的旧 ASP.NET 中做过很多次,但它在 SharePoint 中让我落后了。这是一个简单的按钮,带有一个事件处理程序,它调用存储在模块中的 3 个文件(可访问沙盒解决方案),然后尝试将文本连同适当的内容类型和内容处置一起推送给用户。当我让这部分工作时, SampleData.txt 部分将被多个列表中的数据替换。不幸的是,该页面是回发的,但没有提供文件供用户打开或下载。

我在几个地方读到 Response.Write 在 Web 部件中不可用,但肯定还有其他方法可以完成这项任务......?这就是我想要做的 - 有没有可用的替代方案?

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

3 回答 3

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)

}
于 2012-09-11T18:06:18.833 回答
0

我正在与类似的事情作斗争。我的理解是,在沙箱中,SP 实际上是代理对您页面的调用,获取响应,然后将它自己的响应返回给客户端。该代理不允许 HttpContext 或 SP 类的所有功能。在我的测试中,没有返回 ContentType 和 headers。SP(在沙盒代码中)将始终返回 text/html 并忽略 Webpart 中的任何其他内容。

获得所需内容的HTML部分的一种方法是使用 asp:literal。您可以按照以下步骤创建一个带有 Web 部件的应用程序页面。删除母版页引用和占位符,以便返回的唯一内容是您的 Web 部件内容。在 Web 部件中,添加文字并将文本设置为 HTML 表。此时,您将拥有一个仅以HTML 格式返回表格的页面。这是另一篇文章,概述了确切的技术。但是,您仍然无法更改内容类型或添加标题。 也许结合第一个答案可以为您提供解决方案?

于 2013-06-21T17:15:08.593 回答
0

在按钮或链接按钮上使用默认的 javascript 函数 STSNavigate(dUrl);

调用创建 HttpContext.Current.Response 的页面

于 2014-09-17T21:10:17.387 回答