SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Export CAML-Query-Result to Excel; best practises

Unbeantwortet Dieser Beitrag hat 9 Antworten

Ohne Rang
242 Beiträge
Peter Oswald erstellt 22 Apr. 2013 16:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich bräuchte mal wieder konzeptionellen Input. Aus einer SP-List wird per CAML-Query eine Datenmenge gewonnen. Dieses Abfrageresultat soll nun aber weiterverarbeitet werden können. Eine Forderung ist: Export to Excel.

Was mache ich da? Programmatisch ein Excel-Workbook erzeugen, dies in eine Bibliothek stopfen und zum Download "anregen"? Oder wie?

Vorschläge erbeten, die von mir dankbar entgegengenommen werden :-)

VG

P.

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 22 Apr. 2013 16:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Peter Oswald"]Programmatisch ein Excel-Workbook erzeugen, dies in eine Bibliothek stopfen und zum Download "anregen"? [/quote]

Genau so. Je nach Deinen Randbedingungen kannst Du die erzeugte Datei auch direkt an den Browser schicken (d.h. in den ResponseStream schreiben). Wenn Du es etwas einfacher haben möchtest, reicht vielleicht auch eine CSV-Datei.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
242 Beiträge
Peter Oswald Als Antwort am 26 Apr. 2013 13:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, habe es jetzt soweit, dass die Datei erzeugt wird. Aber das Schreiben in den ResponseStream bekomme ich nicht gebacken. Ich führe aus:

Responst.Redirect(<fileUrl>);

Da wird zwar die Datei aufgemacht (schön!), aber die Webseite, auf der der Download ausgelöst wurde, reagiert dann nicht mehr (unschön)...!?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Apr. 2013 13:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn Du die Datei ohnehin irgendwo spiecherst, kannst Du auch einfach einen Link darauf erzeugen (der dann optional auch in einem neuen Fenster aufgeht). Ansonsten solltest Du SPUtility.Redirect versuchen.

Ich dachte eigentlich, daß Du die Datei im Arbeitsspeicher erzeugst und direkt in den ResponseStream schreibst (ohne sie irgendwo zu speichern)...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
242 Beiträge
Peter Oswald Als Antwort am 29 Apr. 2013 09:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

besser wäre es schon, ohne Umweg über die Bibliothek, aber mir geht ja dann der Bezug zur Anwendung verloren. Was realisiert werden soll, ist eigentlich nur folgendes:

  1. User befindet sich in einer Website, verwendet ein bestimmtes Webpart
  2. User verwendet eine Schaltfläche in jenem Webpart, das eine Datei erzeugt und in einem anderen Fenster / Anwendung anzeigen soll
  3. User kann Website aus 1. weiter verwenden, nachdem die Datei angezeigt wurde

Nun scheitere ich entweder mit:

  • wenn ich direkt in den Response-Stream schreibe, wird die Datei im Browser angezeigt (was eher unpraktisch ist, da die tabellarischen Daten doch gleich im Excel oder zumindest als csv-Datei angezeigt werden sollen)
  • oder wenn ich die Datei in eine Bibliothek stopfe und den Pfad in den Response schreibe (egal ob per Response.Redirect oder SPUtitlity.Redirect) kann die Datei richtig heruntergeladen werden, geht auch im Excel auf, sofern installiert, aber hinterher ist das Webpart auf der Website tot und kann nicht mehr verwendet werden.

Gib mir doch bitte mal n Stück Code als Beispiel, damit ich sehen kann, wo meine Dummheit liegt.

Relevante Links:

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Apr. 2013 10:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Peter Oswald"]wenn ich direkt in den Response-Stream schreibe, wird die Datei im Browser angezeigt [/quote]

Da solltest Du noch den ContentType der Response ändern und evtl. einen Content-Disposition Header hinzufügen:
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("Content-Disposition", "attachment; filename=myFile.xlsx");

[quote user="Peter Oswald"]aber hinterher ist das Webpart auf der Website tot und kann nicht mehr verwendet werden[/quote]

Da wurde offenbar beim Redirect etwas falsch gemacht. Wahrscheinlich hilft es, die aktuelle Response abzubrechen (oder eben nicht). Bei Response.Redirect ist dafür der zweite (optionale) Parameter zuständig.

[quote user="Peter Oswald"]Gib mir doch bitte mal n Stück Code als Beispiel[/quote]

Ich habe nicht die Zeit etwas brauchbares zusammenzustellen. Aber wenn Du uns Deinen Code zeigst, kann man vielleicht sehen, wo man ihn verbessern könnte.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
242 Beiträge
Peter Oswald Als Antwort am 29 Apr. 2013 12:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]Ich habe nicht die Zeit etwas brauchbares zusammenzustellen. Aber wenn Du uns Deinen Code zeigst, kann man vielleicht sehen, wo man ihn verbessern könnte.

[/quote]

Nun, ja, viel mehr an Code als das, was wir schon besprochen haben, ist es ja nicht, aber gut; here u r:

protected void btnExportToExcel_Click(object sender, EventArgs e)
{
    DataTable tbl = (DataTable)GetData(...);
    if (tbl != null && tbl.Rows.Count > 0)
    {
     string path = FileHandler.CreateFileInLib(tbl);
     if (String.IsNullOrEmpty(path) == false)
     {
       Response.ContentType = "application/vnd.ms-excel";
       Response.AppendHeader("Content-Disposition", "attachment; filename=" + Globals.ExcelFileNameStatistics);
       Response.Redirect(path);
     }
    }
}

Stattt Response.... zu nehmen, hatte ich auch schon

SPUtility.Redirect(path, SPRedirectFlags.<<>>, System.Web.HttpContext.Current);

mit allen möglichen SPRedirectFlags versucht, aber die Schaltflächen auf der Ausgangsseite reagieren trotzdem nicht mehr...

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Apr. 2013 12:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da hast Du die beiden Möglichkeiten durcheinandergebracht ;-)

Entweder Du schreibst die Datei direkt in den ResponseStream (und ersetzt damit die aktuelle Seite), dann setzt Du auch ContentType und Content-Disposition. Oder Du speicherst die Datei rigendwo auf dem Server und machst dann einen Redirect darauf (was Du hier versuchst). Und genau das meinte ich oben mit dem zweiten Parameter von Response.Redirect.

Lasse also ContentType und AddHeader weg und versuche mal Redirect(path, false)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
242 Beiträge
Peter Oswald Als Antwort am 29 Apr. 2013 13:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ob mit oder ohne durcheinandergebracht - das Ergebnis ist leider das gleiche. Die Schaltflächen reagieren danach nicht und senden auch keinen Event mehr.

Und das ist eigentlich auch logisch, da ich ja mit dem aktuell gültigen Response-Objekt arbeite und damit den Bezug zur aktuellen Seite ändere. Hier müsste eine Lösung mit einem "frisch erzeugten" Response à la OpenWeb etc. her, denke ich.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Apr. 2013 14:09
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich kann aus der Ferne leider auch nicht sagen, was genau da schiefläuft, aber da Du den Code in einem Webpart hast, könntest Du dort auch einfach einen Link zum erzeugten Dokument anbieten. Der Link kann ein target="_blank" haben und damit ein neues Fenster öffnen. Du kannst auch JavaScript ausgeben lassen, das ein neues Fenster mit der URL zurm Dokument öffnet. Möglichkeiten gibt es viele...

Viele Grüße
Andi
af @ evocom de
Blog