如何在.net 2.0中将数据从数据库或DataTable保存到Excel文件而没有响应

Posted

技术标签:

【中文标题】如何在.net 2.0中将数据从数据库或DataTable保存到Excel文件而没有响应【英文标题】:how to save data from database or DataTable To Excel File without Response in .net 2.0 【发布时间】:2016-01-18 10:31:31 【问题描述】:

我有一个用 asp.net 2.0 和 C# 开发的旧网站,我想将数据从数据库或 DataTable 保存到 Excel 文件。

我在互联网上搜索了很多,但只找到了使用 HttpResponce“Responce.Write”的解决方案,但如果文件很大,这个解决方案将不起作用,所以我想要一个解决方案,将 excel 文件物理保存在硬盘上。

【问题讨论】:

【参考方案1】:

在大多数情况下,您甚至需要在要运行应用程序的机器上安装 MS Excel,以便使用 Excel 相关库(即 Microsoft.Office.Interop 命名空间)。 可以使用 CSV 文件吗?这可能要简单得多。只需将您的 DataTable 对象加载到 FileStream 中,然后保存文件。

【讨论】:

谢谢,但如果我的网络服务器机器上没有安装 excel,我刚刚找到了解决方案【参考方案2】:

你有什么环境,结果文件应该定位到哪个版本的 Excel?根据这一点,答案可能会有所不同。但或多或少是通用的 - 尝试使用 GemBox.Spreadsheet,它不需要安装 Excel,但在免费版本中有限制。

【讨论】:

谢谢,但如果我的网络服务器机器上没有安装 excel,我刚刚找到了解决方案【参考方案3】:

如果我的机器上没有安装 Excel,我找到了解决方案并决定与公众分享

方案一(如果需要将excel文件物理保存在硬盘上)

您将需要一个 gridview 来首先将数据放入其中,而无需任何 css 或样式,只需从数据库中以您需要的 excel 文件格式获取所选数据

<!-- GridView to bind data from DatasSet-->
<asp:GridView ID="GridView2" runat="server" Visible="False"></asp:GridView>
<!-- HyperLink to put the link of the saved file -->
<asp:HyperLink ID="HyperLink1" runat="server" Visible="False">HyperLink</asp:HyperLink>

后面的代码

    private void ConvertDataSetToExcelFile(DataSet ds)
    
        GridView2.DataSource = ds.Tables[0];
        GridView2.DataBind();
        string FileName = DateTime.Now.Ticks.ToString() + ".xls";
        string FilePath = Server.MapPath("~/upload/excel/");

        GridView2.Visible = true;
        System.IO.StringWriter sw = new System.IO.StringWriter();
        System.Web.UI.htmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);
        GridView2.RenderControl(htw);
        string renderedGridView = sw.ToString();
        System.IO.File.WriteAllText(FilePath + FileName, renderedGridView);
        GridView2.Visible = false;

        HyperLink1.Visible = true;
        HyperLink1.NavigateUrl = "~/upload/excel/" + FileName;
        HyperLink1.Text = "Download File";
    

请注意,您需要先使 GridView 可见,才能将其渲染到文件,如果它是可见的,则不渲染,然后您可以再次将其设为 false,因为它仅用于保存数据,然后将其渲染到文件

解决方案 2(如果您需要即时创建文件,则直接下载到客户端)

请注意,我在搜索中找到了这些功能,但我没有尝试,因为我需要第一个解决方案,但也只想向公众分享另一个解决方案

public static void ExportToExcel(ref GridView gv, string _filename, string cmplbl)


    string style = @"<style>.textmso-number-format:\@;text-align:center;;.Numsmso-number-format:_(* #,###.00_);;.unwrapwrap:false</style>";
    //string style = @"<style> .text  mso-number-format:\@;  </style> ";

    // "<style>.textmso-number-format:\@;text-align:center;;.Numsmso-number-format:_(* #,##0.00_);;.unwrapwrap:false</style>"

    string attachment = "attachment; filename=" + _filename;
    HttpContext.Current.Response.ClearContent();

    HttpContext.Current.Response.AddHeader("content-disposition", attachment);
    // If you want the option to open the Excel file without saving then;
    // comment out the line below
    // Response.Cache.SetCacheability(HttpCacheability.NoCache);

    HttpContext.Current.Response.ContentType = "application/ms-excel";
    //Response.AddHeader("Content-Disposition", "attachment;Filename=Orders.xls");

    //Response.Write ("<meta http-equiv=""Content-Type"" content=""text/html; charset=Utf-8"">")

    StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw);
    gv.RenderControl(htw);
    StringBuilder name = new StringBuilder();
    name.Append(cmplbl);
    HttpContext.Current.Response.Write(style);
    HttpContext.Current.Response.Write(name.Append(sw.ToString()));
    //HttpContext.Current.Response.Write(sw.ToString());

    HttpContext.Current.Response.End(); 

    //HttpContext.Current.Response.WriteFile(_filename);
    //Response.ContentType = "application/vnd.ms-excel"
    //Response.AddHeader("Content-Disposition", "attachment;Filename=Orders.xls")
    //Response.Write ("<meta http-equiv=""Content-Type"" content=""text/html; charset=Utf-8"">")
    //dbGrid_Orders.RenderControl(hw)
    //Response.Write(tw.ToString())
    //Response.End()


private void ExportGridView(GridView gvFiles, string filePath, string fileName)

    System.IO.StringWriter sw = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);

    // Render grid view control.
    gvFiles.RenderControl(htw);

    // Write the rendered content to a file.
    string renderedGridView = sw.ToString();
    System.IO.File.WriteAllText(filePath + fileName, renderedGridView);

    //Response.Clear(); 
    //Response.ContentType = "application/octect-stream";
    //Response.AppendHeader("content-disposition", "filename=" + fileName);
    //Response.TransmitFile(filePath + fileName); 
    //Response.End();

    System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
    response.ClearContent();
    response.Clear();
    response.ContentType = "text/plain";
    response.AddHeader("Content-Disposition",
                       "attachment; filename=" + fileName + ";");
    response.TransmitFile(filePath + fileName);
    response.Flush();
    response.End();

【讨论】:

以上是关于如何在.net 2.0中将数据从数据库或DataTable保存到Excel文件而没有响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .Net 2.0/C# 中将 StreamReader 转换为 XMLReader 对象

在 .NET 2.0 中将位图转换为一个多页 TIFF 图像

在 ASP.NET Core 2.0 中将 DataTable 转换为 IEnumerable<T>

ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?

如何在asp.net mvc中将数据从视图传递到控制器

在 VS2010 中将 FSharpx(来自 NuGet)与 F# 2.0 一起使用