C#操作Excel,将DataGridView数据导出到Excel中

时间:2022-08-30 22:58:00
C#操作Excel,将DataGridView数据导出到Excel中

转自:http://www.cnblogs.com/gzlwp775/archive/2006/11/08/554621.html

这几天忙着帮一位朋友写一个信息登记系统,其中需要把登记数据打印出来。之前没做过报表,又找不到好的材料。要打印的信息数目多,且Winform里做打印编辑挺麻烦。忽然想到把数据导出到Excel中,在Excel里排版打印,问题就解决了。

在VisualC#中调用Excel表格,并不像读取Excel表格中的数据那么容易了,因为在VisualC#中调用Excel表格要使用到Excel的COM组件。如果你安装Office套件在"C"盘,那么在"C:/ProgramFiles/MicrosoftOffice/Office"可以找到这个COM组件"EXCEL9.OLB",这些COM组件都是非受管代码的,要在VisualC#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的类库。所以在用VisualC#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。
  (1).非受管代码COM组件转换成受管代码的类库:
     首先把COM组件"EXCEL9.OLB"拷贝到C盘的根目录下,在命令提示符窗口(cmd.exe)里输入path%path%;C:/Program Files/Microsoft Visual Studio .NET2003/SDK/v1.1/bin。(创建新路径)。
          然后输入c:回车,再输入cd/回车,(在c盘根目录下编辑)
          最后输入下列命令:tlbimp excel9.olb
   这样在C盘的根目录下面就产生了三个DLL文件:"Excel.dll"、"Office.dll"、"VBIDE.dll"。在产生了上面的三个文件后,这种转换就成功完成了。在下面的程序中,就可以利用这转换好的三个类库编写和Excel表格相关的各种操作了。

      (2).Visual C#打开Excel表格:
         "Excel.dll"中定义了一个命名空间"Excel",在差命名空间中封装了一个类"Application",这个类和启动Excel表格有非常重要的关系,在Visual C#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:
                Excel.ApplicationClass Mylxls = new Excel.ApplicationClass();
                Mylxls.Application.Workbooks.Add(true);
                Mylxls.Visible = true ;
  但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。

  (3).往Excel表格中输入数据:
   在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个下单元。通过给差"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。
                Excel.ApplicationClass Mylxls = new Excel.ApplicationClass();
                Mylxls.Application.Workbooks.Add(true);
                Mylxls.Caption = "XX市接收安置复员退伍军人登记表";
                Mylxls.Cells[1, 1] = "XX市200  年接收安置复员退伍军人登记表";
                Mylxls.Cells[2, 1] = "XX市人民*接待安置复员退伍军人办公室";

      (4). Visual C#调用Excel表格,
  了解了上面的这些知识,得到完成上述功能的程序代码就显得比较容易了,函数具体如下:

private void myExcel()
        {
            try
            {
                Excel.ApplicationClass Mylxls = new Excel.ApplicationClass();
                Mylxls.Application.Workbooks.Add(true);
                Mylxls.Caption = "XX市接收安置复员退伍军人登记表";
                Mylxls.Cells[1, 1] = "XX市200  年接收安置复员退伍军人登记表";
                Mylxls.Cells[2, 1] = "XX市人民*接待安置复员退伍军人办公室";
                Mylxls.Cells[3, 1] = "入伍所在地";
                Mylxls.Cells[3, 2] = "籍贯";
                Mylxls.Cells[3, 3] = "退伍所在";
                Mylxls.Cells[3, 11] = "退伍前";
                Mylxls.Cells[3, 21] = "工作安排情况";
                Mylxls.Cells[4, 1] = "省、市、镇(街)";
                Mylxls.Cells[4, 2] = "省、市(县)";
                Mylxls.Cells[4, 3] = "镇、街";
                Mylxls.Cells[4, 4] = "村、居委";
                Mylxls.Cells[4, 5] = "姓名";
                Mylxls.Cells[4, 6] = "性别";
                Mylxls.Cells[4, 7] = "出生年月";
                Mylxls.Cells[4, 8] = "文化程度";
                Mylxls.Cells[4, 9] = "政治面貌";
                Mylxls.Cells[4, 10] = "入伍时间";
                Mylxls.Cells[4, 11] = "部队*";
                Mylxls.Cells[4, 12] = "奖励情况";
                Mylxls.Cells[4, 13] = "职务";
                Mylxls.Cells[4, 14] = "有何技术";
                Mylxls.Cells[4, 15] = "复退证编号(含残疾)";
                Mylxls.Cells[4, 16] = "身高(cm)";
                Mylxls.Cells[4, 17] = "联系电话";
                Mylxls.Cells[4, 18] = "安置证编号";
                Mylxls.Cells[4, 19] = "档案编号";
                Mylxls.Cells[4, 20] = "退伍类别";
                Mylxls.Cells[4, 21] = "单位名称";
                Mylxls.Cells[4, 22] = "时间";
                Mylxls.Cells[4, 23] = "档案转换";
                Mylxls.Cells[4, 24] = "备注";
           //合并单元格
                Mylxls.get_Range(Mylxls.Cells[1, 1], Mylxls.Cells[1, 24]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[2, 1], Mylxls.Cells[2, 24]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 3], Mylxls.Cells[3, 4]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 5], Mylxls.Cells[4, 5]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 6], Mylxls.Cells[4, 6]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 7], Mylxls.Cells[4, 7]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 8], Mylxls.Cells[4, 8]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 9], Mylxls.Cells[4, 9]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 10], Mylxls.Cells[4, 10]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 15], Mylxls.Cells[4, 15]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 16], Mylxls.Cells[4, 16]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 17], Mylxls.Cells[4, 17]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 18], Mylxls.Cells[4, 18]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 19], Mylxls.Cells[4, 19]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 20], Mylxls.Cells[4, 20]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 24], Mylxls.Cells[4, 24]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 11], Mylxls.Cells[3, 14]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 21], Mylxls.Cells[3, 23]).MergeCells = true;

                //逐行写入数据,数组中前4行我列标题
                int rowIndex = 5;//在EXCEL第5行开始写入数据
                int row_cnt = this.dataViewAll.Rows.Count;
                int col_cnt = this.dataViewAll.Columns.Count;
                //这里要注意,由于DataGrid中总是要多显示一行,而最后一行中没有数据,所以在读取的时候不要读最后一行
                for (int row = 0; row < row_cnt - 1; row++)
                {
                    for (int col = 0; col < col_cnt; col++)
                    {
                        try
                        {
                            Mylxls.Cells[rowIndex, col + 1] = dataViewAll.Rows[row].Cells[col].Value.ToString();
                            //Mylxls.Cells[rowIndex, col + 1] = drugListDataGridView.Rows[row].Cells[col].Value.ToString();
                        }
                        catch
                        {
                            MessageBox.Show("数据导出出现异常!请重试");
                            return;
                        }
                    }
                    rowIndex++;
                }
                Mylxls.Visible = true;
                AddMessage("登记信息数据导出成功!");
            }               
            catch //(Exception e)
            {
                AddMessage("登记信息数据导出失败!");
            }
        }