基本上我需要将一堆数据插入到 Excel 文件中。创建 OleDB 连接似乎是最快的方法,但我发现遇到了内存问题。当我执行 INSERT 查询时,进程使用的内存似乎在不断增长。我已将它们缩小到仅在输出到 Excel 文件时发生(内存保持稳定而没有输出到 Excel)。我关闭并重新打开每个工作表之间的连接,但这似乎对内存使用没有影响(Dispose() 也是如此)。数据写入成功,因为我可以使用相对较小的数据集进行验证。如果有人有见识,将不胜感激。
在构造函数中调用initializeADOConn()
initADOConnInsertComm()创建插入参数化插入查询
每当写入新记录时都会调用writeRecord() 。根据需要创建新工作表。
public bool initializeADOConn()
{
/* Set up the connection string and connect.*/
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + this.destination + ";Extended Properties=\"Excel 8.0;HDR=YES;\"";
//DbProviderFactory factory =
//DbProviderFactories.GetFactory("System.Data.OleDb");
conn = new OleDbConnection(connectionString);
conn.ConnectionString = connectionString;
conn.Open();
/* Intialize the insert command. */
initADOConnInsertComm();
return true;
}
public override bool writeRecord(FileListerFileInfo file)
{
/* If all available sheets are full, make a new one. */
if (numWritten % EXCEL_MAX_ROWS == 0)
{
conn.Close();
conn.Open();
createNextSheet();
}
/* Count this record as written. */
numWritten++;
/* Get all of the properties of the FileListerFileInfo record and add
* them to the parameters of the insert query. */
PropertyInfo[] properties = typeof(FileListerFileInfo).GetProperties();
for (int i = 0; i < insertComm.Parameters.Count; i++)
insertComm.Parameters[i].Value = properties[i].GetValue(file, null);
/* Add the record. */
insertComm.ExecuteNonQuery();
return true;
}
编辑:
不,我根本不使用 Excel。我故意避免使用 Interop.Excel,因为它的性能很差(至少从我对它的涉猎来看)。