【问题标题】:Error in get data from Excel从 Excel 获取数据时出错
【发布时间】:2015-11-11 17:40:15
【问题描述】:

我正在尝试使用以下方法从 Excel 文件中获取数据:

OpenFileDialog OpenCSVDialog = new OpenFileDialog();
            OpenCSVDialog.Filter = "Excel |*.xlsx";
            OpenCSVDialog.ShowDialog();
            ExcelFileName = System.IO.Path.GetFileName(OpenCSVDialog.FileName);
            string path = System.IO.Path.GetDirectoryName(OpenCSVDialog.FileName);
            fullpath = Path.Combine(path, ExcelFileName);

            dt_data = new DataSet("CSV File");
            var connString = string.Format(
                @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""",
                Path.GetDirectoryName(fullpath)
            );
            using (var conn = new OleDbConnection(connString))
            {
                conn.Open();
                var query = "SELECT * FROM [" + Path.GetFileName(fullpath) + "]";
                using (var adapter = new OleDbDataAdapter(query, conn))
                {
                    adapter.Fill(dt_data);
                }

            } 

但在浏览时看到此行出现错误:adapter.Fill(dt_data);:

我在相关路径中有 Excel 文件。

【问题讨论】:

  • 请显示异常发生的行,而不是捕获异常的位置。但最有可能的是,您需要转义文件名,例如写Data Source='{0}'
  • 编辑了问题。请检查
  • 刚刚注意到您在FROM 子句中使用了文件名。 FROM 用于从特定的工作表中进行选择,而不是从文件中进行选择。它应该类似于 FROM [Sheet1$]

标签: c# excel connection-string jet


【解决方案1】:

FROM [...] 子句指定您要读取的工作表(实际上是范围)。它应该包含工作表的名称,而不是工作簿的文件名。

如果您的工作表名为Sheet1,则应使用

var query = "SELECT * FROM [Sheet1$]";

SO 中有很多答案显示如何提取第一张纸的名称(如果不知道等)。

更新

我还注意到您在连接字符串中使用文件的目录路径而不是完整路径。您应该使用完整的文件路径:

 var connString = string.Format(
            @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""",
            fullpath
        );

【讨论】:

  • 使用此错误显示时。 “Microsoft Jet 数据库引擎找不到对象 'Sheet1$.txt'。请确保该对象存在并且正确拼写其名称和路径名。”
  • 你尝试了什么?您是否使用文件路径作为数据源或其他东西,如目录?
  • 我只改变了这一部分。 "var query = "SELECT * FROM [Sheet1$]";
  • 您的连接字符串虽然使用 目录的 路径作为数据源而不是文件的路径。您应该将其更改为使用完整的文件路径
【解决方案2】:

我已更改代码。现在它的工作。

OpenFileDialog OpenCSVDialog = new OpenFileDialog();
            OpenCSVDialog.Filter = "Excel |*.xls";
            OpenCSVDialog.ShowDialog();
            ExcelFileName = System.IO.Path.GetFileName(OpenCSVDialog.FileName);
            string path = System.IO.Path.GetDirectoryName(OpenCSVDialog.FileName);
            fullpath = Path.Combine(path, ExcelFileName);

            dt_data = new DataSet("CSV File");

            string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
          "Data Source=" + fullpath +
          ";Extended Properties='Excel 8.0;'";

            using (var conn = new OleDbConnection(connString))
            {
                conn.Open();
                string query = string.Format("select * from [{0}$]", "Sheet1");

                using (var adapter = new OleDbDataAdapter(query, conn))
                {
                    adapter.Fill(dt_data);
                }
            }

【讨论】:

    【解决方案3】:

    请参阅下面的课程。查看将完整文件名拆分为路径和文件名。

    public class CSVReader
        {
    
            public DataSet ReadCSVFile(string fullPath, bool headerRow)
            {
    
                string path = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1);
                string filename = fullPath.Substring(fullPath.LastIndexOf("\\") + 1);
                DataSet ds = new DataSet();
    
                try
                {
                    if (File.Exists(fullPath))
                    {
                        string ConStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" + ";Extended Properties=\"Text;HDR={1};FMT=Delimited\\\"", path, headerRow ? "Yes" : "No");
                        string SQL = string.Format("SELECT * FROM {0}", filename);
                        OleDbDataAdapter adapter = new OleDbDataAdapter(SQL, ConStr);
                        adapter.Fill(ds, "TextFile");
                        ds.Tables[0].TableName = "Table1";
                    }
                    foreach (DataColumn col in ds.Tables["Table1"].Columns)
                    {
                        col.ColumnName = col.ColumnName.Replace(" ", "_");
                    }
                }
    
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                return ds;
            }
        }​
    

    【讨论】:

    • 为什么这是对 OP 问题的回答?发布一些代码并等待其他人发现它的作用被认为是 SO 中的一种好习惯。如果您想说FROM 语句应该更改,请明确地说出来。但这并不是说它会解决问题 - FROM 指的是 sheet 而不是文件
    • 因为最好将这段代码放入一个类中,使其成为内联代码。自从我在一年前开发此代码以来,最好发布一个更好的方法,而不仅仅是回答问题。通过查看实际有效的代码,让 op 解决自己的问题。
    猜你喜欢
    • 2018-12-20
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2014-01-29
    相关资源
    最近更新 更多