将大量行从SQL Server 2012导出到Excel

时间:2015-01-14 11:22:58

标签: c# sql-server excel

我意识到这是一个很好的主题,但在看了很多帖子后我正在寻找一个不同的解决方案。该应用程序是ac#web,.net framework 4.5应用程序,需要将大约80,000多行从SQL Server 2012数据库导出到Excel电子表格模板(使其看起来漂亮并进行格式化)并将其流式传输给用户下载

我意识到一个答案可能是重新问我们为什么需要这样做并找到另一种方法。该应用程序正在查看众多的金融交易。用户希望保留在Excel中导出和播放数据的功能。在我开始研究帮助他们的其他方法之前,我想看看是否有人有任何好主意!

当前的解决方案遍历数据并使用OpenXML库生成XML。虽然这对于较小的数据集来说效果很好并且很快,但是对于较大的数据集来说这需要很长时间。

在没有:

的情况下,是否有创建Excel文件的替代方法
  1. 通过某种数据传输对象将数据库中的所有数据提取到应用程序中,因为它传输了大量数据,速度很慢。
  2. 使用需要许可的第三方组件,因为没有预算。
  3. 使用OpenXml循环遍历所有行并生成完整输出。
  4. 在网络驱动器上生成和存储物理文件,因为存在数据安全限制。
  5. 使用SSRS
  6. 我正在考虑使用SQL Server在内存中生成Excel文件(通过SSIS),从应用程序打开流,通过OpenXml或其他方式编辑格式,然后将文件流式传输到用户。不确定这是否可行或是否有其他选择?

1 个答案:

答案 0 :(得分:2)

您可以尝试这种方法,但当然涉及从数据库中提取数据到应用程序。

Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=YourFileName.xls");
Response.Charset = "";
Response.ContentType = "application/vnd.ms-excel";
using (StringWriter sw = new StringWriter())
{
    HtmlTextWriter hw = new HtmlTextWriter(sw);

    FileInfo fi = new FileInfo(Server.MapPath("~/App_Themes/YourCSS.css"));
    StringBuilder sb = new StringBuilder();
    StreamReader sr = fi.OpenText();
    while (sr.Peek() >= 0)
        sb.Append(sr.ReadLine());
    sr.Close();

    sb.Append(" table.tnew tr { height: 20px; } ");
    sb.Append(" table.tnew tr td, th { border:1px solid #CCCCCC; } ");
    sb.Append(" table.tnew tr.RowTotale td { background-color:#F5F5F5; color: #333333; text-transform:uppercase; font-weight: bold; font-size:11px; } ");

    GridView gv = new GridView();
    gv.DataSource = YourDataSource;
    gv.DataBind();
    gv.RenderControl(hw);

    Response.Output.Write(string.Format("<html><head><style type='text/css'>{0}</style></head><body>{1}</body></html>", sb.ToString(), sw.ToString());
    Response.Flush();
    Response.End();
}

如您所见,您甚至可以添加CSS文件和其他样式。