Загрузить DataTable в файл Excel по частям. C#, ASP.NET

268
14 апреля 2017, 19:01

Я использую ClosedXML.Excel для создания файла Excel из DataTable. Но если в DataTable хранится очень много записей (например миллион строк), то приложение закрывается с ошибкой памяти. Как мне переделать функцию создания Excel файла так, чтобы я мог загружать строки из DataTable в Excel файл по частям (по 10000 записей например). Моя функция для создания Excel файла выглядит так:

public static void DataTableToExcelClosedXML(DataTable dt, string filePath, string fileName)
{
    XLWorkbook wb = new XLWorkbook();
    wb.Worksheets.Add(dt, fileName);
    wb.SaveAs(filePath);
}
Answer 1

Посоветую подключить Microsoft.Office.Interop.Excel и Interop.Microsoft.Office.Core

и сам код:

using Excel = Microsoft.Office.Interop.Excel;
...
public static export(DataTable dt)
{
  Excel.Application objExcel = new Excel.Application();
  Excel.Workbook workbook = objExcel.Workbooks.Add();
  Excel.Worksheet sheet = workbook.ActiveSheet;  
  Excel.Range range = sheet.Range[sheet.Cells[1, 1], sheet.Cells[ct.Rows.Count, ct.Columns.Count]];
  for (int i=0; i< ct.Rows.Count; ++i)
    for (int j = 0; j < ct.Columns.Count; ++j)
      range.Cells[1+i, 1+j] = ct.Rows[i][j].ToString();
  sheet.Cells.EntireColumn.AutoFit();
  sheet.Cells.EntireRow.AutoFit();
  sheet.PageSetup.Orientation = Excel.XlPageOrientation.xlLandscape;
  sheet.PageSetup.Zoom = false;
  sheet.PageSetup.FitToPagesWide = 1;
  sheet.PageSetup.FitToPagesTall = false;
  sheet.PageSetup.ScaleWithDocHeaderFooter = true;
  sheet.PageSetup.AlignMarginsHeaderFooter = true;
  objExcel.Visible = true;
}

Можно так

Answer 2
  1. Для полноценной работы с файлами MS Office из .Net стоит воспользоваться библиотекой Open XML SDK 2.5 for Microsoft Office. Обязательно используйте Open XML SDK 2.5 Productivity Tool - генератор .Net кода по готовым файлам. В генерируемом коде разобраться несложно. Таким образом вы сможете создавать любые файлы MS Office без костылей в виде ActiveX автомации, медлительного межпроцессного маршаллига данных, потребности устанавливать офис на сервер.
  2. Второй способ которым я часто злоупотребляю - написание кода на VBA с использованием ADODB, это работает тоже очень быстро.
READ ALSO
Отследить изменение свойств объекта

Отследить изменение свойств объекта

Есть коллекция вида ObservableCollection<BaseClass> Project {get;set;}

228
Скрыть panel если курсор за ее пределами

Скрыть panel если курсор за ее пределами

Panel1 открывается по нажатию на buttonНужно чтобы panel1 скрылась когда курсор выходит за ее границы

212