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.




Datagrid von einem Silverlight Webpart Nach Excel exportieren

Unbeantwortet Dieser Beitrag hat 21 Antworten

Ohne Rang
27 Beiträge
basmati 1206 erstellt 2 Aug. 2011 14:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Community,

 

Ich habe einen Silverlight Webpart entwickelt, der unter anderen ein paar infos als Datagrid anzeigt.

Diese Datagrid würde ich gerne nachExcel exportieren (von Sharepoint aus).

Ich habe gelesen, dass man die Silverlight Anwendung Out of Browser (OOB) installieren muss und den Export durchzuführen. Leider in OOB kriege ich vonmeinem Webpart nix zu sehen. Was ist an meinem Konzept falsch. Der Export Code würde so ausehen:

 private void Excelbutton_Click(object sender, RoutedEventArgs e)
        {
          
            int rowIndex = 1;
            int coulmnIndex = 1;

            try
            {
                dynamic excel = AutomationFactory.CreateObject("Excel.Application");

                excel.workbooks.Add();

                dynamic sheet = excel.ActiveSheet;

                for (int i = 0; i < dataGrid1.Columns.Count; ++i)
                {
                    dynamic headerCell = sheet.Cells[rowIndex, coulmnIndex + i];
                    headerCell.Value = dataGrid1.Columns[i].Header;
                    headerCell.Font.Bold = true;
                    headerCell.Interior.Color = 0xFF00;
                }

                foreach (MitgliederVdek customer in dataGrid1.ItemsSource)
                {
                    rowIndex++;

                    //column 1
                    dynamic cellFirstName = sheet.Cells[rowIndex, 1];
                    cellFirstName.Value = customer.Ort;
                    cellFirstName.Font.Color = 003399;

                    //column 2
                    dynamic cellLastName = sheet.Cells[rowIndex, 2];
                    cellLastName.Value = customer.Vertragspartner;
                    cellLastName.Font.Color = 003399;

                    //column 3
                    dynamic cellAge = sheet.Cells[rowIndex, 3];
                    cellAge.Value = customer.Plz;
                    cellAge.Font.Color = 003399;
                }
                excel.Visible = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error generating excel: " + ex.Message);
            }
        }

 

Ich bedanke mich für jede Hilfe

Gruss

Basma

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 2 Aug. 2011 14:35
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Deine Methode arbeitet mit Objektautomatisierung und das funktioniert tatsächlich nur Out of Browser. OOB bekommst Du aber keine Verbindung zu SharePoint und deshalb mußt Du Dir etwas ganz anderes einfallen lassen.

Ich sehe drei grundsätzliche Möglichkeiten (in steigendem Schwierigkeitsgrad):

- von Silverlight aus Einfügen in die Zwischenablage. Dabei müssen Spalten durch Semikolon und Zeilen durch CrLf getrennt werden. Man kann dann in Excel einfach Strg-V drücken.

- eine von Excel lesbare XML-Datei erstellen, die dann mit Rechtsklick - Öffnen mit - Excel geöffnet werden muß.

- Eine "richtige" xlsx-Datei mit System.IO.Packaging erstellen

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 2 Aug. 2011 14:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also wir haben den Standard Excel Export von SharePoint mit Open XML erweitert. Das ging einigermaßen schnell und einfach.

Siehe z.B. hier:
http://stackoverflow.com/questions/1012547/creating-excel-document-with-openxml-sdk-2-0

oder hier:
http://blogs.msdn.com/b/chrisquon/archive/2009/07/22/creating-an-excel-spreadsheet-from-scratch-using-openxml.aspx

oder hier:
http://msdn.microsoft.com/en-us/library/dd452407(v=office.12).aspx

Sollte doch dann eigentlich auch per Silverlight gehen?

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 2 Aug. 2011 14:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Rückmeldung.

OOB Kann ich schon mal vergessen. Ich denke die Eleganteste Variante ist die dritte. Für den User soll es bequem sein :)

Einen schönen Tag wünsche ich.

 

Basma

Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 2 Aug. 2011 14:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

@Christian

 

Der Export soll nur über sharePoint statt finden.

 

sonnige grüße aus Casablanca

Basma

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 2 Aug. 2011 15:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was heisst "Nur über SharePoint"? Ihr wollt das Open XML SDK nicht verwenden?

Die oben beschrieben Methode funktioniert aus dem Browser heraus per Custom Action die in jeder SharePoint Liste unter "Aktionen" hängt. Der User klickt auf die Custom Action und es wird eine OpenXML-Datei erzeugt welcher per Response.Write als Stream ausgegeben wird.

Für mich ist das "Nur über SharePoint" - keine Clientsoftware o.ä. :-) 

Edit:
Quellcode sieht dann ca. so aus:

//Methodenaufruf um Export Daten zu sammeln
DataTable dataTable = GetExcelExportDataFromSharePointView(SPList list, SPView view);

//Methodeaufruf um OpenXMLDatei zusammenzustellen. Rückgabe als byte-Array
byte[] excelBinary = GetExcelSheet(dataTable);

//Response um User das Speichern zu ermöglichen
Response.Clear();
Response.Buffer = true
;
Response.AddHeader( "Content-Disposition" , "attachment;filename=Export.xlsx"
);
Response.ContentType =
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
;
Response.OutputStream.Write(excelBinary, 0, excelBinary.Length);
Response.Flush();
Response.End();

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 2 Aug. 2011 15:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

"Nur über SharePoint" ist gemeint für den Enduser. wie das intern implementiert ist egal. Neben der Datagrid in Sharepoint Webpart soll ein Button geben. Wenn man drauf klickt soll ein Excel sheet generiert werden.

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 2 Aug. 2011 16:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie gesagt, der Vorschlag von mir oben beschreibt unseren Ansatz wie wir das gelöst haben

- Daten aus Liste sammeln
- OpenXML-Dokument erzeugen und als byte-Array zurückgeben
- über Response.Write dem User eine Dwnload-Möglichkeit geben

Fachliche Anforderung:
- User wählt Listenansicht aus
- User definiert "Auto-Filter" in der Ansicht'
- User klickt auf "Aktionen" -> "Custom Excel Export" & bekommt die "Export.xlsx" zurück (Daten nur aus der gewählten Ansicht und Berücksichtigung der gewählten "Autofilter")

Wie das jetzt mit Silverlight ist, kann ich Dir nicht beantworten, da ich es dort noch nicht umgesetzt habe, aber wenn Du die Daten aus der Silverlight Anwendung bekommst, solltest Du die auch entsprechend umwandeln können.

Code um Open XML-Datei zu erzeugen - unterscheidet sich technisch ja kaum von deiner oben geposteten Lösung (beispielhaft aus übergebener DataTable):

 

byte [] excelSheet = null ; using ( MemoryStream fileStream = new MemoryStream ())
{
using ( SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument .Create(fileStream, SpreadsheetDocumentType
.Workbook))
{
WorkbookPart
workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook =
new Workbook(
);
WorksheetPart worksheetPart = workbookpart.AddNewPart< WorksheetPart
>();
worksheetPart.Worksheet =
new Worksheet ( new SheetData
());

 

// Add Sheets to the Workbook.
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild< Sheets >( new Sheets
());
Sheet sheet = new Sheet () { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = " View Sheet"
}; new Worksheet ( new SheetData ());
worksheetPart.Worksheet.Save();
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild< SheetData
>();
string [] columnHeaders = dataTable.Columns.Cast< DataColumn
>().Select(dc => dc.ColumnName).ToArray();
Row headerRow = CreateSheetRow(columnHeaders, 1);

for ( int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
{

//Eigene Methode zum Schreiben der Zeilen
Row
valueRow = CreateSheetRow(dataTable.Rows[rowIndex].ItemArray, rowIndex + 2);
sheetData.AppendChild(valueRow);
}
}
worksheetPart.Worksheet.Save();
}
excelSheet = fileStream.ToArray();
}

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 2 Aug. 2011 16:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für deine Ausführliche Antwort. Ich werde den Weg probieren

 

Beste Grüsse

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 2 Aug. 2011 16:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Problem, wie mir gerade auffällt (zumindest habe ich da keinen Ad-hoc Ansatz, dass das "Response.Write" ein HTTP-Response einer Webseite ist (wie oben gesagt Custom Application Page). Wie man da jetzt über ein "Button Click Event" rankommt wüsste ich jetzt nicht (mit sauberer Datenübergabe aus der Silverlight Anwendung, "Klick" -> "Custom Seite aufrufen" ansich ist ja kein Problem).

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 3 Aug. 2011 13:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

System.IO.Packaging befindet sich in der WindowsBase.dll. die kann man in der Silverlight Projekt nicht referenzieren. Wie meinst du die Lösung Eine "richtige" xlsx-Datei mit System.IO.Packaging erstellen??

 

Viele Grüsse

Basma

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Aug. 2011 14:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mit den Klassen aus System.IO.Packaging kann man die "neuen" Dateiformate wie docx und xlsx direkt erzeugen (ohne daß dazu ein installiertes Office benötigt wird). Ob die in Silverlight eingebunden werden können, habe ich jetzt aber nicht geprüft. Falls nicht bleibt Dir wahrscheinlich nur der Weg über OpenXML

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 3 Aug. 2011 15:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mein Silverlight Webpart hat kein eigenes Backend :) er basiert auf externelisten mit BCS. die Referenzen open XML, System.IO.Packaging usw.... kann man nicht clientseitig einbinden. Ich denke mir bleibt nix übrig als aus der Datagrid SP Listen zu erstellen und die in Excel zu öffnen.

Danke Andi für deine Unterstützung.

 

Gruss

Basma

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Aug. 2011 15:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die OpenXML-Dateien kannst Du in jedem Fall mit den "normalen" Methoden von Silverlight erzeugen. Schau Dir z.B. das an:
http://www.rshelby.com/post/exporting-data-from-silverilght-datagrid-to-excel.aspx

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 3 Aug. 2011 18:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Habe ich mir angeschaut und habe versucht

 SaveFileDialog sDialog = new SaveFileDialog();
            sDialog.Filter = "Excel Files(*.xls)|*.xls";
            if (sDialog.ShowDialog() == true)
            {

                          ...........

              }

 

leider bekomme ich direkt bei ShowDialog eine Exception {System.Security.SecurityException: Dialoge müssen vom Benutzer eingeleitet werden...........

Gruss

Basma

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Aug. 2011 07:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das klappt bei mir ausgezeichnet....

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 4 Aug. 2011 12:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann ist das eine Berechtigungsproblem von SharePoint :( Danke für die Hilfe

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Aug. 2011 12:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das hat mit SharePoint IMHO nichts zu tun. Scheint mir eher ein Problem mit Silverlight.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 4 Aug. 2011 12:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also wenn ich die SharePoint Seite auf dem Client ausführe dann klappt das wunderbar wenn ich es auf dem server ausführe kommt due Security Exception :) 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Aug. 2011 13:09
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann greifen da offenbar irgendwelche Sicherheitseinstellungen des Servers betreffs Silverlight bzw. betreffs Browser-Dateisystem-Interaktion). Da Deine Anwendung ja hauptsächlich auf einem normalen Client funktionieren soll, kannst Du das auch ignorieren - oder Dich später drum kümmern.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 4 Aug. 2011 14:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

genau so werde ich machen erstmals ignorieren;Danke nochmal für deine Unterstützung und eine schönen Tag wünsche ich.

Basma

Ohne Rang
27 Beiträge
basmati 1206 Als Antwort am 5 Aug. 2011 14:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Für die diejenigen die auch so ein Problem haben den Link hat mir sehr geholfen: http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=45731&av=60739

 

Viele Grüsse

Basma