OpenXML Sax метод для быстрого экспорта 100K + строк в Excel
Я пытался улучшить производительность метода SAX для записи в xlsx. Я знаю, что в Excel есть ограничение в 1048576 строк. Я достиг этого предела только несколько раз. В большинстве случаев я записываю только от 125К до 250К строк (большой набор данных). Код, который я пробовал, выглядит не так быстро, как мог бы быть из-за того, что он много раз записывает в файл. Я хотел бы надеяться, что кеширование задействовано, но кажется, что в настоящее время слишком много доступа к диску в том, как работает код.
Код ниже похож наИспользование шаблона с OpenXML и SAX потому что я записал в файл с использованием ClosedXML и затем переключился на SAX для большого контента. Память уходит с графиков при попытке использовать ClosedXML для такого количества строк. Вот почему я использую SAX.
int numCols = dt.Columns.Count;
int rowCnt = 0;
//for (curRec = 0; curRec < totalRecs; curRec++)
foreach (DataRow row in dt.Rows)
{
Row xlr = new Row();
//starting of new row.
//writer.WriteStartElement(xlr);
for (int col = 0; col < numCols; ++col)
{
Cell cell = new Cell();
CellValue v = new CellValue(row[col].ToString());
{
string objDataType = row[col].GetType().ToString();
if (objDataType.Contains(TypeCode.Int32.ToString()) || objDataType.Contains(TypeCode.Int64.ToString()))
{
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
//cell.CellValue = new CellValue(row[col].ToString());
cell.Append(v);
}
else if (objDataType.Contains(TypeCode.Decimal.ToString()) || objDataType.Contains("Single"))
{
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.Append(v);
//TODO: set the decimal qualifier - May be fixed elsewhere
cell.StyleIndex = 2;
}
else
{
//Add text to text cell
cell.DataType = new EnumValue<CellValues>(CellValues.String);
cell.Append(v);
}
}
if (colStyles != null && col < colStyles.Count)
{
cell.StyleIndex = (UInt32Value)colStyles[col];
}
//writer.WriteElement(cell);
xlr.Append(cell);
}
writer.WriteElement(xlr);
//end row element
//writer.WriteEndElement();
++rowCnt;
}
Этот код очень близок к примерам, которые я видел там. Но проблема в том, что все еще довольно медленно. Переход от записи в отдельную ячейку к добавлению в строку и записи в строку, кажется, улучшил процесс на 10% в строках 125K.
Кто-нибудь нашел способ улучшить писателя или настроить способ писать меньше раз? Существуют ли методы, которые могли бы ускорить этот процесс?
Кто-нибудь пытался настроить какую-либо форму кэширования для повышения производительности?