NPOI для большого файла

borobos

Здравствуйте. Посоветуйте плз кто стыкался.- есть file.xlsx.- розмер файла 20 Мб.- около 500К строк в файле.Стоит задача прочитать файл построчно и обработать.Решал с пом. https://github.com/tonyqus/npoi. Версия последняя 2.3.0. Но при создании екземпляра начинает память кушать в районе 3Гб.
using (FileStream stream = File.OpenRead(filePath))
{
 IWorkbook wb = WorkbookFactory.Create(stream);
 ...
}
И на этом умирает.
19 ответов

borobos

borobos,XML можно читать 2 способами RAW и DOM используйте 1ый, гугл в помощь


borobos

Roman Mejtes,Спасибо за ответ. Посмотрел варианты, видимо надо смотреть в сторону https://github.com/JanKallman/EPPlusКак минимум на тестовом проекте на том же файле читает хорошо.


borobos

borobos,Предлагаю экспортировать файл в CSV и ...


borobos

Стоит задача прочитать файл построчно и обработать
один раз или многократно?из под сервиса или пользовательского интерфейса?


borobos

Если файл состоит из простой таблицы, где только заголовки и данные, то можноа) Подключить его, как связанный сервер (MS SQL Linked server)б) Обращаться к нему, как к таблице через OLEDB провайдера


borobos

Изопропил,- файлы приходят регулярно- формат файлов xls и xlsx- консольное приложение, висит постоянно и парсит- NPOI хорош тем что фришный, но если файл 20 Мб - при инициализации пытается все в память грузить- есть хороший аналог - EPPlus - работает быстро (проверял) - но не умеет работать со старым форматом xls (а надо)Варианты:- новый формат парсить EPPlus, старый - или конвертировать в новый или оставить на NPOI.- платное что-то (не вариант)


borobos

Open XML SDK пробовали?


borobos

borobos, а через Automation тоже 3Гб жрёт?


borobos

Варианты:- новый формат парсить EPPlus, старый - или конвертировать в новый или оставить на NPOI.- платное что-то (не вариант)
- конвертировать в старый формат xml и разгребать его с помощью xslt.


borobos

Читаю файл Excel в 500 тыщ строк за 5 секунд:
private void button2_Click(object sender, EventArgs e)
		{
			int nT1 = Environment.TickCount;
			Excel.Application oXL;
			oXL = new Excel.Application();
			oXL.Visible = true;

			Excel._Workbook oWB = oXL.Workbooks.Open(@"C:\Users\HRENSGORY\Documents\500Klines.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing,
				Type.Missing, Type.Missing, Type.Missing, Type.Missing,
				Type.Missing, Type.Missing, Type.Missing, Type.Missing,
				Type.Missing, Type.Missing);
			
			Excel.Worksheet sheet = (Excel.Worksheet)oWB.Sheets["Sheet1"];

			Microsoft.Office.Interop.Excel.Range workingRangeCells = sheet.get_Range("A1:D500000", Type.Missing);
			System.Array array = (System.Array)workingRangeCells.Cells.Value2;

			oXL.Quit();
			int nTD = Environment.TickCount - nT1;
		}


borobos

13th,Не все описал. - крутиться на Линухе под mono- Microsoft.Office.Interop вроди не рекомендуют (читал где-то) использывать если не разово


borobos

Arm79,спасибо, посмотрю


borobos

13th,вроди не пробувал. Спасибо посмотрю


borobos

Antonariy,а можно привести чем или как удобно будет конвертировать старый в новый?


borobos

Antonariy,а можно привести чем или как удобно будет конвертировать старый в новый?
не старый в новый, а новый в старый.вспомнил, что всего одна библиотека это умеет, но она платная, так что вариант не фонтан.


borobos

Arm79,Open XML SDK не умеет со старым xls работать, частично решает задачу.


borobos

Наткнуся на репо https://github.com/aspose-cells/Aspose.Cells-for-.NETЕсть dll. Информации про лимиты нет. Читает весь файл. Не пойму в чем подвох...


borobos

Наткнуся на репо https://github.com/aspose-cells/Aspose.Cells-for-.NETЕсть dll. Информации про лимиты нет. Читает весь файл. Не пойму в чем подвох...
Используешь скаченную бесплатно? Подвох в чём нашёл?


borobos

Используешь скаченную бесплатно? Подвох в чём нашёл?
Бегло прогнал на большом файле - весь файл читает. Скорость отличная. Насчет использывать - пока не дошел.