多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 获取 sheet 名字 可看“项目管理台账.sln”的“登录窗口”,或者看“连接测试”,代码在里面的“sheet 表名”窗口。 SqlClient.SqlConnection没有相关的功能,所以要用 OleDbConnection。 [https://www.cnblogs.com/coolsundy/p/4056813.html](https://www.cnblogs.com/coolsundy/p/4056813.html) [https://www.cnblogs.com/CharlesGrant/p/3650864.html](https://www.cnblogs.com/CharlesGrant/p/3650864.html) 可以理解为:两个都是 c#中用于获取外部数据的类,但 sql 是获取 sqlserver 数据库使用,而 OleDb 可以认为是获取与 Microsoft 有关的比如 excel、access 数据库时候用的。 与 sql 一样,ole 也要写查询语句。sql 查询语句比如是“select \* from dbo.总工办数据库”,那么 ole 语句可能是“select \* from [sheet1$]”。这里跟的是表名。 ## 做法 1 如果要求大家在导入数据的时候直接把 excel 表格另存,然后 sheet 名就直接叫 sheet1 的话,那上面的语句没问题。 但有时候大家的表往往不一定是sheet1名字,所以可以用 oleConnection 来判断,获取 sheet 的名字。 ## 做法 2 用以下“做法 2 具体”中提到的办法获取 sheet 各个表的名字。sheet的名字其实是按“正序”排列的,然后默认读取第一行的表。 1. 当sheet命名成“你好” 以及“玉米” 的时候,第一行显示的表名 是“你好”; ![](https://img.kancloud.cn/e1/8b/e18b8f33cd20e8912d2ce983862057f0_421x193.png) 2. 当sheet命名成“1玉米” 以及“2你好”的时候,顺序就不一样了。 ![](https://img.kancloud.cn/61/c9/61c980f989f4d99ecfe5e99040ad54eb_486x258.png) ## 做法 3 获取当前 active 的表格(未完成) ## 做法 2具体:在不考虑 sheet 被重命名的情况下 ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g7fd5ptvwcj31q10u044p.jpg) > 基本逻辑: > 1. 把 excel 当成一个数据库,那么每个 sheet 就是一个表; > 2. 用 OleDbConnection.GetOleSchema()方法来获取每个 sheet 的属性;括号中,第一个元素要用 OleDbSchemaGuide来实现; > - 此时创建的是OleDbConnection对象 oleconn; > 3. 获取的属性实际上是一个数组,则用 DataTable (比如命名为 dt)来存放; > 关键的代码只有这一句: `DataTable dt = oleconn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null) ` > 4. 遍历 dt,一般获取第一行第一列的值,这个值就是我们要找的 sheet 名了;(此部分本次未写,知道了 dt 结构以后,就可以方便写出来。)datagridview控件用的 是datagridview1.Rows[0].Cells[2]或者Cells["密码"] > ![](https://img.kancloud.cn/e4/e6/e4e69fcabf97a8df9fce1ac8ba032747_813x232.png) > [https://www.kancloud.cn/amy326/c/798326](https://www.kancloud.cn/amy326/c/798326) > 5. 返回这个值。 完整代码如下: ``` public class pb\_公共类 { //主要目的是为了获得表名,但由于ole的连接字符比较复杂,所以单独出来写 //1获取ole连接字符connString public String GetExcelConn() { string connString = ""; OpenFileDialog ofd = new OpenFileDialog(); ofd.ShowDialog(); ofd.Filter = "Excel(\*.xls)|\*.xls|Excel(\*.xlsx)|\*.xlsx"; var path = ofd.FileName; string filesuffix = Path.GetExtension(path); if(string.IsNullOrEmpty(filesuffix)) { return null ; } else if(filesuffix == ".xls") { return connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + path + ";" + ";Extended Properties=\\"Excel 8.0;HDR=YES;IMEX=1\\""; } else { return connString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + path + ";" + ";Extended Properties=\\"Excel 12.0;HDR=YES;IMEX=1\\""; } } public DataTable GetTableName() { string connString = GetExcelConn(); // 直接用上面第一步获得的返回值来用,变量名也可以是其他的abc之类的,无所谓 OleDbConnection oleconn = new OleDbConnection(connString); oleconn.Open(); DataTable dt = oleconn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);//只要这一句就可以了! oleconn.Close(); return dt; } ``` ![](https://img.kancloud.cn/6c/26/6c26215d663c5d1c50c843b9124ddbcf_1128x446.png) ![](https://img.kancloud.cn/a8/b1/a8b18d7f3e98ade7887d88160dcb9eb1_798x269.png) 最后在用一个dataGridView控件显示即可。 ![](https://img.kancloud.cn/5a/7e/5a7ecc8832d103d564680bd4523d0e8f_654x443.png) # 但 excel 里面 sheet 的名字,跟它的编号其实不是同一个 就像 textbox 有“name”和“text”两个属性一样。一个是这个东西本身系统生成时候的名字,一个是我们让它显示在前端时候我们给它命名的名字 比如:打开 excel VBA。用户已经给 sheet随意命名了。但在 vba 里面可以看到,即使用户命名的叫“sheet2”,但 excel 中系统标注的这个表的代号仍然实际是 sheet1。 > **所以在c#中使用的时候要注意,不要因此引起运行结果的错乱。** ![](https://img.kancloud.cn/d4/ca/d4cad9e52b8e9221b6f6b5521bf1c8f9_559x469.png) # 表名显示错误 https://blog.csdn.net/hbxtlhx/article/details/8511731 如下图:明明excel里面只有一个表,但是用工具弄出来以后变成有好几个表。还有一个隐藏的“'2019年贵州项目A4费用表'$_FilterDatabase”。 ![](https://img.kancloud.cn/82/8a/828a801342704360d9a7b986e79174ed_804x197.png) ![](https://img.kancloud.cn/dc/96/dc963fad1fa33ed9a5c97e897d08da95_274x82.png) ## 打开Excel - 公式 - 名称管理器 并未看到任何记录。所以有可能这个表格被隐藏了。 ![](https://img.kancloud.cn/4a/5a/4a5ad4c6bb17bdbd9d30245e1c9b2e24_543x162.png) VBA中新建模块输入以下代码,并运行 ``` Sub ShowAllNames() For Each n In ThisWorkbook.Names n.Visible = True Next End Sub ``` 再打开公式-名称管理器,则可以看到隐藏的这个表格。 如果没必要,可以删除。 ![](https://img.kancloud.cn/c1/b1/c1b1036b3ed462f62ba8f92828e81bcc_538x438.png) 删除完再运行,就都正常了。 ![](https://img.kancloud.cn/62/3b/623b3d212566a339d0d02d35a8ff0d1f_789x181.png)