2014-09-02 50 views
0

你也许我重定向到这一个环节,但我会是第一个告诉你们:我用这个了很多次,我真不这次不知道什么问题。asp.net - 阅读Excel工作表的名称不返回数据表

我的情况是:我需要将Excel数据导入到数据库中。听起来很简单,对吧?现在,首先我需要知道表单名称。这就是我的问题开始的地方。我再说一遍,我已经使用了多次,我不知道我做错了什么这一次:

的“它”,我指的是这段代码:

public string[] GetSheetNames(string excelPath) { 

      try 
      { 

      string[] ar = null; 

      if (Path.GetExtension(excelPath) == ".xls") 
      { 
       conString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelPath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\""); 
      } 

      else if (Path.GetExtension(excelPath) == ".xlsx") 
      { 
       conString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelPath + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"); 
      } 

       using (oleConn = new OleDbConnection(conString)) 
       { 
        oleConn.Open(); 

        if (oleConn.State == ConnectionState.Open) 
        { 

         //DataTable dt = oleConn.GetSchema("Tables"); 

         //DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] {null, null, null, "TABLE"}); 

         DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

         if (dt == null) 
         { 
          return null; 
         } 

         ar = new string[dt.Rows.Count]; 
         int t = 0; 

         foreach(DataRow dr in dt.Rows){ 

          ar[t] = dr["TABLE_NAME"].ToString(); 
          t++; 
         } 


        } 


        return ar; 
       } 

      } 
      catch (Exception) 
      { 

       throw; 
      } 
     } 

它抛出一个异常,称该数据表的行数为0。我也用DataTable dt = oleConn.GetSchema("Tables")

DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
      new Object[] {null, null, null, "TABLE"}); 

,但他们都返回相同。

可能是什么问题?它可能是Excel文件吗?但我试过其他Excel文件,都失败了。

+0

你可以发布'DataTable dt'的调试可视化器吗? – Hassan 2014-09-02 04:34:19

回答

1

试试这个代码:

OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties='Excel 12.0 xml;HDR=YES;'"); 
         connection.Open(); 
         DataTable Sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

      foreach (DataRow dr in Sheets.Rows) 
        { 
         string sht = dr[2].ToString().Replace("'", ""); 
         OleDbDataAdapter dataAdapter = new OleDbDataAdapter("select * from [" + sht + "]", connection); 
    } 
+0

兄弟,我需要获取工作表名称,而不是在特定工作表中查询。 – DustineTheGreat 2014-09-02 03:45:41

+0

好,我是编辑 – 2014-09-02 03:50:58

+0

甚至不能进入我的foreach循环,因为该行数为0 – DustineTheGreat 2014-09-02 03:51:26

-1
private DataSet GetExcelWorkSheet(string pathName, string fileName, int workSheetNumber) 
{ 
    OleDbConnection ExcelConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + @"\" + fileName + ";Extended Properties=Excel 8.0;"); 
    OleDbCommand ExcelCommand = new OleDbCommand(); 
    ExcelCommand.Connection = ExcelConnection; 
    OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand); 

    ExcelConnection.Open(); 
    DataTable ExcelSheets = ExcelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
    string SpreadSheetName = "[" + ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString() + "]"; 

    DataSet ExcelDataSet = new DataSet(); 
    ExcelCommand.CommandText = @"SELECT * FROM " + SpreadSheetName; 

    ExcelAdapter.Fill(ExcelDataSet); 

    ExcelConnection.Close(); 
    return ExcelDataSet; 
} 
+2

它有助于提供解答,而不仅仅是代码转储。 – mason 2014-09-02 04:10:30

1

我不知道你是否还需要选择,但这个只是发生在我身上,我得到了一个解决方案。

我的问题是文件本身,复制到本地文件夹时,我没加进行扩展,以便在连接打开它创建一个没有表的空文件(即没有表读)

如果你是将文件移动到本地文件夹,查看该文件并查看它是否没有损坏,并且在复制后确实需要阅读某些内容。

+0

这是此错误的可能原因之一。文件路径或文件名可能是错误的。也许这可以帮助某人。 – Julia 2017-06-02 13:04:11