DataGridView导出到Excel

本文介绍了解决在VS2005中使用Office2003进行Excel导出时遇到的问题,包括如何正确安装.NET可编程性支持以及提供了一段高效导出DataGridView到Excel的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
用的是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的应用来说,估计大家需要考虑的就是性能问题,如果一个导出操作要用户等几分钟甚至十几分钟的话,是很难让很多人接受的。具体的解释我也不做了,就把代码贴在这里好了。
  1. public void DataGridView2Excel(System.Windows.Forms.DataGridView datagridview,string SheetName)   
  2.   
  3. {   
  4.   
  5.     int iRows = 0;   
  6.   
  7.     int iCols = 0;   
  8.   
  9.     int iTrueCols = 0;   
  10.   
  11.   
  12.   
  13.     Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();   
  14.   
  15.     Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(System.Reflection.Missing.Value);   
  16.   
  17.     Microsoft.Office.Interop.Excel.Worksheet ws = null;   
  18.   
  19.     if (wb.Worksheets.Count > 0)   
  20.   
  21.     {   
  22.   
  23.         ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);   
  24.   
  25.     }   
  26.   
  27.     else  
  28.   
  29.     {   
  30.   
  31.         wb.Worksheets.Add(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);   
  32.   
  33.         ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);   
  34.   
  35.     }   
  36.   
  37.   
  38.   
  39.     if (ws != null)   
  40.   
  41.     {   
  42.   
  43.         if (SheetName.Trim() != "")   
  44.   
  45.         {   
  46.   
  47.             ws.Name = SheetName;   
  48.   
  49.         }   
  50.   
  51.   
  52.   
  53.         iRows = datagridview.Rows.Count;      //加上列头行   
  54.   
  55.         iTrueCols = datagridview.Columns.Count;   //包含隐藏的列,一共有多少列   
  56.   
  57.   
  58.   
  59.         //求列数,省略Visible = false的列   
  60.   
  61.         for (int i = 0; i < datagridview.Columns.Count; i++)   
  62.   
  63.         {   
  64.   
  65.             if (datagridview.Columns[i].Visible) iCols++;   
  66.   
  67.         }   
  68.   
  69.   
  70.   
  71.         string[,] dimArray = new string[iRows + 1, iCols];   
  72.   
  73.   
  74.   
  75.         for (int j = 0, k = 0; j < iTrueCols; j++)   
  76.   
  77.         {   
  78.   
  79.             //省略Visible = false的列   
  80.   
  81.             if (datagridview.Columns[j].Visible)   
  82.   
  83.             {   
  84.   
  85.                 dimArray[0, k] = datagridview.Columns[j].HeaderText;   
  86.   
  87.                 k++;   
  88.   
  89.             }   
  90.   
  91.         }   
  92.   
  93.   
  94.   
  95.         for (int i = 0; i < iRows; i++)   
  96.   
  97.         {   
  98.   
  99.             for (int j = 0, k = 0; j < iTrueCols; j++)   
  100.   
  101.             {   
  102.   
  103.                 //省略Visible = false的列   
  104.   
  105.                 if (datagridview.Columns[j].Visible)   
  106.   
  107.                 {   
  108.   
  109.                     dimArray[i + 1, k] = datagridview.Rows[i].Cells[j].Value.ToString();   
  110.   
  111.                     k++;   
  112.   
  113.                 }   
  114.   
  115.             }   
  116.   
  117.         }   
  118.   
  119.   
  120.   
  121.         ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Value2 = dimArray;   
  122.   
  123.         ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Font.Bold = true;   
  124.   
  125.         ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Font.Size = 10.0;   
  126.   
  127.         ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).RowHeight = 14.25;   
  128.   
  129.         //ws.Columns[.ColumnWidth = datagridview.Columns[0].Width;   
  130.   
  131.         for (int j = 0, k = 0; j < iTrueCols; j++)   
  132.   
  133.         {   
  134.   
  135.             //省略Visible = false的列   
  136.   
  137.             if (datagridview.Columns[j].Visible)   
  138.   
  139.             {   
  140.   
  141.                 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);   
  142.   
  143.                 //ws.Columns.c = datagridview.Columns[j].Width;   
  144.   
  145.                 k++;   
  146.   
  147.             }   
  148.   
  149.         }   
  150.   
  151.     }   
  152.   
  153.     app.Visible = true;   
  154.   
  155. }  
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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值