首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#获取excel的sheet名称时遇到的诡异有关问题

2012-10-31 
C#获取excel的sheet名称时遇到的诡异问题工作需要做一个自动读取excel文件的小东东,由于excel文件是程序自

C#获取excel的sheet名称时遇到的诡异问题
工作需要做一个自动读取excel文件的小东东,由于excel文件是程序自动批量生成的,所以sheetname相对比较有规律,我在用c#读取sheetname时发现一个让我头疼的问题:
将程序自动生成的xls文件不做任何修改,利用我写的程序打开,在读取sheetname时会提示“在位置0处没有任何行”,我知道这是读取sheet名称出错了;
我将xls表格打开,修改下sheet名,再利用程序打开,就可以顺利读取sheet名并后续工作;
最让我气愤的是,哪怕我就在sheet名上双击下,不做任何修改,保存退出后,我的程序就可以顺利工作,但是如果不碰sheet名称就死活读不出来。。。

我自己分析的原因,可能是因为xls是程序自动生成的,在sheet的名称那个字符串上有些什么奇怪的转义字符之类,这些字符我们看不见,当我双击或者对sheet名进行了修改之后,它就失效,我也就可以利用我的程序来读取了,但是这样的话等于我的自动读取xls程序一点意义都没有了。不知道各位有什么高招。

附我的读sheet名称的代码。

C# code
string strcon = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filepicks[k].Text + ";" + "Extended Properties=Excel 8.0;";    OleDbConnection con1 = new OleDbConnection(strcon);    con1.Open();    DataTable sheetable = con1.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "Table" });                                        string sheetname = sheetable.Rows[0]["Table_Name"].ToString();//在这一行报错    MessageBox.Show(sheetname);    string select_sql = "select * from[" + sheetname + "];";    OleDbDataAdapter adp1 = new OleDbDataAdapter(select_sql, con1);


[解决办法]
我记得tablename好象在第4列,也可以用int索引进行定位,建议将
DataTable sheetable = con1.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "Table" });
中的sheetable绑到datagridview中看看就知道了。
[解决办法]
那你生成Excel的时候不指定Sheet的名称,让它默认生成,看看能不能读取。我还没有遇到过这样的情况!
[解决办法]
C# code
 
??????? public static string GetExcelFirstTableName(string excelFileName)
??????? {
??????????? string tableName = null;
??????????? if (File.Exists(excelFileName))
??????????? {
????????????? using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet."+
??????????????? "OLEDB.4.0;Extended Properties=\"Excel 8.0\";Data Source=" + excelFileName))
????????????? {
????????????????? conn.Open();
????????????????? DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
????????????????? tableName = dt.Rows[0][2].ToString().Trim();
????????????? }
????????? }
??????????? return tableName;
??????? }




热点排行