日期:2014-05-17  浏览次数:20736 次

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;
??????? }