C#导出Excel速度慢的解决方案

时间:2022-08-29 14:29:14
C#导出Excel速度奇慢,大概要5分钟时间,这个怎么解决

52 个解决方案

#1


没遇到过,能否贴部分主要代码上来?

我先写一个测试一下,待会儿贴源码

#2


测试导出速度超快滴:
源码:

        private void toolStripLabel4_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Execl文件(*.xls)|*.xls";
            saveFileDialog.FilterIndex = 0;
            saveFileDialog.RestoreDirectory = true;
            saveFileDialog.CreatePrompt = true;
            saveFileDialog.Title = "数据视图导出EXCEL文件"; 
            saveFileDialog.ShowDialog();
            Stream myStream;
            myStream = saveFileDialog.OpenFile();
            StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("utf-8"));
            string str = "";
            DateTime start = DateTime.Now;
            try
            {
                //写标题
                for (int i = 0; i < dataGridView1.ColumnCount; i++)
                {
                    if (i > 0)
                    {
                        str += "\t";
                    }
                    str += dataGridView1.Columns[i].HeaderText;
                }
                sw.WriteLine(str);

                //写内容
                 for (int j = 0; j < dataGridView1.Rows.Count; j++)
                 {
                     string tempStr = "";
                     for (int k = 0; k < dataGridView1.Columns.Count; k++)
                     {
                         if (k > 0)
                         {
                             tempStr += "\t";
                         }
                         if (dataGridView1.Rows[j].Cells[k].Value == null)
                         {
                             tempStr += string.Empty;
                         }
                         else
                         {
                             tempStr += dataGridView1.Rows[j].Cells[k].Value.ToString();
                         }
                     }
                     sw.WriteLine(tempStr);                    
                 }
                 sw.Close();
                 myStream.Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                sw.Close();
                myStream.Close();
            }
            MessageBox.Show("将此工作表导出为excel共耗时:" + DateTime.Now.Subtract(start).TotalMilliseconds.ToString() + "毫秒");
        }

#3


楼上真不错。

#4



string yufuk = "";
            SaveFileDialog dg = new SaveFileDialog();//保存文件对话框,选择导出文件的存放位置
            dg.Filter = "xls files(*.xls)|*.xls";//保存为xls格式
            if (dg.ShowDialog() == DialogResult.OK)
            {
                string filepath = dg.FileName.ToString();//保存文件的路径

                Microsoft.Office.Interop.Excel.Workbooks objBooks;//接口 workbooks
                Microsoft.Office.Interop.Excel.Sheets objSheets;// 接口 sheets
                Microsoft.Office.Interop.Excel._Worksheet objSheet;//接口 worksheet
                //Microsoft.Office.Interop.Excel.Range range = null;
                excel = new Microsoft.Office.Interop.Excel.Application();

                objBooks = excel.Workbooks;
                Object miss = System.Reflection.Missing.Value;
                objBook = objBooks.Add(miss);
                objSheets = objBook.Sheets;
                objSheet = (Microsoft.Office.Interop.Excel._Worksheet)objSheets[1];
                //页边距
                objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.BottomMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.LeftMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.RightMargin = excel.InchesToPoints(0.293700787401575);

                try
                {
                    switch (this.txtPayment.Text)
                    {
                        case "预付30%定金出货前付清全款":
                            yufuk = "预付款(30%)";
                            break;
                        case "预付20%定金出货前付清全款":
                            yufuk = "预付款(20%)";
                            break;
                        case "预付15%定金出货前付清全款":
                            yufuk = "预付款(15%)";
                            break;
                        case "预付10%定金出货前付清全款":
                            yufuk = "预付款(10%)";
                            break;
                        case "出货前验货付清全款":
                            yufuk = "预付款";
                            break;
                        case "月结":
                            yufuk = "预付款";
                            break;
                    }
                    excel.Visible = false; //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写   
                    objSheet.Activate();
                    

#5


代码不完整,太长了,只是前半部分

#6


引用 2 楼 yalan 的回复:
测试导出速度超快滴:
源码:

C# code

        private void toolStripLabel4_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFile……


这个导出来以后都在第一个单元格里了`  比如我有10列`那么所有的这10列都会占到了同一个单元格里面了
改进一下就好了

#7


引用 5 楼 zhangfengyi 的回复:
代码不完整,太长了,只是前半部分


这是完整的导出代码

#8


引用 7 楼 yalan 的回复:
引用 5 楼 zhangfengyi 的回复:
代码不完整,太长了,只是前半部分


这是完整的导出代码


楼上的把导出后在一个单元格的问题解决一下然后发上来

#9



saveexcel . Filter = "Execl files (*.xls)|*.xls|文本文件|*.txt";
               saveexcel . FilterIndex = 0;
               saveexcel.RestoreDirectory = true;
               saveexcel.Title = "導出檔保存路徑";
               saveexcel.FileName = null;
               saveexcel.ShowDialog();
               string FileName = saveexcel.FileName;

                if (FileName.Length != 0)
                {
                 
                   

                    FileStream objFileStream;
                    StreamWriter objStreamWriter;
                    string strLine = "";
     objFileStream = new FileStream(FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                 
                 
                 
                        objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
                    

                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        strLine = strLine + dt.Columns[i].ColumnName.ToString() + Convert.ToChar(9);

                    }
                    objStreamWriter.WriteLine(strLine);
                    strLine = "";

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                       
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            strLine = strLine + dt.Rows[i][j].ToString() + Convert.ToChar(9);
                           
                        }
                        objStreamWriter.WriteLine(strLine);
              
                        strLine = "";
                    }
                    objStreamWriter.Close();
                    objFileStream.Close();
                    MessageBox.Show("資料已經成功導出到:" + saveexcel.FileName.ToString(), "導出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);



#10


用读取数据库的方式应该快点

#11


建议,采用循环导出,不要1次性导出,因为如果数据量大的话,可能很慢。

#12


引用 9 楼 g505149841 的回复:
C# code

saveexcel . Filter = "Execl files (*.xls)|*.xls|文本文件|*.txt";
               saveexcel . FilterIndex = 0;
               saveexcel.RestoreDirectory = true;
               saveexcel.Title ……


跟上上面的一样` 用流往外导出确实要比一个一个往Excel的cell里面导值快`
但是这样格式就乱了` 都在一个单元格里面呢 要是能结合一下就好了

#13


引用 11 楼 army369168520 的回复:
建议,采用循环导出,不要1次性导出,因为如果数据量大的话,可能很慢。

1W行应该没事`采用循环导出效率那个低啊 好像不是电脑在干活
http://topic.csdn.net/u/20110221/15/7c23c4ea-5ed7-49d6-b167-1e202bdbd449.html
大家可以去这个上面看看

就是用的循环导出

#14


数据太多设置进度条
二维数组赋值到单元格

#15


开僻一个新进程来处理`刚才试了一下`也不怎么滴``设进度条也就是提示一下用户而
效率慢还是慢`妈的`就是找不到好办法

#16


数据不是太多,但必须不能用循环,因为每一行都不一样

#17


引用 16 楼 zhangfengyi 的回复:
数据不是太多,但必须不能用循环,因为每一行都不一样


用流导出到文本 就10毫秒左右`导出到excel 800左右,
差太远了

#18


用流导出,格式没法控制

#19


我想知道时间流费在哪里了,我的机器10秒左右,有的机器5分钟,差的太多了

#20


机子配置不一样` 运行的东西不一样`进程优先级不一样

#21


没有解决办法了

#22


格式比较复杂,不用流输出

#23


导出数据太多就慢 C#导出Excel速度慢的解决方案

#24


你导出的数据多大呀?我这里有个例子。可以联系我。

#25


引用 18 楼 zhangfengyi 的回复:
用流导出,格式没法控制


一样可以控制

#26


我之前试过用流是最快的,我在CSDN下载区有一个实例,你可参考下:

C# DataGridView 导出 Excel,只用System.IO文件流快速导出可用窗口代码实例,不受EXCEL版本是否安装Excel的限制, 对20000条记录x 130列数据只需1-2分钟,

http://download.csdn.net/source/1541900

#27


该回复于2011-02-24 08:53:30被版主删除

#28


网上好像有实例,找找看。

#29


该回复于2011-02-24 13:20:26被版主删除

#30


有很多导出方式,有一种先粘贴到系统内存,再从系统内存粘贴到excel很快的

#31


不见意使用流的方法, 格式没法控,需另存文件才能编辑。

#32


nkhuangyanping,没多大,50条记录,

#33


    如果对于Excel的内部数据格式比较清楚的话,使用流输出也是可以控制格式的。最大的好处是,不需要安装office套件。
     不过大部分人不愿意花这个时间来研究格式,就乖乖使用微软提供的库操作吧,速度没流输出快是必然的,使用进度条之类的让它好看一点吧。

#34


该回复于2011-02-25 09:17:04被版主删除

#35


我用流导出的,你要什么输出什么格式?

#36


把一个二维object数组复制给一个扩大后的Range应该是最好的解决方案

导出到CSV速度是比较快,不过,CSV毕竟不是Excel

#37


這個控件特快

網站



my blog
http://ufo-crackerx.blog.163.com/

#38


3楼的方法貌似不好 建议用OFFICE组件

#39


有没有什么优化方案,改进速度,这么慢怎么用啊,其他的软件导出Excel用的什么方法

#40


引用 7 楼 yalan 的回复:
引用 5 楼 zhangfengyi 的回复:
代码不完整,太长了,只是前半部分


这是完整的导出代码



猩猩哥哥  为什么 Microsoft.Office. Interop.Excel点不出来?   是不是 Microsoft Office 2003的问题?

#41


C#导出Excel速度慢的解决方案
这样的格式用什么方式导出更适合

#42


这样的格式用什么方式导出更合适

#43


追求速度,只能用 流文件的方式 导出EXCEL!

#44


引用楼主 zhangfengyi 的回复:
C#导出Excel速度奇慢,大概要5分钟时间,这个怎么解决

webform还是WINFORM?
不行了数据量小点,用CSV

#45


数量量非常小,用CSV,格式怎样控件,要求有合并单元格,控制页边距等

#46


用ado 导入导出

#47


求winform程序好用进度条

#48


c#调用COM组件导出excel客户端不装office可以吗

#49


呵呵!~~

#50


对Excel的com缺少研究,之前下载过一个mvp的代码,速度也很慢。在没有比较好的方案之前,建议楼主使用异步结合进度条来创建Excel文档,首先解决掉窗体假死。

#1


没遇到过,能否贴部分主要代码上来?

我先写一个测试一下,待会儿贴源码

#2


测试导出速度超快滴:
源码:

        private void toolStripLabel4_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Execl文件(*.xls)|*.xls";
            saveFileDialog.FilterIndex = 0;
            saveFileDialog.RestoreDirectory = true;
            saveFileDialog.CreatePrompt = true;
            saveFileDialog.Title = "数据视图导出EXCEL文件"; 
            saveFileDialog.ShowDialog();
            Stream myStream;
            myStream = saveFileDialog.OpenFile();
            StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("utf-8"));
            string str = "";
            DateTime start = DateTime.Now;
            try
            {
                //写标题
                for (int i = 0; i < dataGridView1.ColumnCount; i++)
                {
                    if (i > 0)
                    {
                        str += "\t";
                    }
                    str += dataGridView1.Columns[i].HeaderText;
                }
                sw.WriteLine(str);

                //写内容
                 for (int j = 0; j < dataGridView1.Rows.Count; j++)
                 {
                     string tempStr = "";
                     for (int k = 0; k < dataGridView1.Columns.Count; k++)
                     {
                         if (k > 0)
                         {
                             tempStr += "\t";
                         }
                         if (dataGridView1.Rows[j].Cells[k].Value == null)
                         {
                             tempStr += string.Empty;
                         }
                         else
                         {
                             tempStr += dataGridView1.Rows[j].Cells[k].Value.ToString();
                         }
                     }
                     sw.WriteLine(tempStr);                    
                 }
                 sw.Close();
                 myStream.Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                sw.Close();
                myStream.Close();
            }
            MessageBox.Show("将此工作表导出为excel共耗时:" + DateTime.Now.Subtract(start).TotalMilliseconds.ToString() + "毫秒");
        }

#3


楼上真不错。

#4



string yufuk = "";
            SaveFileDialog dg = new SaveFileDialog();//保存文件对话框,选择导出文件的存放位置
            dg.Filter = "xls files(*.xls)|*.xls";//保存为xls格式
            if (dg.ShowDialog() == DialogResult.OK)
            {
                string filepath = dg.FileName.ToString();//保存文件的路径

                Microsoft.Office.Interop.Excel.Workbooks objBooks;//接口 workbooks
                Microsoft.Office.Interop.Excel.Sheets objSheets;// 接口 sheets
                Microsoft.Office.Interop.Excel._Worksheet objSheet;//接口 worksheet
                //Microsoft.Office.Interop.Excel.Range range = null;
                excel = new Microsoft.Office.Interop.Excel.Application();

                objBooks = excel.Workbooks;
                Object miss = System.Reflection.Missing.Value;
                objBook = objBooks.Add(miss);
                objSheets = objBook.Sheets;
                objSheet = (Microsoft.Office.Interop.Excel._Worksheet)objSheets[1];
                //页边距
                objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.BottomMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.LeftMargin = excel.InchesToPoints(0.393700787401575);
                objSheet.PageSetup.RightMargin = excel.InchesToPoints(0.293700787401575);

                try
                {
                    switch (this.txtPayment.Text)
                    {
                        case "预付30%定金出货前付清全款":
                            yufuk = "预付款(30%)";
                            break;
                        case "预付20%定金出货前付清全款":
                            yufuk = "预付款(20%)";
                            break;
                        case "预付15%定金出货前付清全款":
                            yufuk = "预付款(15%)";
                            break;
                        case "预付10%定金出货前付清全款":
                            yufuk = "预付款(10%)";
                            break;
                        case "出货前验货付清全款":
                            yufuk = "预付款";
                            break;
                        case "月结":
                            yufuk = "预付款";
                            break;
                    }
                    excel.Visible = false; //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写   
                    objSheet.Activate();
                    

#5


代码不完整,太长了,只是前半部分

#6


引用 2 楼 yalan 的回复:
测试导出速度超快滴:
源码:

C# code

        private void toolStripLabel4_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFile……


这个导出来以后都在第一个单元格里了`  比如我有10列`那么所有的这10列都会占到了同一个单元格里面了
改进一下就好了

#7


引用 5 楼 zhangfengyi 的回复:
代码不完整,太长了,只是前半部分


这是完整的导出代码

#8


引用 7 楼 yalan 的回复:
引用 5 楼 zhangfengyi 的回复:
代码不完整,太长了,只是前半部分


这是完整的导出代码


楼上的把导出后在一个单元格的问题解决一下然后发上来

#9



saveexcel . Filter = "Execl files (*.xls)|*.xls|文本文件|*.txt";
               saveexcel . FilterIndex = 0;
               saveexcel.RestoreDirectory = true;
               saveexcel.Title = "導出檔保存路徑";
               saveexcel.FileName = null;
               saveexcel.ShowDialog();
               string FileName = saveexcel.FileName;

                if (FileName.Length != 0)
                {
                 
                   

                    FileStream objFileStream;
                    StreamWriter objStreamWriter;
                    string strLine = "";
     objFileStream = new FileStream(FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                 
                 
                 
                        objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
                    

                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        strLine = strLine + dt.Columns[i].ColumnName.ToString() + Convert.ToChar(9);

                    }
                    objStreamWriter.WriteLine(strLine);
                    strLine = "";

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                       
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            strLine = strLine + dt.Rows[i][j].ToString() + Convert.ToChar(9);
                           
                        }
                        objStreamWriter.WriteLine(strLine);
              
                        strLine = "";
                    }
                    objStreamWriter.Close();
                    objFileStream.Close();
                    MessageBox.Show("資料已經成功導出到:" + saveexcel.FileName.ToString(), "導出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);



#10


用读取数据库的方式应该快点

#11


建议,采用循环导出,不要1次性导出,因为如果数据量大的话,可能很慢。

#12


引用 9 楼 g505149841 的回复:
C# code

saveexcel . Filter = "Execl files (*.xls)|*.xls|文本文件|*.txt";
               saveexcel . FilterIndex = 0;
               saveexcel.RestoreDirectory = true;
               saveexcel.Title ……


跟上上面的一样` 用流往外导出确实要比一个一个往Excel的cell里面导值快`
但是这样格式就乱了` 都在一个单元格里面呢 要是能结合一下就好了

#13


引用 11 楼 army369168520 的回复:
建议,采用循环导出,不要1次性导出,因为如果数据量大的话,可能很慢。

1W行应该没事`采用循环导出效率那个低啊 好像不是电脑在干活
http://topic.csdn.net/u/20110221/15/7c23c4ea-5ed7-49d6-b167-1e202bdbd449.html
大家可以去这个上面看看

就是用的循环导出

#14


数据太多设置进度条
二维数组赋值到单元格

#15


开僻一个新进程来处理`刚才试了一下`也不怎么滴``设进度条也就是提示一下用户而
效率慢还是慢`妈的`就是找不到好办法

#16


数据不是太多,但必须不能用循环,因为每一行都不一样

#17


引用 16 楼 zhangfengyi 的回复:
数据不是太多,但必须不能用循环,因为每一行都不一样


用流导出到文本 就10毫秒左右`导出到excel 800左右,
差太远了

#18


用流导出,格式没法控制

#19


我想知道时间流费在哪里了,我的机器10秒左右,有的机器5分钟,差的太多了

#20


机子配置不一样` 运行的东西不一样`进程优先级不一样

#21


没有解决办法了

#22


格式比较复杂,不用流输出

#23


导出数据太多就慢 C#导出Excel速度慢的解决方案

#24


你导出的数据多大呀?我这里有个例子。可以联系我。

#25


引用 18 楼 zhangfengyi 的回复:
用流导出,格式没法控制


一样可以控制

#26


我之前试过用流是最快的,我在CSDN下载区有一个实例,你可参考下:

C# DataGridView 导出 Excel,只用System.IO文件流快速导出可用窗口代码实例,不受EXCEL版本是否安装Excel的限制, 对20000条记录x 130列数据只需1-2分钟,

http://download.csdn.net/source/1541900

#27


该回复于2011-02-24 08:53:30被版主删除

#28


网上好像有实例,找找看。

#29


该回复于2011-02-24 13:20:26被版主删除

#30


有很多导出方式,有一种先粘贴到系统内存,再从系统内存粘贴到excel很快的

#31


不见意使用流的方法, 格式没法控,需另存文件才能编辑。

#32


nkhuangyanping,没多大,50条记录,

#33


    如果对于Excel的内部数据格式比较清楚的话,使用流输出也是可以控制格式的。最大的好处是,不需要安装office套件。
     不过大部分人不愿意花这个时间来研究格式,就乖乖使用微软提供的库操作吧,速度没流输出快是必然的,使用进度条之类的让它好看一点吧。

#34


该回复于2011-02-25 09:17:04被版主删除

#35


我用流导出的,你要什么输出什么格式?

#36


把一个二维object数组复制给一个扩大后的Range应该是最好的解决方案

导出到CSV速度是比较快,不过,CSV毕竟不是Excel

#37


這個控件特快

網站



my blog
http://ufo-crackerx.blog.163.com/

#38


3楼的方法貌似不好 建议用OFFICE组件

#39


有没有什么优化方案,改进速度,这么慢怎么用啊,其他的软件导出Excel用的什么方法

#40


引用 7 楼 yalan 的回复:
引用 5 楼 zhangfengyi 的回复:
代码不完整,太长了,只是前半部分


这是完整的导出代码



猩猩哥哥  为什么 Microsoft.Office. Interop.Excel点不出来?   是不是 Microsoft Office 2003的问题?

#41


C#导出Excel速度慢的解决方案
这样的格式用什么方式导出更适合

#42


这样的格式用什么方式导出更合适

#43


追求速度,只能用 流文件的方式 导出EXCEL!

#44


引用楼主 zhangfengyi 的回复:
C#导出Excel速度奇慢,大概要5分钟时间,这个怎么解决

webform还是WINFORM?
不行了数据量小点,用CSV

#45


数量量非常小,用CSV,格式怎样控件,要求有合并单元格,控制页边距等

#46


用ado 导入导出

#47


求winform程序好用进度条

#48


c#调用COM组件导出excel客户端不装office可以吗

#49


呵呵!~~

#50


对Excel的com缺少研究,之前下载过一个mvp的代码,速度也很慢。在没有比较好的方案之前,建议楼主使用异步结合进度条来创建Excel文档,首先解决掉窗体假死。