我最近遇到了同样的问题...我无法真正找到一个开箱即用的解决方案来为我解决这个问题,所以我最终手动编写了一些代码。
我的代码库中实际上有两种不同的解决方案:一种使用 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 之外我还有其他连接提供程序。