2016-05-31 5 views
3

Я кодирую многопоточное приложение C#, которое предоставляет некоторые статистические данные для файла Excel. Я открыл файл по следующему коду: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 приложения в каждой Thread. Мой вопрос: должен ли я это делать или есть возможность использовать только одно приложение Excel? Я действительно думаю, что существует проблема с доступом к данным только из одного приложения с помощью mulitple Threads, что объясняет исключение COM. Спасибо за ваше время и помощь.

ответ

1

вы можете прочитать файл excel как отдельную таблицу и сохранить данные в памяти с помощью простого datatable. Итак, вы можете работать в многопоточном после закрытия файла 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 
} 
+0

Спасибо! Нашел это, чтобы помочь реализовать [link] (http://stackoverflow.com/questions/14261655/best-fastest-way-to-read-an-excel-sheet-into-a-datatable) –

+0

ОК, это нормально , Я собираюсь изменить свой ответ для завершения –

0

Разве это не будет возможность проанализировать файл excell на (временную) таблицу базы данных, поскольку базы данных, как правило, намного лучше подходят для ситуаций с множественным доступом по сравнению с простым файлом excell на диске?

Собрание из-за того, что ваш текущий код в основном, кажется, подсчитывает количество столбцов в строке, простая база данных может обновлять эти данные при каждой смене данных. Учитывая, что; если вы создадите хорошую модель базы данных, синтаксический анализ excell-файлов будет в значительной степени автоматическим заполнением базы данных данными, которые вы хотите использовать.

Это может быть чрезмерно сложный подход, поскольку я не уверен в ваших действительных целях.

+0

Цель Longterm - создать приложение, которое анализирует данные файла Excel в существующей базе данных. Как импорт. Проблема в том, что файл не соответствует стандартам базы данных, касающимся нормализации, например. –

Смежные вопросы