Не получается открыть большую Excel книгу средствами Microsoft.Office.Interop.Excel
Функция справляется с открытием 5 таблиц по 50 строк в каждой. Но когда я попробовал открыть таблицу с 3200 строк - программа замерла и минут через 5 появилась ошибка:
Ошибка:
Помощник по отладке управляемого кода "ContextSwitchDeadlock" : "CLR не удалось перейти из COM-контекста 0xb970f0 в COM-контекст 0xb97038 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций."
Как можно сделать чтобы не было проблем с Excel файлами в которых пару тысяч строк?
Функция загрузки книги:
List<DataTable> LoadExcelSheets()
{
List<DataTable> dataTables = new List<DataTable>();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "(*.xlsx, *.xls) | *.xlsx; *.xls";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
CloseExcelFile();
DataTable dataTable;
Workbook = ExcelApplication.Workbooks.Open(openFileDialog.FileName);
foreach (Excel.Worksheet worksheet in Workbook.Worksheets)
{
worksheets_list.Add(worksheet);
}
for(int i = 0; i < worksheets_list.Count; i++)
{
dataTable = new DataTable();
DataColumn dataColumn = new DataColumn();
dataColumn.ColumnName = "Row №";
dataColumn.AutoIncrement = true;
dataColumn.AutoIncrementStep = 1;
dataColumn.AutoIncrementSeed = 1;
dataTable.Columns.Add(dataColumn);
lastCell = worksheets_list[i].Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell);
dataTable.Rows.Add();
dataTable.Columns.Add();
for (int j = 1; j < lastCell.Column; j++)
{
dataTable.Columns.Add();
for (int k = 1; k < lastCell.Row; k++)
{
dataTable.Rows.Add();
dataTable.Rows[k][j] = worksheets_list[i].Cells[k + 1, j].Text;
}
}
dataTable.Rows[0][1] = worksheets_list[i].Name;
dataTables.Add(dataTable);
}
return dataTables;
}
else
{
return null;
}
}