如何在.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>