OutOfMemoryException при попытке прочитать большой файл Excel в DataTable - PullRequest
0 голосов
/ 15 февраля 2019

Я использую пакет служб SSIS для очистки и загрузки данных из файла .Xlsx в таблицу SQL Server.Я также должен выделить ячейки, содержащие неправильные данные в файле .Xlsx, для этого я должен получить обратно индексы столбцов и строк на основе имени столбца и идентификатора строки (что у меня есть в моей электронной таблице данных).Для этого я сравниваю имя каждого столбца из моей первой электронной таблицы (Error_Sheet) со строками столбца, которые я добавил во второй электронной таблице, и делаю то же самое для строк, и если у меня одинаковое значение ячеек, я возвращаю столбец ииндексы строк в моей электронной таблице данных и выделение ячейки на основе этого столбца и индекса строки.Сценарий работал нормально, но после попытки запустить его с сервера я получил исключение памяти, а также на своей рабочей станции, где раньше он работал нормально.

Я пытался уменьшить диапазон, который я беруданные от: AC1:AC10000 до AC1:AC100, он работал только после первой компиляции, но он снова генерирует исключение.

string strSQLErrorColumns = "Select * From [" + Error_Sheet + "AC1:AC100]";
OleDbConnection cn = new OleDbConnection(strCn);

OleDbDataAdapter objAdapterErrorColumns = new OleDbDataAdapter(strSQLErrorColumns, cn);
System.Data.DataSet dsErrorColumns = new DataSet();
objAdapterErrorColumns.Fill(dsErrorColumns, Error_Sheet);
System.Data.DataTable dtErrorColumns = dsErrorColumns.Tables[Error_Sheet];
dsErrorColumns.Dispose();
objAdapterErrorColumns.Dispose();

foreach (DataColumn ColumnData in dtDataColumns.Columns){
    ColumnDataCellsValue = dtDataColumns.Columns[iCntD].ColumnName.ToString();
    iCntE = 0;

    foreach (DataRow ColumnError in dtErrorColumns.Rows){
        ColumnErrorCellsValue = dtErrorColumns.Rows[iCntE].ItemArray[0].ToString();

        if (ColumnDataCellsValue.Equals(ColumnErrorCellsValue)){

            ColumnIndex = ColumnData.Table.Columns[ColumnDataCellsValue].Ordinal;
            iCntE = iCntE + 1;
            break;
            }
        }

        iCntD = iCntD + 1;
    }

ColumnIndexHCell = ColumnIndex + 1;          
RowIndexHCell = RowIndex + 2;

Range rng = xlSheets.Cells[RowIndexHCell, ColumnIndexHCell] as Excel.Range;
rng.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Yellow);

Существует любой другой способ загрузки данных в DataTable для получения столбца ииндекс строки без использования большого количества памяти или с помощью Excel.Range.Cell вместо набора данных и DataTable для получения значения ячейки, индекса столбца и строки из файла xlsx, пожалуйста?

Я не показывал весь код, потому что он длинный,Пожалуйста, держите меня в курсе, если потребуется дополнительная информация.

1 Ответ

0 голосов
/ 16 февраля 2019

При попытке чтения данных из Excel с огромным количеством строк лучше считывать данные по фрагменту (в OleDbDataAdapter вы можете использовать опцию подкачки для достижения этой цели) .

int result = 1;
int intPagingIndex = 0;
int intPagingInterval = 1000;

while (result > 0){

    result = daGetDataFromSheet.Fill(dsErrorColumns,intPagingIndex, intPagingInterval , Error_Sheet);
    System.Data.DataTable dtErrorColumns = dsErrorColumns.Tables[Error_Sheet];

    //Implement your logic here

    intPagingIndex += intPagingInterval ;

}

Это предотвратит исключение OutOfMemory.И больше не нужно указывать диапазон, такой как AC1:AC10000

Ссылки

...