【问题标题】:asp.net - Reading Excel Sheet Names Not Returning Data Tablesasp.net - 读取 Excel 工作表名称不返回数据表
【发布时间】:2014-09-02 03:37:32
【问题描述】:

您可能会将我重定向到此链接的其他链接,但我会第一个告诉你们:我已经使用了很多次,但我真的不知道这次有什么问题。

我的场景是:我需要将 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;
            }
        }

它抛出一个异常,说DataTable的行数是0。我也用DataTable dt = oleConn.GetSchema("Tables")

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

但它们都返回了相同的结果。

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

【问题讨论】:

  • 你能发布DataTable dt的调试可视化工具吗?

标签: c# asp.net excel


【解决方案1】:

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

我的问题是文件本身,当复制到本地文件夹时我没有添加扩展名,所以当连接打开时它会创建一个没有工作表的空文件(即没有要读取的表格)

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

【讨论】:

  • 这是导致此错误的可能原因之一。文件路径或文件名可能有误。也许这可以帮助某人。
【解决方案2】:

试试这个代码:

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

【讨论】:

  • 兄弟,我需要获取工作表名称,而不是在特定工作表中查询。
  • 甚至无法进入我的 foreach 循环,因为行数为 0。
  • 我检查了这段代码,它的工作,检查你的 excel 加载文件
  • 它有助于为您的答案提供解释,而不仅仅是代码转储。
  • 我跟踪您的代码并检查了 .xls 和 .xlsx 文件。它工作正常。
【解决方案3】:
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;
}

【讨论】:

  • 它有助于为您的答案提供解释,而不仅仅是代码转储。
猜你喜欢
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多