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

u012764390 2016-01-27 03:20:43
有一个万级的数据量导出到Excel出现假死,现在准备分sheet导出,怎么做呢。
...全文
701 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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

111,098

社区成员

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

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

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