0

我已经能够填充中继器,但我遇到的唯一问题是将其导出到 Excel 工作表。excel 文件中没有显示数据。我在想的是,当我单击导出按钮时,由于一些回发,中继器上的数据被删除或其他原因。这是代码:

        Response.Clear();
        Response.Buffer = true;

        Response.AddHeader("content-disposition",
         "attachment;filename=GridViewExport.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.ms-excel";
        StringWriter sw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        Table tb = new Table();
        TableRow tr1 = new TableRow();
        TableCell cell1 = new TableCell();
        cell1.Controls.Add(Repeater1);
        tr1.Cells.Add(cell1);
        tb.Rows.Add(tr1);
        tb.RenderControl(hw);

        //style to format numbers to string
        string style = @"<style> .textmode { mso-number-format:\@; } </style>";
        Response.Write(style);
        Response.Output.Write(sw.ToString());
        Response.Flush();
        Response.End();
4

2 回答 2

1

对于以 Excel 格式导出数据,我建议使用EPPlus库而不是编写字符串。

EPPlus 是一个 .net 库,它使用 Open Office Xml 格式 (xlsx) 读取和写入 Excel 2007/2010 文件。 

EPPlus 支持:单元格范围、单元格样式(边框、颜色、填充、字体、数字、对齐方式)、图表、图片、形状、注释、表格、保护、加密、数据透视表、数据验证

于 2012-05-16T22:33:08.960 回答
0

我认为“Repeater1”和“tb”表必须附加到 Page(Page.Controls.Add(tb))。尝试:

  • 将控件渲染到字符串 var render=RenderControlToString(tb);
  • 然后清除响应 Response.Clear();
  • 然后写入渲染字符串 Response.Write(rendered);

    public static string RenderControlToString(Control c)
    {
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter htmlWriter = new HtmlTextWriter(sw);
        c.RenderControl(htmlWriter);
        sw.Close();
        htmlWriter.Close();
        return sb.ToString();
    
    }
    
于 2012-05-17T05:32:06.847 回答