2015-11-11 4 views
0

Я пытаюсь получить данные из файла Excel с помощью:Ошибка получения данных из 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);:

enter image description here

I иметь файл Excel в связанном пути.

+0

Пожалуйста, укажите строку, в которой произошло исключение *, а не там, где оно было обнаружено. Скорее всего, вам нужно избежать имени файла, например, написать 'Data Source = '{0}'' –

+1

Отредактированный вопрос. Пожалуйста, отметьте – Tom

+0

Просто заметили, что вы используете имя файла в предложении 'FROM'. 'FROM' используется для выбора из определенного * листа *, а не файла. Это должно быть что-то вроде 'FROM [Sheet1 $]'. –

ответ

-2

См. Мой класс ниже. Посмотрите на разделение полного имени файла на путь и имя файла.

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; 
     } 
    }​ 
+0

Почему это ответ на вопрос ОФ? Проводка некоторого кода и ожидание того, что другие узнают, что он делает, - это * не * считается хорошей практикой в ​​SO. Если вы хотите сказать, что оператор 'FROM' должен измениться, скажите это явно. Не то чтобы это решило проблему, хотя - 'FROM' ссылается на * sheet *, а не на файл –

+0

. Потому что лучше поместить этот код в класс, чтобы сделать его встроенным кодом. С тех пор, как я разработал этот код год назад, лучше было опубликовать лучший метод, чем просто ответить на вопрос. Пусть проблема op - это собственная проблема, если посмотреть на действительно действующий код. – jdweng

0

Предложение FROM [...] определяет, какой лист (на самом деле, диапазон) Вы хотите читать. Он должен содержать имя листа, а не имя файла книги.

Если лист называется Sheet1, вы должны использовать

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

Есть много ответов на SO, которые показывают, как извлечь имя первого листа, если не известно, и т.д.

UPDATE

Я также заметил, что вы используете путь к каталогу файла в строке соединения вместо полного пути. Вместо этого вы должны использовать полный путь к файлу:

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

при использовании нижеследующий ошибка отображение. «Механизм базы данных Microsoft Jet не смог найти объект« Sheet1 $ .txt ». Убедитесь, что объект существует, и вы правильно указали его имя и имя пути». – Tom

+0

Что вы пробовали? Вы использовали путь к файлу как источник данных или что-то еще, например каталог? –

+0

Я изменил только эту часть. "var query =" SELECT * FROM [Sheet1 $] "; – Tom

0

Я изменил код. Теперь его работа.

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); 
       } 
      } 
Смежные вопросы