# 获取 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://ihavenolimitations.xyz/amy326/c/798326](https://ihavenolimitations.xyz/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)
- 帮助文档 microsoft helo viewer
- c#开发环境及visual studio安装注意事项
- c#程序基本结构-基本语法
- Q1: public static void main(String[] args) 是什么意思
- Q2: c#命名空间+Main方法
- Q3:注释+命名规则+代码规则
- Q4: c#语句 system => console
- Q5: 数据类型 .net
- Q5: 常用名字、变量、运算符
- Q6: 对话窗输入-属性
- Q7: 递归
- Q8:决策分支、条件判断语句 if 语句
- Q9:数组
- Q10:字符串
- Q11:对象、类、访问权限、静态动态函数
- Q12:方法及参数——继承于类
- Q13:构造函数
- Q14:继承——base 关键字
- Q15:多态、虚方法、接口
- Q16:创建窗体应用、控件
- Q17:Ado数据访问、连接 sqlserver 数据库
- Q18: 读取数据command + DataRead( )、DataSet + DateAdapter
- Q19: Entity Framwork、entity 与 ADO.net的区别
- Q20: 对话框、文件、文件夹
- Q21: 导入excel数据、更新到 dbo 数据库中
- Q26: 获取 excel 中每个 sheet 的表名
- Q22: 两个窗体之间数据+方法传递
- Q23: 数学对象
- Q24: c#网站编写
- Q25: visual studio2017如何查看帮助
- Q27: c# dictionary 字典对象
- Q28: 数组与dataTable互相转化