Excel 文件的 C# 多线程访问
C# Multithreaded Access on Excel File
我正在编写一个多线程 C# 应用程序,它为 Excel 文件提供了一些统计信息。
我通过以下代码打开文件:
private static Excel.Application excelApp = new Excel.Application();
private static Excel.Workbook workbook = excelApp.Workbooks.Open(path);
private static Excel.Worksheet worksheet = workbook.ActiveSheet;
private static Excel.Range range = worksheet.UsedRange;
private static int totalColumns = worksheet.UsedRange.Columns.Count;
为了从列中收集数据,我每列使用一个线程。
for (int columnCount = 1; columnCount <= /*range.Columns.Count*/totalColumns; columnCount++)
{
Thread worker = new Thread(printSpread);
worker.Start(columnCount);
}
如果我不在每个线程中启动新的 Excel 应用程序,我会得到 HRESULT: 0x800A01A8 错误。
我的问题是,我必须这样做还是只能使用一个 Excel 应用程序?
我确实认为,通过多个线程从一个应用程序访问数据存在问题,这可以解释 COM 异常。
感谢您的时间和帮助。
将 excell 文件解析为(临时)数据库不是一个选择吗-table,因为与简单的 excell 文件相比,数据库往往更适合多重访问情况在磁盘上?
根据您当前的代码似乎主要计算一行中的列数这一事实,一个简单的数据库可以在每次数据更改时更新该数据。考虑到这一点;如果你建立了一个好的数据库模型,解析 excell 文件几乎可以用你想要使用的数据自动填充数据库。
但这可能是一种过于复杂的方法,因为我不确定您的实际目标。
您可以像读取单个 excel 文件一样读取 table 并使用简单的数据 table 将数据保存在内存中。
因此,您可以在关闭 excel 文件后在多线程中工作。
sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.xls;Extended Properties=""Excel 12.0;HDR=No;IMEX=1"""
using (var conn = new OleDbConnection(sConnection)
{
conn.Open();
string query = "SELECT * FROM [" + mySheetName + "]";
var adapter = new OleDbAdapter(query, conn);
var table = new DataTable();
adapter.Fill(table);
//or you can use datareader
//Now you can close excel and dbConnection
//and work in memory with datatable and threads
}
我正在编写一个多线程 C# 应用程序,它为 Excel 文件提供了一些统计信息。 我通过以下代码打开文件:
private static Excel.Application excelApp = new Excel.Application();
private static Excel.Workbook workbook = excelApp.Workbooks.Open(path);
private static Excel.Worksheet worksheet = workbook.ActiveSheet;
private static Excel.Range range = worksheet.UsedRange;
private static int totalColumns = worksheet.UsedRange.Columns.Count;
为了从列中收集数据,我每列使用一个线程。
for (int columnCount = 1; columnCount <= /*range.Columns.Count*/totalColumns; columnCount++)
{
Thread worker = new Thread(printSpread);
worker.Start(columnCount);
}
如果我不在每个线程中启动新的 Excel 应用程序,我会得到 HRESULT: 0x800A01A8 错误。 我的问题是,我必须这样做还是只能使用一个 Excel 应用程序? 我确实认为,通过多个线程从一个应用程序访问数据存在问题,这可以解释 COM 异常。 感谢您的时间和帮助。
将 excell 文件解析为(临时)数据库不是一个选择吗-table,因为与简单的 excell 文件相比,数据库往往更适合多重访问情况在磁盘上?
根据您当前的代码似乎主要计算一行中的列数这一事实,一个简单的数据库可以在每次数据更改时更新该数据。考虑到这一点;如果你建立了一个好的数据库模型,解析 excell 文件几乎可以用你想要使用的数据自动填充数据库。
但这可能是一种过于复杂的方法,因为我不确定您的实际目标。
您可以像读取单个 excel 文件一样读取 table 并使用简单的数据 table 将数据保存在内存中。 因此,您可以在关闭 excel 文件后在多线程中工作。
sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.xls;Extended Properties=""Excel 12.0;HDR=No;IMEX=1"""
using (var conn = new OleDbConnection(sConnection)
{
conn.Open();
string query = "SELECT * FROM [" + mySheetName + "]";
var adapter = new OleDbAdapter(query, conn);
var table = new DataTable();
adapter.Fill(table);
//or you can use datareader
//Now you can close excel and dbConnection
//and work in memory with datatable and threads
}