Problemas de rendimiento de .NET OpenXML

Estoy intentando escribir un archivo de Excel desde un servidor web ASP.NET utilizando OpenXML. Tengo alrededor de 2100 registros y está tomando alrededor de 20-30 segundos para hacer esto. ¿De alguna manera puedo hacerlo más rápido? Recuperar las 2100 filas de la base de datos toma una fracción de segundo. No estoy seguro de por qué manipularlos en la memoria llevaría más tiempo.

Nota: ExcelWriter es nuestra clase personalizada, pero todos sus métodos son directamente del código en este enlace,http://msdn.microsoft.com/en-us/library/cc861607.aspx

<code>   public static MemoryStream CreateThingReport(List<Thing> things, MemoryStream template)
    {
        SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(template, true);
        WorksheetPart workSheetPart = spreadsheet.WorkbookPart.WorksheetParts.First();

        SharedStringTablePart sharedStringPart = spreadsheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();

        Cell cell = null;
        int index = 0;

        //create cell formatting for header text
        Alignment wrappedAlignment = new Alignment { WrapText = true };
               uint rowOffset = 2;

  foreach (Thing t in things)
        {
            //Received Date
            cell = ExcelWriter.InsertCellIntoWorksheet("A", rowOffset, workSheetPart);
            index = ExcelWriter.InsertSharedStringItem(t.CreateDate.ToShortDateString(), sharedStringPart);
            cell.CellValue = new CellValue(index.ToString());
            cell.DataType = new DocumentFormat.OpenXml.EnumValue<CellValues>(CellValues.SharedString);

            //Car Part Name
            cell = ExcelWriter.InsertCellIntoWorksheet("B", rowOffset, workSheetPart);
            index = ExcelWriter.InsertSharedStringItem(t.CarPart.Name, sharedStringPart);
            cell.CellValue = new CellValue(index.ToString());
            cell.DataType = new DocumentFormat.OpenXml.EnumValue<CellValues>(CellValues.SharedString);

  rowOffset++; 
   }

 workSheetPart.Worksheet.Save();

        spreadsheet.WorkbookPart.Workbook.Save();
        spreadsheet.Close();

        return template;
</code>

Respuestas a la pregunta(4)

Su respuesta a la pregunta