c#大数据量导出Excel时分sheet导出

u012764390 2016-01-27 03:20:43
有一个万级的数据量导出到Excel出现假死,现在准备分sheet导出,怎么做呢。
...全文
688 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
........
江南小鱼 2016-01-28
  • 打赏
  • 举报
回复
不解释,给你完整点的代码~
DataTable CreateData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("consNo", typeof(String));
            dt.Columns.Add("consName", typeof(String));
            dt.Columns.Add("oweAmt", typeof(Decimal));
            for (int i = 0; i < 440001; i++)
            {
                DataRow dr = dt.NewRow();
                dr["consNo"] = i.ToString();
                dr["consName"] = "Jimmy" + i.ToString();
                dr["oweAmt"] = Convert.ToDecimal(i * 0.32 + 44.26);
                dt.Rows.Add(dr);
            }

            return dt;
        }
void ExportExcel()
        {
            DataTable dt = CreateData();
            using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "test.xls", false, Encoding.GetEncoding("gb2312")))
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sb.Append(dt.Columns[i].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);

                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    for (int c = 0; c < dt.Columns.Count; c++)
                    {
                        sb.Append(dt.Rows[r][c].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());
                sw.Flush();
                sw.Close();
                MessageBox.Show("导出成功");
            }
        }
oqqJue 2016-01-28
  • 打赏
  • 举报
回复
引用 6 楼 lovelj2012 的回复:
换种思路,用写文件的方式生成excel 44w条记录,秒级导出excel
using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "test.xls", false, Encoding.GetEncoding("gb2312")))
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sb.Append(dt.Columns[i].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);

                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    for (int c = 0; c < dt.Columns.Count; c++)
                    {
                        sb.Append(dt.Rows[r][c].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());
                sw.Flush();
                sw.Close();
                MessageBox.Show("导出成功");
            }
ColumnName和dt.Rows[r][c]这两块地方报错,您再帮忙指点下
江南小鱼 2016-01-28
  • 打赏
  • 举报
回复
撸主,仔细看下14#给你的回复,动动脑筋
oqqJue 2016-01-28
  • 打赏
  • 举报
回复
引用 13 楼 lovelj2012 的回复:
晕~ 1、你会给datagridview绑定数据源吧?比如说数据源是一个DataTable
DataTable CreateData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("consNo", typeof(String));
            dt.Columns.Add("consName", typeof(String));
            dt.Columns.Add("oweAmt", typeof(Decimal));
            for (int i = 0; i < 440001; i++)
            {
                DataRow dr = dt.NewRow();
                dr["consNo"] = i.ToString();
                dr["consName"] = "Jimmy" + i.ToString();
                dr["oweAmt"] = Convert.ToDecimal(i * 0.32 + 44.26);
                dt.Rows.Add(dr);
            }

            return dt;
        }
//datagridview绑定数据源
datagridview1.DataSource = CreateData();
2、导出的时候,把datagridview的数据源转换成DataTable
DataTable dt = datagridview1.DataSource as DataTable;
3、导出excel
void ExportExcel()
        {
            DataTable dt = datagridview1.DataSource as DataTable;
            using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "test.xls", false, Encoding.GetEncoding("gb2312")))
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sb.Append(dt.Columns[i].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);

                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    for (int c = 0; c < dt.Columns.Count; c++)
                    {
                        sb.Append(dt.Rows[r][c].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());
                sw.Flush();
                sw.Close();
                MessageBox.Show("导出成功");
            }
        }
可是我的datagridview里面有数据,是从数据库里面查出来的,不用绑定了吧,您别急,我刚学的
江南小鱼 2016-01-28
  • 打赏
  • 举报
回复
晕~ 1、你会给datagridview绑定数据源吧?比如说数据源是一个DataTable
DataTable CreateData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("consNo", typeof(String));
            dt.Columns.Add("consName", typeof(String));
            dt.Columns.Add("oweAmt", typeof(Decimal));
            for (int i = 0; i < 440001; i++)
            {
                DataRow dr = dt.NewRow();
                dr["consNo"] = i.ToString();
                dr["consName"] = "Jimmy" + i.ToString();
                dr["oweAmt"] = Convert.ToDecimal(i * 0.32 + 44.26);
                dt.Rows.Add(dr);
            }

            return dt;
        }
//datagridview绑定数据源
datagridview1.DataSource = CreateData();
2、导出的时候,把datagridview的数据源转换成DataTable
DataTable dt = datagridview1.DataSource as DataTable;
3、导出excel
void ExportExcel()
        {
            DataTable dt = datagridview1.DataSource as DataTable;
            using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "test.xls", false, Encoding.GetEncoding("gb2312")))
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sb.Append(dt.Columns[i].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);

                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    for (int c = 0; c < dt.Columns.Count; c++)
                    {
                        sb.Append(dt.Rows[r][c].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());
                sw.Flush();
                sw.Close();
                MessageBox.Show("导出成功");
            }
        }
oqqJue 2016-01-28
  • 打赏
  • 举报
回复
引用 11 楼 lovelj2012 的回复:
不解释,给你完整点的代码~
DataTable CreateData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("consNo", typeof(String));
            dt.Columns.Add("consName", typeof(String));
            dt.Columns.Add("oweAmt", typeof(Decimal));
            for (int i = 0; i < 440001; i++)
            {
                DataRow dr = dt.NewRow();
                dr["consNo"] = i.ToString();
                dr["consName"] = "Jimmy" + i.ToString();
                dr["oweAmt"] = Convert.ToDecimal(i * 0.32 + 44.26);
                dt.Rows.Add(dr);
            }

            return dt;
        }
void ExportExcel()
        {
            DataTable dt = CreateData();
            using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "test.xls", false, Encoding.GetEncoding("gb2312")))
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sb.Append(dt.Columns[i].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);

                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    for (int c = 0; c < dt.Columns.Count; c++)
                    {
                        sb.Append(dt.Rows[r][c].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());
                sw.Flush();
                sw.Close();
                MessageBox.Show("导出成功");
            }
        }
我是要把datagridview的数据保存下来,和这个有什么区别吗,我是真的不懂,您多谅解
jointan 2016-01-27
  • 打赏
  • 举报
回复
直 接 对 目 标 单 元 集 扔 一 个 object[x,x](二 维 数 组 ) 简单点 说 ,可 以 把 任 何 一 个 二 维 数 组 直 接 赋 值 组 一 个 长 宽 相 同 的 Excel.Range
江南小鱼 2016-01-27
  • 打赏
  • 举报
回复
可以~ 你不会测试一下啊,撸主
u012764390 2016-01-27
  • 打赏
  • 举报
回复
引用 6 楼 lovelj2012 的回复:
换种思路,用写文件的方式生成excel 44w条记录,秒级导出excel
using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "test.xls", false, Encoding.GetEncoding("gb2312")))
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sb.Append(dt.Columns[i].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);

                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    for (int c = 0; c < dt.Columns.Count; c++)
                    {
                        sb.Append(dt.Rows[r][c].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());
                sw.Flush();
                sw.Close();
                MessageBox.Show("导出成功");
            }
服务器上没安装office可以不?
江南小鱼 2016-01-27
  • 打赏
  • 举报
回复
换种思路,用写文件的方式生成excel 44w条记录,秒级导出excel
using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "test.xls", false, Encoding.GetEncoding("gb2312")))
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sb.Append(dt.Columns[i].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);

                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    for (int c = 0; c < dt.Columns.Count; c++)
                    {
                        sb.Append(dt.Rows[r][c].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());
                sw.Flush();
                sw.Close();
                MessageBox.Show("导出成功");
            }
本拉灯 2016-01-27
  • 打赏
  • 举报
回复
就算你有1W条也不会卡死呀,干毛分页?卡死可能是你在转成XML的时候卡死了吧
u012764390 2016-01-27
  • 打赏
  • 举报
回复
引用 1 楼 wyd1520 的回复:
用Aspose.Cell
我现在查询出来的所有数据全部转换成了XML的形式怎么分页导出呢??
u012764390 2016-01-27
  • 打赏
  • 举报
回复
我现在查询出来的所有数据全部转换成了XML的形式怎么分页导出呢??
小鬼当家家 2016-01-27
  • 打赏
  • 举报
回复
把数据分页,然后每一个sheet加载一页数据
本拉灯 2016-01-27
  • 打赏
  • 举报
回复
用Aspose.Cell
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据到EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据到EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据都很小,我想4种方法就代码和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。
网站开发中经常遇到大数据导入数据库,或者数据库导出到文档中。本文结合项目实际,总结出比较实用的Excel文件导入到数据库和数据库导出Excel表格中,供大家学习参考。 一、 数据库表与Excel表结构 1、 Excel表结构 2、 数据库Fms_Employee表结构 注意:要导入的Excel表列必须与数据库Fms_Employee表的属性列一一对应。 3、 前台设计      Excel表数据导入到MS SQL数据库 protected void InfoImport_Click(object sender, EventArgs e) { try { string fileName = FileUpload1.FileName; string savePath = Server.MapPath(("~\\upfiles\\")+fileName); FileUpload1.SaveAs(savePath); string strCon = "Provider=Microsoft.Jet.Oledb.4.0;"+"Data Source="+savePath+";Extended Properties='Excel 8.0;HDR=yes;IMEX=1'"; OleDbConnection odc=new OleDbConnection(strCon); odc.Open(); string strCmd=string.Format("select * from [{0}$]","sheet1"); OleDbDataAdapter oda=new OleDbDataAdapter(strCmd,odc); DataSet ds=new DataSet(); oda.Fill(ds,"sheet1"); foreach(DataRow dr in ds.Tables[0].Rows) { InsertToSql(dr); } Response.Write("[removed]alert('导入成功!');[removed]"); } catch { Response.Write("[removed]alert('导入的Excel文件格式不正确!');[removed]"); } } private void InsertToSql(DataRow dr) { SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["ConnectionDataBase"]); string employeeID = dr[0].ToString(); string domainName = dr[1].ToString(); string name = dr[2].ToString(); string roleID = dr[3].ToString(); string departID = dr[4].ToString(); string department = dr[5].ToString(); con.Open(); string sql = "insert into Fms_Employee Values('" + employeeID + "','" + domainName + "','" + name + "','" + roleID + "','

110,538

社区成员

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

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

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