首页 新闻 会员 周边

C# 导出Excel出错

0
悬赏园豆:20 [已解决问题] 解决于 2015-08-16 15:15

//给Excel对象添加一个Workbooks

excel.Application.Workbooks.Add(true);

此条语句报错,错误为:内存或磁盘空间不足,Microsoft Office Excel无法再次打开或保存任何文档

 1 public void ExportExcel(DataGridView dgv) 
 2         {
 3             if (dgv.Rows.Count == 0)
 4             {
 5                 MessageBox.Show("没有数据可以导出");
 6                 return;
 7             }
 8             //try
 9            // {
10                 //首先创建一个excel对象
11                 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
12                 excel.Application.Workbooks.Add(true);//给Excel对象添加一个Workbooks
13                 //生成excel的列头名称   column为列
14                 //row为行
15                 for (int i = 0; i < dgvManager.ColumnCount; i++)
16                 {
17                     excel.Cells[1, i + 1] = dgvManager.Columns[i].HeaderText.ToString();
18                 }
19                 //遍历所有行
20                 for (int i = 0; i < dgvManager.RowCount - 1; i++)
21                 {
22                     //遍历所有列 , 从而实现所有单元格的遍历
23                     for (int j = 0; j < dgvManager.ColumnCount; j++)
24                     {
25                         // ps:其中,DataGridView[j,i]表示单元格时,先写列坐标后写行坐标。
26                         excel.Cells[i + 2, j + 1] = dgv[j, i].Value.ToString();
27                     }
28                 }
29                 //excel的一些操作,目的不明
30                 excel.DisplayAlerts = false;
31                 excel.AlertBeforeOverwriting = false;
32                 excel.SaveWorkspace("excel.xls");
33                 MessageBox.Show("导入数据成功");
34                 excel.Quit();
35                 excel = null;
36            // }
37            // catch (Exception e)
38             //{
39            //     MessageBox.Show(e.Message);
40            // }
41         }

红色语句报错了,求高手解答

夜来沉醉卸妆迟的主页 夜来沉醉卸妆迟 | 初学一级 | 园豆:184
提问于:2015-08-14 11:14
< >
分享
最佳答案
0

数据太多了吧,这种方法导excel文件大了就会内存不足了,而且对计算机环境要求很多。

收获园豆:10
包子wxl | 初学一级 |园豆:186 | 2015-08-14 11:34

是电脑的问题程序本身没问题的?可是我觉得不可能内存不足到打不开一个excel吧。。。

夜来沉醉卸妆迟 | 园豆:184 (初学一级) | 2015-08-14 15:18

@夜来沉醉卸妆迟: 建议你导excel不要使用这种方法,这种方法要打开excel的进程,很可能你的程序运行到一半出错,然后excel进程没关闭,你还要去任务管理器去关掉进程才可以,而且如果多个人导也不行,因为一个服务器也打开不了多少个excel进程,建议用NPOI或Epplus操作excel

可以参考这个 http://blog.csdn.net/accountwcx/article/details/8144970

包子wxl | 园豆:186 (初学一级) | 2015-08-14 15:46

@.net包子: 谢谢,我下载了NPOI,它是一个zip包,要怎么用啊?

夜来沉醉卸妆迟 | 园豆:184 (初学一级) | 2015-08-14 16:07

@夜来沉醉卸妆迟: 解压,只要那个NPOI.dll,然后把它拉到你的程序建个文件夹放着吧,然后在你的解决方案添加引用,然后找到你拉进来的这个NPOI.dll就可以了

包子wxl | 园豆:186 (初学一级) | 2015-08-14 16:14
其他回答(3)
0
Launcher | 园豆:45045 (高人七级) | 2015-08-14 11:17
0

遇到这种问题,一般都推荐你换第三方组件实现,折腾这个com组件,有点吃力还不讨好。

收获园豆:10
幻天芒 | 园豆:37175 (高人七级) | 2015-08-14 12:38

具体怎么实现能说下吗?

支持(0) 反对(0) 夜来沉醉卸妆迟 | 园豆:184 (初学一级) | 2015-08-14 15:18

@夜来沉醉卸妆迟: 比如选择NPOI或者是EPPlus来实现导出。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-08-14 22:45
0

不是红色语句报错,我将你的数据源改成如下

//row为行
            for (int i = 0; i < 10; i++)
            {
                excel.Cells[1, i + 1] = "col" + i;
            }
            //遍历所有行
            for (int i = 0; i < 10 - 1; i++)
            {
                //遍历所有列 , 从而实现所有单元格的遍历
                for (int j = 0; j < 10; j++)
                {
                    // ps:其中,DataGridView[j,i]表示单元格时,先写列坐标后写行坐标。
                    excel.Cells[i + 2, j + 1] = i + "," + j;
                }
            }

 

程序并没有报错。

火悬崖 | 园豆:434 (菜鸟二级) | 2015-08-14 15:03

 有图为证

支持(0) 反对(0) 夜来沉醉卸妆迟 | 园豆:184 (初学一级) | 2015-08-14 15:17

@夜来沉醉卸妆迟: 额,你看看下面的代码是不是你的(数据源改了),你可以粘过去跑一下。

public void ExportExcel()
        {

            //首先创建一个excel对象
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            //excel.Visible = false;
            excel.Application.Workbooks.Add(true);//给Excel对象添加一个Workbooks
            //生成excel的列头名称   column为列
            //row为行
            for (int i = 0; i < 10; i++)
            {
                excel.Cells[1, i + 1] = "col" + i;
            }
            //遍历所有行
            for (int i = 0; i < 10 - 1; i++)
            {
                //遍历所有列 , 从而实现所有单元格的遍历
                for (int j = 0; j < 10; j++)
                {
                    // ps:其中,DataGridView[j,i]表示单元格时,先写列坐标后写行坐标。
                    excel.Cells[i + 2, j + 1] = i + "," + j;
                }
            }
            //excel的一些操作,目的不明
            excel.DisplayAlerts = false;
            excel.AlertBeforeOverwriting = false;
            excel.SaveWorkspace("excel.xls");
            MessageBox.Show("导入数据成功");
            excel.Quit();
            excel = null;
        }
支持(0) 反对(0) 火悬崖 | 园豆:434 (菜鸟二级) | 2015-08-14 15:20

@火悬崖: 还是一样的,我出错的代码在上边,根本没运行到下边的for,你改了下边能有什么用啊。。。

 而且就算有用了,那也不是我要导出去的数据啊。

我估计是电脑问题、、、

支持(0) 反对(0) 夜来沉醉卸妆迟 | 园豆:184 (初学一级) | 2015-08-14 15:28

@夜来沉醉卸妆迟:。。。重启下电脑

支持(0) 反对(0) 火悬崖 | 园豆:434 (菜鸟二级) | 2015-08-14 15:31

@火悬崖: 我试试吧。。这电脑我服了,我新建个mvc4的web项目 创建了半小时了还在转。。。创建一个mvc4的web项目需要这么长时间准备吗。。。

支持(0) 反对(0) 夜来沉醉卸妆迟 | 园豆:184 (初学一级) | 2015-08-14 15:40

@夜来沉醉卸妆迟: 额,不需要这么长时间,一分钟之内就能搞定

支持(0) 反对(0) 火悬崖 | 园豆:434 (菜鸟二级) | 2015-08-14 15:42

@火悬崖: 好吧。。。我不知道为什么

支持(0) 反对(0) 夜来沉醉卸妆迟 | 园豆:184 (初学一级) | 2015-08-14 16:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册