C#.net在不打开文件的情况下导出数据到已有excel文件中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#.net在不打开文件的情况下导出数据到已有excel文件中相关的知识,希望对你有一定的参考价值。

将GridView中的数据导出为Excel是web应用中的常见功能。在不同的应用场景下有不同的导出技术。在本文中我将介绍一些导出的技术,希望对您有所帮助

GridView Export the Excel (Basic Code):
首先看一个基础的应用。创建一个表格,见截图

然后将数据库中的数据绑定到GridView中的数据,代码如下:private void BindData() SqlConnection myConnection = new SqlConnection("Server=localhost;Database=School;Trusted_Connection=true"); SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM Users", myConnection); DataSet ds = new DataSet(); ad.Fill(ds); gvUsers.DataSource = ds; gvUsers.DataBind();

现在,GridView中已经绑定了数据,接下来的任务就是导出到Excel。下面是button事件中的代码Response.ClearContent(); Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls"); Response.ContentType = "application/excel"; StringWriter sw = new StringWriter(); htmlTextWriter htw = new HtmlTextWriter(sw); gvUsers.RenderControl(htw); Response.Write(sw.ToString()); Response.End();

并且还需要override一下VerifyRenderingInServerForm方法(这一点非常重要,否则在点击按钮后会报错,译者注),代码如下:public override void VerifyRenderingInServerForm(Control control)

点击导出按钮后会弹出对话框,询问您打开或保存。选择打开文件,导出到Excel的结果如下图:

Exporting GridView to Excel With Style:

您是否注意到了以上代码存在一些的问题?是的,ID列开头的0都被截去了。如果你的ID是000345,导出后就编程了345。这个问题可以通过把css添加到输出流中来解决。为了使ID列正确显示,您需要将其储存为文本格式。Excel中的文本格式表示为"mso-number-format:"\@"。protected void Btn_ExportClick(object sender, EventArgs e) string style = @"<style> .text mso-number-format:\@; </script> "; Response.ClearContent(); Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls"); Response.ContentType = "application/excel"; StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); gvUsers.RenderControl(htw); // Style is added dynamically Response.Write(style); Response.Write(sw.ToString()); Response.End(); public override void VerifyRenderingInServerForm(Control control)

在上面的代码中,我通过”style”变量来控制GridView列的样式。并通过Respnose.Write方法将其添加到输出流中。最后把样式添加到ID列。这一步需要在RowDataBound事件中完成protected void gvUsers_RowDataBound(object sender, GridViewRowEventArgs e) if (e.Row.RowType == DataControlRowType.DataRow) e.Row.Cells[1].Attributes.Add("class", "text");

修改的结果如下:

Exporting GridView With LinkButtons and Paging:

如果要导出的GridView中包含LinkButton或者分页(出现分页码时,译者注) 则将出现错误:

<%@ Page Language="C#" EnableEventValidation="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

通过修改页文件可以修正这个问题:EnableEventValidation = "false".
看一下导出的文件

在导出的文件中可以看见linkbutton和dropdownlist控件,虽然dropdownlist控件显示的数据的确是用户所选的项,但怎么看也不像是一个导出文件(我倒是觉的挺cool的:)译者注),现在应如何移除dropdownlist并显示选择的文字呢?

我写了一个DisableControls函数,用使循环的方法将linkbutton和dropdownlist替换成literal控件private void DisableControls(Control gv) LinkButton lb = new LinkButton(); Literal l = new Literal(); string name = String.Empty; for (int i = 0; i < gv.Controls.Count; i++) if (gv.Controls[i].GetType() == typeof(LinkButton)) l.Text = (gv.Controls[i] as LinkButton).Text; gv.Controls.Remove(gv.Controls[i]); gv.Controls.AddAt(i, l); else if (gv.Controls[i].GetType() == typeof(DropDownList)) l.Text = (gv.Controls[i] as if (gv.Controls[i].HasControls()) DisableControls(gv.Controls[i]);

方法非常简单,只需将linkbuton和dropdownlist替换成literal控件,并将选择项赋值给literal控件的文本属性。该方法需要在导出前调用protected void Btn_ExportExcelPaging(object sender, EventArgs e) DisableControls(gvUsers); Response.ClearContent(); Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls"); Response.ContentType = "application/excel"; StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); gvUsers.RenderControl(htw); Response.Write(sw.ToString()); Response.End();

现在的Excel中就只剩下选中文本了

!2.如果导出来的是乱码,可以试试加上这两句:
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
参考技术A 要向任何一个文件写入数据必然要打开这个文件,不然不可能。 参考技术B 你用 数据流的形式试一试。

以上是关于C#.net在不打开文件的情况下导出数据到已有excel文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何在不保存 MS 访问查询的情况下将查询数据导出到 txt 文件

PHP:在不改变 memory_limit 和 max_execution_time 的情况下读取和导出大数据

如何在不提取Java的情况下读取压缩文件的内容

如何在不打开的情况下从 CSV 文件中检索数据

在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?

如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?