随笔 - 232, 文章 - 25, 评论 - 1261, 阅读 - 331万
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

DataTable导出到Excel、GSV

Posted on   停留的风  阅读(2004)  评论(3编辑  收藏  举报

     在程序开发中经常会遇到大量数据的操作问题,有的时候还是少不了Excel,GSV等,需要进行数据文件类型的备份。

     当然可以在数据端可以操作。右点击数据库->任务->导出数据->数据源选择应该导出的格式。下一步就可以编写SQL语句获得自己想要的数据啦,但是这个需要操作数据库,而真正的系统开发中,能够直接操作数据库的人很少。所以这种方法只能作为管理做临时查询时使用。

      在开发过程中,特别是进行查询统计的时候,需要将一些数据报表,导出到Excel或者其它的存储格式,用于打印、文档分析、提交报告等。这就要求我们在程序开发的时候进行处理,提供接口供用户导出数据。下面就简单介绍几种将数据导出到Excel的方法。

<1>将数据导出,存储在服务器,然后提供链接用于用户下载,其特点:

  • 结果可以持久保存,用户可以下载历史版本
  • 占用服务器空间
  • 依赖控件属性

     具体的逻辑代码如下:

复制代码
导出到Excel,存放于服务器端 Code
protected void Button2_Click(object sender, EventArgs e)
{
DataTable thisTable
= AddTimeBusiness.getInstance().GetTable();

StringWriter stringWriter
= new StringWriter();
HtmlTextWriter htmlWriter
= new HtmlTextWriter(stringWriter);
DataGrid excel
= new DataGrid();
excel.DataSource
= thisTable.DefaultView;
//绑定到DataGrid
excel.DataBind();
excel.RenderControl(htmlWriter);
//这里指定文件的路径
string filestr = "d:\\data\\" + "11.xls";
int pos = filestr.LastIndexOf("\\");
string file = filestr.Substring(0, pos);
if (!Directory.Exists(file))
{
Directory.CreateDirectory(file);
}
System.IO.StreamWriter sw
= new StreamWriter(filestr);
sw.Write(stringWriter.ToString());
sw.Close();
}
复制代码

 

<2>当用户导出时,直接将数据导出客户端,几种方法,感觉此类方法比较适用。

       其特点:随时生成,在服务器没有保存副本,方便、快捷。

       具体的逻辑代码如下面小例子:

复制代码
导出到Excel
//根据需要得到数据表
DataTable thisTable = getTable(condition.ToString());
if (thisTable != null)
{
StringWriter sw
= new StringWriter();
sw.WriteLine(
"编号\t帐号\t姓名\t电话\t地址\t金额\t开通时间");
foreach (DataRow dr in thisTable.Rows)
{
sw.WriteLine(dr[
"F_ID"] + "\t" + dr["F_Psnid"] + "\t" + dr["F_Name"] + "\t" + dr["F_Tel"]
        + "\t" + dr["F_Address"] + "\t" + dr["F_TradeMoney"] + "\t" + dr["F_TradeTime"]);
}
sw.Close();
Response.AddHeader(
"Content-Disposition", "attachment; filename=YinHeUserInfo.xls");
Response.ContentType
= "application/ms-excel";
Response.ContentEncoding
= System.Text.Encoding.GetEncoding("GB2312");
Response.Write(sw);
Response.End();
}
复制代码


       补充:如果需要导出为GSV文件,只需要上例分隔符“\t”用“,”替换就可以了。

<3>即可下载到客户端,又能够在服务器保存副本。可以说,此方法满足了以上的两种方法的功能。

      如果你只想将结果保存在服务器端,则此种方法比第一种方法更加合理,不用过分的依赖控件的属性。其实这就是一种文件流的操作。所以第一种方法不可取。

复制代码
Code
string filePath = "d:\\data.xls";//这个你可以自己修改为虚拟路径
FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
StreamWriter sw
= new StreamWriter(fs, System.Text.Encoding.GetEncoding("gb2312"));
sw.WriteLine(
"编号\t帐号\t姓名\t电话\t地址\t金额\t开通时间");
foreach (DataRow dr in thisTable.Rows)
{
sw.WriteLine(dr[
"F_ID"] + "\t" + dr["F_Psnid"] + "\t" + dr["F_Name"] + "\t" + dr["F_Tel"]
      + "\t" + dr["F_Address"] + "\t" + dr["F_TradeMoney"] + "\t" + dr["F_TradeTime"]);
}
sw.Close();
fs.Close();
#region==如果要下载到客户端,则添加下列代码==
//Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(filePath));
//Response.ContentType = "application/ms-excel";// 指定返回的是一个不能被客户端读取的流,必须被下载
//Response.WriteFile(filePath); // 把文件流发送到客户端
//Response.End();
#endregion
复制代码

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示