【问题标题】:Export large number of rows from SQL Server 2012 to Excel将大量行从 SQL Server 2012 导出到 Excel
【发布时间】:2015-01-14 11:22:58
【问题描述】:

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

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

当前的解决方案循环遍历数据并使用 OpenXML 库生成 XML。虽然这对于较小的数据集运行良好且快速,但对于较大的数据集则需要很长时间。

除了创建 Excel 文件之外,是否还有其他方法:

  1. 通过某种数据传输对象将数据库中的所有数据提取到应用程序中,该对象传输大量数据时速度很慢。
  2. 使用需要许可的第三方组件,因为没有预算。
  3. 使用 OpenXml 循环遍历所有行并生成完整输出。
  4. 在网络驱动器上生成和存储物理文件,因为存在数据安全限制。
  5. 使用 SSRS

我正在考虑使用 SQL Server 在内存中生成 Excel 文件(通过 SSIS),从应用程序打开流,通过 OpenXml 或其他方式编辑格式,然后将文件流式传输给用户.不确定这是否可行或是否有其他选择?

【问题讨论】:

    标签: c# sql-server excel


    【解决方案1】:

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

    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 文件和其他样式。

    【讨论】:

    • 在 +1 之前我还没有看到那种样式化响应输出的方法,但如上所述,不幸的是,将数据拉入应用程序进行渲染会减慢速度,所以 -1。
    • @sarin 数据量是多少(以字节为单位)?
    • 目前使用 OpenXML 生成的包含 80000 行的 excel 文件约为 10MB。
    • @sarin 但是数据库中的数据呢?
    • 不确定这是不是最好的方法,但按照这篇文章获取数据大小(dba.stackexchange.com/questions/25531/…)。它的大小为 13301442 字节或 13.3 MB。
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多