2015-08-16 3 views
0

Я хочу прочитать файл excel, но так слишком медленно. Какую модель следует использовать для быстрого чтения файла excel. Должен ли я попробовать csv?Медленная производительность при чтении Excel

Я использую следующий код:

ApplicationClass excelApp = excelApp = new ApplicationClass(); 
Workbook myWorkBook = excelApp.Workbooks.Open(@"C:\Users\OWNER\Desktop\Employees.xlsx"); 
Worksheet mySheet = (Worksheet)myWorkBook.Sheets["Sheet1"]; 

for (int row = 1; row <= mySheet.UsedRange.Rows.Count; row++) 
{ 
    for (int col = 1; col <= mySheet.UsedRange.Columns.Count; col++) 
    { 
     Range dataRange = (Range)mySheet.Cells[row, col]; 
     Console.Write(String.Format(dataRange.Value2.ToString() + " ")); 
    } 
    Console.WriteLine(); 
} 

excelApp.Quit(); 
+1

Вы, кажется, используете Excel Interop для чтения файлов Excel. Это не рекомендуется (и не поддерживается). Вместо этого используйте OpenXML для прямого доступа к файлам. Существует множество библиотек-оберток для работы с ним. http://stackoverflow.com/a/23104151/1808494 – Aron

ответ

3

Причина, по которой ваша программа работает медленно, заключается в том, что вы используете Excel для открытия файлов Excel. Всякий раз, когда вы делаете что-либо с файлом, вы должны сделать COM + interop, что очень медленно, так как вам нужно передать память через два разных процесса.

Microsoft отказалась от поддержки чтения .xlsx файлов с использованием взаимодействия Excel. По этой причине они выпустили библиотеку OpenXML.

Я предлагаю вам использовать библиотеку-оболочку для использования OpenXML, так как API довольно волосатый. Вы можете проверить это так, как правильно его использовать.

open xml reading from excel file

0

вы обращаетесь Excel файл через первенствовать Interop. Делая чтение ячейки по ячейке, вы делаете много P/Invoke, что не очень эффективно.

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

BTW: Вы могли бы использовать некоторую библиотеку вместо http://epplus.codeplex.com, которая читает файлы excel напрямую.

+0

Это не объясняет, почему чтение ячейки за один раз медленное (Invoke/P и маршалинг больших объемов памяти через процессы). – Aron

+0

Ваш EDIT не относится к вашему ответу вообще. EPPlus решает проблему, не взаимодействуя с Excel вообще, и читает файл напрямую с помощью OpenXML. – Aron

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