C#多线程访问Excel文件

3

我正在编写一个多线程的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异常。 感谢你的时间和帮助。

2个回答

0

把Excel文件解析到(临时)数据库表中是否是一个选项?因为与磁盘上的简单Excel文件相比,数据库往往更适合多用户访问。

从您当前的代码主要似乎是计算一行中的列数来看,一个简单的数据库可以在每次数据更改时更新该数据。考虑到这一点;如果构建一个良好的数据库模型,则解析Excel文件将自动填充您想使用的数据到数据库中。

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


长期目标是构建一个应用程序,将Excel文件的数据解析到现有数据库中,就像一种导入。问题是,该文件不符合数据库规范,例如规范化。 - P. Edge

0
你可以像读取单个表格一样读取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
}

谢谢!找到了这个实现的帮助链接 - P. Edge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接