.NET OpenXML-performance-Probleme
Ich bin versucht zu schreiben, eine Excel-Datei aus einer ASP.NET web-server mithilfe von OpenXML. Ich habe über 2100 Datensätze und das dauert etwa 20-30 Sekunden, dies zu tun. Irgendeiner Weise ich kann, damit es schneller geht? Abrufen der 2100 Zeilen aus der db dauert den Bruchteil einer Sekunde. Nicht sicher, warum die Manipulation in den Speicher nehmen würde, nicht mehr.
Hinweis: ExcelWriter ist unsere individuelle Klasse, aber alle seine Methoden sind direkt von der code in diesem link, http://msdn.microsoft.com/en-us/library/cc861607.aspx
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;
Du musst angemeldet sein, um einen Kommentar abzugeben.
So sieht es aus wie jemand Sie in der MSDN-community docs lief in ähnliche Auswirkungen auf die Leistung. Der code unten ist sehr ineffizient. Mir wurde empfohlen, eine hash-Tabelle.
Für unsere Lösung, die wir gerade entfernt haben, die Einfügung der shared strings zusammen und gingen von 1:03 Sekunden auf 0:03 Sekunden download-Zeit.
MSDN Docs (slow-Lösung, sollten Sie verwenden eine Hash-Tabelle statt)
@Internet
Beachten Sie, dass String-Datentyp ist eigentlich für die Formeln für text verwenden sollte InlineString.
Sehen 17.18.11 ST_CellType (Cell-Typ):
d.h., einen, der nicht in der shared Strings-Tabelle. Wenn diese Zelle Typ verwendet wird,
dann ist die Zelle Wert in der ist-element anstatt dem v-element in
die Zelle (c-element).
Die große Verbesserung ist mehr Save () - Funktion aus der Schleife
Für 500 Datensätze, für mich ist es ein Wechsel von 10 Minuten auf 1 min.
@kunjee
Wenn Sie wollen Leistung erstellen Sie alle erforderlichen Objekte im Voraus, so dass nicht überprüft bei jedem Aufruf dieser Methode. Dies ist der Grund, warum SharedStringTable übergeben wird als parameter anstelle von dem Teil.
Wörterbücher sind für die schnelle, indizierte lookup, haben eine bessere Leistung als eine for-Schleife. Sind bisschen schneller als hashtables, da sind stark typisiert, so ist nicht erforderlich-Boxen. Stark typisierte ist ein großer Vorteil sowieso.
Wie bereits erwähnt, durch Das Internet, Sie hätten einen Hashtable-und, wie vorgeschlagen, durch zquanghoangz die Sie haben sollten, verschoben die Save() aus der Schleife.
InlineString funktioniert, aber es gibt MS-Excel-Kopfschmerzen beim öffnen der erzeugten Datei mit sinnlose Fehlermeldungen, die repariert werden können, aber gibt noch ein nerviges pop-up.
Diese Lösung brachte der export-down Zeit von ~5 Minuten und 6 Sekunden auf eine [9880 x 66] grid.