Метод заполнения OleDataAdapter, возвращающий пустые строки в таблицу данных

Вот мой код:

public static DataTable GetDataFromSpreadsheet(OleDbConnection conn)
    {
        DataTable dt = new DataTable();
        OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
        conn.Open();
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        da.Fill(dt);
        conn.Close();
        return dt;
    }

Когда этот метод вызывается, я не получаю ошибку вообще! Когда я помещаю часы в таблицу данных (dt), я вижу, что она пуста. Нет заголовков строк, и строки пусты. Я знаю, что запрос в некоторой степени действителен, потому что Rows.Count на dt возвращает количество строк в листе, который я запрашиваю.

Что я мог делать неправильно?

Спасибо за помощь!

РЕДАКТИРОВАТЬ: Вот моя строка подключения

<add name="EXCEL" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;
           Data Source={0};
           Extended Properties='Excel 8.0;
           HDR=Yes; IMEX=1;'" />

Я помещаю местоположение файла вместо {0}

3 ответа

Решение

Установить соединение

String strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=Book1.xls;"
+ "Extended Properties='Excel 8.0;HDR=Yes'";

OleDbConnection connExcel = new OleDbConnection(strExcelConn);
OleDbCommand cmdExcel = new OleDbCommand();
cmdExcel.Connection = connExcel;

Доступ к листам

connExcel.Open();
DataTable dtExcelSchema;
dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
connExcel.Close(); 
DataSet ds = new DataSet();
string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
da.SelectCommand = cmdExcel;
da.Fill(ds);
connExcel.Close();

Перейдите по этой ссылке

https://www.connectionstrings.com/excel/

Попробуйте установить IMEX=1 или же HDR=YES в вашей строке подключения

Список перегрузки метода DataAdapter.Fill следующий:

  • Fill(DataSet)
  • Заполнить (DataTable, IDataReader)
  • Заполнить (DataTable[], IDataReader, Int32, Int32)
  • Заполнить (DataSet, String, IDataReader, Int32, Int32)

Не существует метода с одним параметром DataTable.

В вашем случае вы можете использовать метод Fill(DataSet) и возвращать.Tables[0] или.Tables["TableName"];

Посмотрите следующий код:

public static DataTable GetDataFromSpreadsheet(OleDbConnection conn)
{
    DataSet ds = new DataSet();
    OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
    conn.Open();
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    da.Fill(ds);
    conn.Close();
    return ds.Tables[0];
}
Другие вопросы по тегам