Я недавно столкнулся с этой же проблемой ... Я не смог найти действительно готовое решение, которое бы сделало это для меня, поэтому я закончил писать код вручную.
У меня фактически есть два разных решения в моей библиотеке кода: одно использует OLEDB, а другое использует Excel Interop.Из вашего вопроса, я предполагаю, что вы пытались использовать решение для взаимодействия, и это слишком медленно.Если все, что вам нужно, - это читать таблицы непосредственно из Excel, где на листе есть одна таблица, решение OLEDB, вероятно, будет чище и быстрее.Если вы когда-нибудь дойдете до точки, где вам нужно записать файл Excel, вы можете обнаружить, что OLEDB слишком ограничен.Это был мой опыт для одного проекта.
В любом случае, я опубликую несколько кусочков моего решения OLEDB, которое, надеюсь, поможет вам начать:
public void FillDataTables(DataSet dataSet)
{
var worksheetNames = GetWorksheetNames();
foreach (DataTable table in dataSet.Tables)
{
if (!worksheetNames.Contains(table.TableName + "$")) continue;
FillDataTable(table);
}
}
public void FillDataTable(DataTable table)
{
using (var connection = ConnectionProvider.GetNew())
{
var adapter = GetNewDataAdapter(table, connection);
adapter.Fill(table);
}
}
private IEnumerable<string> GetWorksheetNames()
{
return GetSchemaTable()
.AsEnumerable()
.Select(dr => dr.Field<string>("TABLE_NAME"));
}
public DataTable GetSchemaTable()
{
using (var connection = (OleDbConnection)ConnectionProvider.GetNew())
{
connection.Open();
return connection.GetSchema("Tables");
}
}
Вот код дляExcelConnectionProvider
:
public class ExcelConnectionProvider : IConnectionProvider
{
private readonly string _connectionString;
private readonly string _workbookPath;
public string ConnectionString
{
get { return _connectionString; }
}
public string WorkbookPath
{
get { return _workbookPath; }
}
public ExcelConnectionProvider(string workbookPath)
{
_workbookPath = workbookPath;
_connectionString = GetConnectionString();
}
private string GetConnectionString()
{
var builder = new OleDbConnectionStringBuilder { Provider = "Microsoft.ACE.OLEDB.12.0", DataSource = _workbookPath };
builder.Add("Extended Properties", "Excel 12.0 Xml;HDR=Yes");
return builder.ConnectionString;
}
public DbConnection GetNew()
{
return new OleDbConnection(_connectionString);
}
}
Если у вас возникнут проблемы с этим компиляцией, попробуйте включить сборку «System.Data.DataSetExtensions» в ваш проект.
РЕДАКТИРОВАТЬ: : IConnectionProvider
не нужен - это интерфейс, который я добавил в свою библиотеку, потому что у меня есть другие поставщики соединений, кроме Excel.