zoukankan      html  css  js  c++  java
  • WinForm开发中,将Excel文件导入到DataGridView中时,获取Excel中所有表格的名称。

    在一次将Excel文件导入到DataGridView中时发现以前的代码都是讲excel中的表名写死了的,都是Sheet1$,要是想导入第二个的话,那就是Sheet2$了,写死了的话,就没有办法将Excel中的第二个表格导入了。于是就做了一个下拉列表,在里面写了N多个Sheet1$、Sheet2$、Sheet3$......SheetN$,当时自以为把问题完美的解决了,但是后来发现原来Excel文件中的表格也是可以自己命名的,谁规定非得叫Sheet1$之类的了?我完全可以叫他xiaoqiang啊,于是问题出来了,之前的办法还是没有从根本上解决这个问题。后来就想,应该先把导入的Excel文件中的所有表格的名字都取到,然后绑定到一个下拉列表中,在让用户自己去选择要导入那个表里面的数据,这样一来的话,问题不就解决了吗?于是上网找资料,还真被我找到了。下面把代码贴出来:

    这个方法是用来获取导入的那个Excel文件中的所有的表的名称的,他返回的是一张表,这张表中存储的关于这个Excel中的所有表的相关信息,狠丰富的,里面有一个字段叫做Table_Name,这个字段存储的就是Excel中所有表的名称,我们返回这个表格以后,就可以用一个循环来获取这个Table_Name字段中的数据了不是?这个方法的参数是要导入的那个Excel文件的路径,当我们用OpenFileDialog控件打开Excel文件的时候,用它的对象的FileName属性就能获取路径了,这个做开发的地球人都知道吧?
            /// <summary>
            /// 获取Excel中表的名称
            /// </summary>
            /// <param name="p_ExcelFile">Excel的路径</param>
            /// <returns></returns>
            public static DataTable GetExcelTableName(string p_ExcelFile)
            {
                try
                {
                    if (System.IO.File.Exists(p_ExcelFile))
                    {
                        OleDbConnection _ExcelConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0\";Data Source=" + p_ExcelFile);
                        _ExcelConn.Open();
                        DataTable _Table = _ExcelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        _ExcelConn.Close();
                        return _Table;
                    }
                    return null;
                }
                catch
                {
                    return null;
                }
            }

    当把上面的方法写在类中以后,就是去调用它了,我们在OpenFileDialog 控件的打开事件中去调用上面的这个方法就可以了。

                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Excel文件 (*.xls)|*.xls";
                openFileDialog.FilterIndex = 0;
                openFileDialog.RestoreDirectory = true;
                //openFileDialog..CreatePrompt = true;
                openFileDialog.Title = "请选择要导入的Excel文件";
                //openFileDialog.ShowDialog();
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    //获取Excel中各表的名称,并绑定到下拉列表中
                    fileName = openFileDialog.FileName;
                    DataTable _Table = GetExcelTableName(fileName);
                    string tableName = _Table.Rows[0]["Table_Name"].ToString();

                    //在绑定前先将下拉列表清空 cboExcelName是下拉列表的名称,即:comBobox控件
                    cboExcelName.Items.Clear();

                    //然后我们用一个循环将上面那个方法中返回来的table中的Table_Name这个字段的数据读取出来,绑定到控件上。
                    for (int i = 0; i != _Table.Rows.Count; i++)
                    {
                        cboExcelName.Items.Add((_Table.Rows[i]["Table_Name"].ToString()));
                    }
                    cboExcelName.SelectedIndex = 0;
                    btnInput.Enabled = true;
                 }

    嗯,做到这里就OK了,这样就顺利的把Excel中的表名都获取到了,也绑定到了comBobox控件中了,只要用户选择一下要导入哪个表的数据,那就可以直接导入相应的表中的数据了。

  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/blackbean/p/1904122.html
Copyright © 2011-2022 走看看