2009-05-05 12 views
2

Ich habe eine riesige IQueryable, die ich direkt nach Excel für Daten-Dumps exportieren möchte, wie würde ich das tun?Exportieren einer IQueryable-Sammlung nach Excel

Ich habe versucht, es in ein GridView zu setzen und von dort zu exportieren, was funktioniert, wenn ich nur einen Teil der Daten verwende, aber wenn ich das ganze IQueryable benutze, passiert nichts.

Dies ist eine Tabelle mit 4k Zeilen und jede Zeile hat 70 oder so Spalten.

Bearbeiten: CSV-Datei wird auch gut, wenn das einfacher ist!

Antwort

2

Warum nicht die Datei direkt schreiben? Verwenden Sie foreach auf der IQueryable, und schreiben Sie eine CSV-Datei Zeile für Zeile.

+0

Ich möchte nicht, dies zu tun, da das Objekt so groß ist, und kann ich möchte nicht manuell jede Eigenschaft ändern tippen - ist es eine Möglichkeit, eine Schleife durch die Eigenschaften eines generischen Objekt? – naspinski

+0

Rufen Sie obj.GetType() auf. GetProperties (BindingFlags.Public | BindingFlags.Instance), rufen Sie dann GetValue für jede Eigenschaft auf. –

1

CSV ist möglicherweise nicht die beste Lösung. Ich arbeite die ganze Zeit mit sehr großen Datensätzen und verwende eine ähnliche Funktion. Ich gehe davon aus, wenn es IQueryable ist, ist es auch IEnumerable. Hier ist der Beispielcode, mach was du willst. Wenn das Trennzeichen "," ist, wird eine CSV-Datei ausgegeben, und wenn das Trennzeichen ein "\ t" ist, geben Sie eine Excel-lesbare Datei aus. In beiden Fällen müssen Sie etwas Ähnliches tun, um einen einzeiligen Header auszugeben, der die Spaltentitel enthält, bevor Sie diese Methode zur Ausgabe der Daten ausführen.

//This is changed slightly from my actual code but it should give you an idea of what to do 
//tickStorage contains a dictionary named MessageData and the key is the column name 
//Obviously tickStorage is what is being directly mapped to my listView component 

private void OutputItems(StreamWriter writer, int startIndex, int endIndex, String delimiter) 
{ 
    endIndex = endIndex < tickStorage.Count ? endIndex : tickStorage.Count; 
    for (Int32 i = startIndex; i < endIndex; i++) 
    { 
    IEnumerator<Columns> fields = listView.ColumnsInDisplayOrder.GetEnumerator(); 
    fields.MoveNext(); 
    writer.Write((tickStorage[i].MessageData[fields.Current.Text]).Trim()); 
    while (fields.MoveNext()) 
    { 
     writer.Write(delimiter + (tickStorage[i].MessageData[fields.Current.Text]).Trim()); 
    } 
    writer.WriteLine(); 
    } 
} 
Verwandte Themen