我有一个将Gridview1数据导出到Excel的按钮,但是当我尝试下面的代码(我在C#中使用)时,它给了我编译错误。你能帮助我吗..

错误1:无法将[]索引应用于类型'System.Web.UI.WebControls.GridView'的表达式

错误2:名称“ MessageBox”在当前上下文中不存在

try
        {
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            excel.Visible = true;
            Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value);
            Microsoft.Office.Interop.Excel.Worksheet sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1];
            int StartCol = 1;
            int StartRow = 1;
            int j = 0, i = 0;

            //Write Headers
            for (j = 0; j < GridView1.Columns.Count; j++)
            {
                Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[StartRow, StartCol + j];
                myRange.Value2 = GridView1.Columns[j].HeaderText;
            }

            StartRow++;

            //Write datagridview content
            for (i = 0; i < GridView1.Rows.Count; i++)
            {
                for (j = 0; j < GridView1.Columns.Count; j++)
                {
                    try
                    {
                        Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[StartRow + i, StartCol + j];
                        myRange.Value2 = GridView1[j, i].Value == null ? "" : GridView1[j, i].Value;
                    }
                    catch
                    {
                        ;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

最佳答案

首先,全面披露:我不是asp.net WebForms的专家,所以我仅以语法为基础(不检查您的实际框架用法是否正确)阅读本文。

错误1

在我看来,错误发生在这里:

myRange.Value2 = GridView1[j, i].Value == null ? "" : GridView1[j, i].Value;


似乎您正在尝试在使用变量GridView1i的循环内使用数组符号引用j。但是,请看一下您的循环:

for (i = 0; i < GridView1.Rows.Count; i++)

for (j = 0; j < GridView1.Columns.Count; j++)


您的循环通过集合(分别是GridView1.Rows)访问.Columns。因此,我的假设是您可能需要类似以下内容:

myRange.Value2 = GridView1.Rows[i].Columns[j].Value == null ? "" : GridView1.Rows[i].Columns[j].Value;


请记住,这只是基于先前代码(GridView1.Columns[j].HeaderText)的语法猜测。

错误2

这里的问题是您正在使用的名称(静态类或变量)MessageBox在此刻似乎不存在。所以我会问:


范围是变量吗?即,它是在try块中早先声明的,但现在已经超出了catch的范围吗?
如果它是静态类,则是否正确引用了该程序集? Intellisense应该在Visual Studio中为您提供帮助,并提供重构选项以将引用包含为上面的using语句,或者完全限定您的名称。


内存MessageBoxWPF程序集中某个与Windows窗体有关的静态类,而不是作为ASP.NET的一部分-它用于在桌面程序中显示窗口。如果您希望在浏览器中显示一条消息,那将是一个JavaScript语句,例如:

alert("Your exception message here");


但是,您将需要一些方法来捕获该异常(ex),从中获取文本(ex.ToString())并将其传输到要通过javascript显示的页面中。

最后考虑:如果要显示该错误,并且是由于在页面上单击了按钮而导致的,则您可能打算将Export to Excel函数作为对服务器的AJAX调用来调用。如果是这种情况,请尝试将HTTP错误代码(例如500或类似的东西)返回给浏览器,并使用.fail()活页夹显示适当的客户端错误。只是一个建议:)

关于c# - 如何从Gridview导出到Excel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37874693/

10-09 04:09