Excel文件上的C#multithreading访问

我正在编写一个multithreading的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); } 

我得到HRESULT:0x800A01A8如果我不在每个线程中启动一个新的Excel应用程序错误。 我的问题是,我必须这样做还是有机会只使用一个Excel应用程序? 我认为,从多个线程访问仅来自一个应用程序的数据存在问题,这将解释COMexception。 感谢您的时间和帮助。

您可以像读取单个表一样读取excel文件,并使用简单的数据表将数据保存在内存中。 所以,你可以在closuresexcel文件后在multithreading中工作。

 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 } 

难道这不是将excell文件parsing为(临时)数据库表的一个select,因为与简单的excell文件在磁盘上相比,数据库倾向于将多个访问情况放在一起?

从目前的代码主要似乎计算一行中的列数来收集事实,一个简单的数据库可以在每次数据更改时更新数据。 考虑到这一点, 如果你build立了一个好的数据库模型,那么parsingexcell文件几乎可以用你想要使用的数据自动填充数据库。

这可能是一个过度复杂的方法,因为我不确定你的实际目标。