您的位置:首页 > 其它

DataGridView导出到Excel

2008-10-06 11:26 260 查看
用的是VS2005和Office2003。

首先是添加了Microsoft Excel11 Object Libray之后,发现引用里面的” Microsoft.Office.Interop.Excel”不能用。出现了一个可恶的***小感叹号。这可真愁坏我了。后来在网上查找原因,看到关于C#导出Excel的例子是很多,但是都没有涉及到这是什么问题,可能是他们没有遇到,所以没有说。
不过有人说了使用Tlpimp.exe和Excel.olb来生成Excel.dll,然后引用就可以了。可是office2003中根本就找不到Excel.olb这东西。
后来终于看到了一篇上面说是安装office2003的时候要选择“.Net可编程性支持”。后来把office2003修改了下,重新选择安装了“.Net可编程性支持”。重新在工程中引用之后,呵呵,终于没有再出现这可恶而漂亮的***小感叹号。
我在查找这个问题的过程中,发现众多的兄弟都曾经遇到这样的问题,估计后面也会有千千万万的兄弟还可能会遇到这样的问题,为了能够增加点Google和Baidu的命中率,让更多的兄弟少走点弯路,所以把这个东西记录下来。也便于我自己后续的参考。
1、 安装office2003的时候,请选择“选择应用程序的高级自定义”如下图:



2、请选择“.Net可编程性支持”下选择菜单的“从本机运行全部程序”,如下图片。



3、成功引用了Excel之后,怎么使用?对于将DataGridView导出成Excel的应用来说,估计大家需要考虑的就是性能问题,如果一个导出操作要用户等几分钟甚至十几分钟的话,是很难让很多人接受的。具体的解释我也不做了,就把代码贴在这里好了。

view plaincopy to clipboardprint?

public void DataGridView2Excel(System.Windows.Forms.DataGridView datagridview,string SheetName)



{



int iRows = 0;



int iCols = 0;



int iTrueCols = 0;







Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();



Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(System.Reflection.Missing.Value);



Microsoft.Office.Interop.Excel.Worksheet ws = null;



if (wb.Worksheets.Count > 0)



{



ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);



}



else



{



wb.Worksheets.Add(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);



ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);



}







if (ws != null)



{



if (SheetName.Trim() != "")



{



ws.Name = SheetName;



}







iRows = datagridview.Rows.Count; //加上列头行



iTrueCols = datagridview.Columns.Count; //包含隐藏的列,一共有多少列







//求列数,省略Visible = false的列



for (int i = 0; i < datagridview.Columns.Count; i++)



{



if (datagridview.Columns[i].Visible) iCols++;



}







string[,] dimArray = new string[iRows + 1, iCols];







for (int j = 0, k = 0; j < iTrueCols; j++)



{



//省略Visible = false的列



if (datagridview.Columns[j].Visible)



{



dimArray[0, k] = datagridview.Columns[j].HeaderText;



k++;



}



}







for (int i = 0; i < iRows; i++)



{



for (int j = 0, k = 0; j < iTrueCols; j++)



{



//省略Visible = false的列



if (datagridview.Columns[j].Visible)



{



dimArray[i + 1, k] = datagridview.Rows[i].Cells[j].Value.ToString();



k++;



}



}



}







ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Value2 = dimArray;



ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Font.Bold = true;



ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Font.Size = 10.0;



ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).RowHeight = 14.25;



//ws.Columns[.ColumnWidth = datagridview.Columns[0].Width;



for (int j = 0, k = 0; j < iTrueCols; j++)



{



//省略Visible = false的列



if (datagridview.Columns[j].Visible)



{



ws.get_Range(ws.Cells[1, k + 1], ws.Cells[1, k + 1]).ColumnWidth = (datagridview.Columns[j].Width / 8.4) > 255 ? 255 : (datagridview.Columns[j].Width / 8.4);



//ws.Columns.c = datagridview.Columns[j].Width;



k++;



}



}



}



app.Visible = true;



}
public void DataGridView2Excel(System.Windows.Forms.DataGridView datagridview,string SheetName)

{

    int iRows = 0;

    int iCols = 0;

    int iTrueCols = 0;

    Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();

    Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(System.Reflection.Missing.Value);

    Microsoft.Office.Interop.Excel.Worksheet ws = null;

    if (wb.Worksheets.Count > 0)

    {

        ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);

    }

    else

    {

        wb.Worksheets.Add(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);

        ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);

    }

    if (ws != null)

    {

        if (SheetName.Trim() != "")

        {

            ws.Name = SheetName;

        }

        iRows = datagridview.Rows.Count;      //加上列头行

        iTrueCols = datagridview.Columns.Count;   //包含隐藏的列,一共有多少列

        //求列数,省略Visible = false的列

        for (int i = 0; i < datagridview.Columns.Count; i++)

        {

            if (datagridview.Columns[i].Visible) iCols++;

        }

        string[,] dimArray = new string[iRows + 1, iCols];

        for (int j = 0, k = 0; j < iTrueCols; j++)

        {

            //省略Visible = false的列

            if (datagridview.Columns[j].Visible)

            {

                dimArray[0, k] = datagridview.Columns[j].HeaderText;

                k++;

            }

        }

        for (int i = 0; i < iRows; i++)

        {

            for (int j = 0, k = 0; j < iTrueCols; j++)

            {

                //省略Visible = false的列

                if (datagridview.Columns[j].Visible)

                {

                    dimArray[i + 1, k] = datagridview.Rows[i].Cells[j].Value.ToString();

                    k++;

                }

            }

        }

        ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Value2 = dimArray;

        ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Font.Bold = true;

        ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Font.Size = 10.0;

        ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).RowHeight = 14.25;

        //ws.Columns[.ColumnWidth = datagridview.Columns[0].Width;

        for (int j = 0, k = 0; j < iTrueCols; j++)

        {

            //省略Visible = false的列

            if (datagridview.Columns[j].Visible)

            {

                ws.get_Range(ws.Cells[1, k + 1], ws.Cells[1, k + 1]).ColumnWidth = (datagridview.Columns[j].Width / 8.4) > 255 ? 255 : (datagridview.Columns[j].Width / 8.4);

                //ws.Columns.c = datagridview.Columns[j].Width;

                k++;

            }

        }

    }

    app.Visible = true;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: