c# 大批量数据导出到excel[此为个人分享]

rocket2010 2011-07-24 01:26:47
我的方法不是使用微软的excel操作类,因为那种实在爆慢,一个个单元格循环写,实在太慢了。【不信朋友们可以试试】
而使用io写的话 半分钟都不用
我数据库数据量为:120000行 29列

技术要点:1.使用的是StreamWriter sw = new StreamWriter(path, false,Encoding.GetEncoding("gb2312"));最终生成文件
2.使用 StringBuilder sb = new StringBuilder();类把查询出来的数据组合为一句超长字符串一次性插入到excel中,
sb.Append(ds.Tables[0].Columns[k].ColumnName.ToString() + "\t");
注意,可不能漏了"\t" 这个是非常重要的! 因为c# "\t"就等于 键盘上的Tab [朋友们可以试试:打开新的txt然后输入1按Tab,输入2按Tab,输入3按Tab保存,然后打开excel文件 把刚刚保存的txt文件拉进去打开你就发现原来。这样写的话1 2 3 会分别在每个单元格上的了。所以上面才使用 "\t"连起来数据库出来的那堆数据,这样一次性导进去,他们就会按照每个单元格来填充!]

需要引用:
using System.Threading;
using System.IO;
方法如下:

private void button1_Click(object sender, EventArgs e)
{
saveFileDialog1.Title = "保存的excel文件";
saveFileDialog1.InitialDirectory = "c:\\";
saveFileDialog1.Filter = "Excel97-2003 (*.xls)|*.xls|All Files (*.*)|*.*";
saveFileDialog1.ShowDialog();
if (saveFileDialog1.FileName == "" || saveFileDialog1.FileName == null)
{
MessageBox.Show("文件名不能为空!");
return;
}
string path = saveFileDialog1.FileName;
string constr = "Data Source=.;Initial Catalog=Exhibition;User ID=sa;Password=";
string sql = GetStrSql();
DataSet ds=new DataSet();
using (SqlConnection con = new SqlConnection(constr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, con);
da.Fill(ds);
}
if (ds == null)
{
MessageBox.Show("数据获取有误!");
return;
}
WriteExcel(ds, path);
}

public void WriteExcel(DataSet ds, string path)
{
try
{
long totalCount = ds.Tables[0].Rows.Count;
lblTip.Text = "共有" + totalCount + "条数据。";
Thread.Sleep(1000);
long rowRead = 0;
float percent = 0;

StreamWriter sw = new StreamWriter(path, false,Encoding.GetEncoding("gb2312"));
StringBuilder sb = new StringBuilder();
for (int k = 0; k < ds.Tables[0].Columns.Count; k++)
{
sb.Append(ds.Tables[0].Columns[k].ColumnName.ToString() + "\t");
}
sb.Append(Environment.NewLine);

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
Pbar.Maximum = (int)totalCount;
Pbar.Value = (int)rowRead;
lblTip.Text = "正在写入[" + percent.ToString("0.00") + "%]...的数据";
System.Windows.Forms.Application.DoEvents();

for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
sb.Append(ds.Tables[0].Rows[i][j].ToString() + "\t");
}
sb.Append(Environment.NewLine);
}
sw.Write(sb.ToString());
sw.Flush();
sw.Close();
MessageBox.Show("已经生成指定Excel文件!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

public string GetStrSql()
{
string strSql = "select d.* from ( select cBarcode ,max(case halldoorid When '36' then '1' else '0' end ) [1.1号馆],max(case halldoorid When '37' then '1' else '0' end ) [2.1号馆],max(case halldoorid When '38' then '1' else '0' end ) [3.1号馆],max(case halldoorid When '39' then '1' else '0' end ) [4.1号馆],max(case halldoorid When '40' then '1' else '0' end ) [5.1号馆],max(case halldoorid When '41' then '1' else '0' end ) [6.1号馆],max(case halldoorid When '42' then '1' else '0' end ) [8.1号馆],max(case halldoorid When '43' then '1' else '0' end ) [1.2号馆],max(case halldoorid When '44' then '1' else '0' end ) [2.2号馆],max(case halldoorid When '45' then '1' else '0' end ) [3.2号馆],max(case halldoorid When '46' then '1' else '0' end ) [4.2号馆],max(case halldoorid When '47' then '1' else '0' end ) [5.2号馆],max(case halldoorid When '48' then '1' else '0' end ) [9.1号馆],max(case halldoorid When '49' then '1' else '0' end ) [10.1号馆],max(case halldoorid When '50' then '1' else '0' end ) [11.1号馆],max(case halldoorid When '51' then '1' else '0' end ) [12.1号馆],max(case halldoorid When '52' then '1' else '0' end ) [13.1号馆],max(case halldoorid When '53' then '1' else '0' end ) [9.2号馆],max(case halldoorid When '54' then '1' else '0' end ) [10.2号馆],max(case halldoorid When '55' then '1' else '0' end ) [11.2号馆],max(case halldoorid When '56' then '1' else '0' end ) [12.2号馆],max(case halldoorid When '57' then '1' else '0' end ) [13.2号馆],max(case halldoorid When '58' then '1' else '0' end ) [9.3号馆],max(case halldoorid When '59' then '1' else '0' end ) [10.3号馆],max(case halldoorid When '60' then '1' else '0' end ) [11.3号馆],max(case halldoorid When '61' then '1' else '0' end ) [VIP3.2号馆],max(case halldoorid When '62' then '1' else '0' end ) [VIP11.3号馆],max(case halldoorid When '63' then '1' else '0' end ) [VIP14.3号馆]from tblReadCard group by cBarcode ) d left join ( select cBarcode 观众条码 from (select distinct cBarcode,cReadDate from tblReadCard where cReadDate between '2011-07-08' and '2011-07-11') a group by cBarcode ) c on d.cBarcode=c.观众条码 group by cBarcode,[1.1号馆],[2.1号馆],[3.1号馆],[4.1号馆],[5.1号馆],[6.1号馆],[8.1号馆],[1.2号馆],[2.2号馆],[3.2号馆],[4.2号馆],[5.2号馆],[9.1号馆],[10.1号馆],[11.1号馆],[12.1号馆],[13.1号馆],[9.2号馆],[10.2号馆],[11.2号馆],[12.2号馆],[13.2号馆],[9.3号馆],[10.3号馆],[11.3号馆],[VIP3.2号馆],[VIP11.3号馆],[VIP14.3号馆]";
return strSql;
}
...全文
8073 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
文走520 2014-01-21
  • 打赏
  • 举报
回复
支持一下,挺不错的,刚好需要,记下了。谢谢。
jskoki 2013-12-16
  • 打赏
  • 举报
回复
非常不错的实用的技巧
shuzhiguoxing 2013-11-26
  • 打赏
  • 举报
回复
引用 13 楼 scm_2008 的回复:
您尝试打开的文件“xx.xls”的格式与文件扩展名指定的格式不一致。打开文件前请检验文件没有损坏且来源可信。是否立即打开该文件? 导出后,用Excel打开有这个提示,点击“是”,可以正确打开。 为什么会有这个提示?
怎么去掉提示框呢?急求
shuzhiguoxing 2013-11-26
  • 打赏
  • 举报
回复
引用 12 楼 dreamrising 的回复:
其实是csv文件
我用的也是这种放大导出excel,请问这种问题怎么解决,导出时不提示??
serwg 2013-11-21
  • 打赏
  • 举报
回复
新手,学习,学习。。。。。。。。。。。。。
飞粤黄河 2013-10-14
  • 打赏
  • 举报
回复
如果一个sheet页不超过65535行,超过以后如何新建一个sheet页面来保存。 请问哪位大侠知道如何操作,求源码
sy_dingzi 2013-07-22
  • 打赏
  • 举报
回复
楼主我对你的12W导入到excel不太明白 一个sheet只能导入6W多 你是怎么做到的
眨眼瞬逝 2013-06-27
  • 打赏
  • 举报
回复
如果不经过数据库直接把excel文件当成个数据源来进行处理,读出了excel文件内容怎么把excel内容显示在gridview控件中呢?
edison 2013-05-17
  • 打赏
  • 举报
回复
收藏一下.....
gfxm 2013-04-30
  • 打赏
  • 举报
回复
我这两天碰到了大量数据导入EXCEL的问题,开始我也是用一个个单元格导入的方法,但是导入的速度实在太慢了,今天在楼主这里发现了新方法,谢谢了。
wj373944728 2013-04-23
  • 打赏
  • 举报
回复
引发类型为“System.OutOfMemoryException”的异常。 知道请告诉我,谢谢。QQ:373944728 邮箱wj373944728@126.com
wj373944728 2013-04-23
  • 打赏
  • 举报
回复
我有个导出EXCEL,10万条数据,为什么StringBuilder strb = new StringBuilder(); strb.Append(); 方法时就会报错,这是为什么?
jerome_s 2012-10-22
  • 打赏
  • 举报
回复
啊 不懂啊~新手 各种报错。 楼主怎么不多写点注释呢?
ymhd16 2012-09-06
  • 打赏
  • 举报
回复

我就没看出来,是怎么解决的。。。

楼主确信Excel能在一个sheet打开 12W条? 解释一下!!

[Quote=引用 15 楼 的回复:]
一个sheet页不能超过65535行,超过以后你可以新建一个sheet页面来保存。
[/Quote]
ynn0705 2012-07-13
  • 打赏
  • 举报
回复
支持下!
gk250255198 2012-05-28
  • 打赏
  • 举报
回复
往一个已经写了部分表头的execl中怎么追加?
blackwolves 2011-10-27
  • 打赏
  • 举报
回复
好贴,哥们太牛了
rocket2010 2011-08-09
  • 打赏
  • 举报
回复
弟,那你帮忙改善下那个SQL嘛
qch2007qch 2011-08-08
  • 打赏
  • 举报
回复
哥哥……你一条sql写这么长……至于么……
luqing200862 2011-08-08
  • 打赏
  • 举报
回复
路过 围观~~~~~···
加载更多回复(26)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧