Excel文件上的C#多线程访问

时间:2016-05-31 10:14:19

标签: c# excel multithreading comexception hresult

我在多线程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;

使用每列一个线程从I列中收集数据。

for (int columnCount = 1; columnCount <= /*range.Columns.Count*/totalColumns; columnCount++)
{
    Thread worker = new Thread(printSpread);
    worker.Start(columnCount);
}

我得到了HRESULT:0x800A01A8如果我没有在每个线程中启动新的Excel应用程序,则会出错。 我的问题是,我是否必须这样做或者是否有机会只使用一个Excel应用程序? 我认为,通过多个线程从一个应用程序访问数据存在问题,这将解释COM异常。 感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:1)

您可以像单个表一样读取excel文件,并使用简单的数据表将数据保存在内存中。 因此,关闭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
}

答案 1 :(得分:0)

将excell文件解析为(临时)数据库表是不是一个选项,因为与磁盘上的简单excell文件相比,数据库往往更适合多种访问情况?

从当前代码主要计算连续列数量这一事实中收集,一个简单的数据库可以在每次数据更改时更新该数据。考虑到这一点;如果你构建一个好的数据库模型,解析excell文件几乎会自动用你想要使用的数据填充数据库。

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