Консольное приложение .Net - Объединение нескольких листов Excel в один лист приводит к ошибке «Недостаточно памяти» - PullRequest
0 голосов
/ 30 октября 2018

Попытка объединить данные из нескольких листов Excel одной книги Excel в один лист. Каждый лист Excel содержит 50 тысяч строк и около 80 столбцов. Приложение выдает исключение «Недостаточно памяти», поскольку данные огромны.

Код:

using (SpreadsheetDocument doc = SpreadsheetDocument.Open(InputExcelFilePath, false))
{
WorkbookPart wbPart = doc.WorkbookPart;
Sheet mainRosterSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == "TestSheet").FirstOrDefault();
Worksheet mainWorksheet = ((WorksheetPart)wbPart.GetPartById(mainRosterSheet.Id)).Worksheet;
SheetData mainSheetdata = (SheetData)mainWorksheet.GetFirstChild<SheetData>();
Sheets sheetcollection = wbPart.Workbook.GetFirstChild<Sheets>();

foreach (Sheet childSheet in sheetcollection)
{
    string sheetName = childSheet.Name;
    if (sheetName.StartsWith("TestSheet ("))
    {
        Worksheet childWorksheet = ((WorksheetPart)wbPart.GetPartById(childSheet.Id)).Worksheet;
        SheetData childsheetdata = (SheetData)childWorksheet.GetFirstChild<SheetData>(); //Thowing Out of Meory Exception
    }
}
} 

Использование библиотеки OpenXML для операций Excel. Пожалуйста, предложите, если какая-либо вспомогательная библиотека, которая может быть использована для объединения листов Excel с огромными данными, если размер данных является ограничением с вышеупомянутым подходом.

1 Ответ

0 голосов
/ 30 октября 2018

я бы посоветовал вместо того, чтобы делать это в одной массовой операции, делать это один за другим, располагая таким образом, чтобы вы могли освободить часть памяти ... что-то вроде:

WorkbookPart wbPart = doc.WorkbookPart;
Sheet mainRosterSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == "TestSheet").FirstOrDefault();
Worksheet mainWorksheet = ((WorksheetPart)wbPart.GetPartById(mainRosterSheet.Id)).Worksheet;
SheetData mainSheetdata = (SheetData)mainWorksheet.GetFirstChild<SheetData>();
Sheets sheetcollection = wbPart.Workbook.GetFirstChild<Sheets>();

foreach (Sheet childSheet in sheetcollection)
{
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(InputExcelFilePath, false))
{
string sheetName = childSheet.Name;
if (sheetName.StartsWith("TestSheet ("))
{
    Worksheet childWorksheet = ((WorksheetPart)wbPart.GetPartById(childSheet.Id)).Worksheet;
    SheetData childsheetdata = (SheetData)childWorksheet.GetFirstChild<SheetData>(); //Thowing Out of Meory Exception
}
}
} 

Код выше не был проверен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...