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.




SharePoint CSV Export mit Timerjob Visual Studio ???

Geprüfte Antwort Dieser Beitrag hat 8 Antworten

Ohne Rang
302 Beiträge
Ardenda erstellt 7 Nov. 2013 22:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

möchte per TimerJob einen Export aus einer Liste in eine CSV machen. Hat mir da jemand ein Code-Beispiel? 

Komme da nicht wirklich weiter mit meiner Abfrage und wie ich die Werte dann in eine CSV hinzufüge. 

 

Hier mal mein Versuch:

 public void ExportItemInSharePoint()

{

SPQuery query = new SPQuery();

            query.Query = "<<Where><Eq><FieldRef Name ='{0}' /><Value Type='{1}'>{2}</Value></Eq </Where>";

 

            if (destinationList.Items.Count > 0)

            {

                //Fetch item from the User List by passing query to the User List

                SPListItemCollection exportItemColl = destinationList.GetItems(query);

 

                if (exportItemColl.Count > 0)

                {

                    //If record found in the list

 

                    for (int icount = 0; icount < exportItemColl.Count; icount++)

                    {

                        SPListItem listItem = exportItemColl[icount];

 

                      //  Und nun weiß ich nicht mehr weiter

                        }

// Hier müsste mein zu erstellende CSV rein

                    }

 }

                }

            }

 

Wäre super wenn mir jemand etwas hätte und sagt wie ich hier weiterbauen muss um einen CSV-Export zu generieren.

 

Vielen Dank im Vorraus


Gruß

 

Ardenda

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Nov. 2013 08:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wo genau klemmt's denn? Einfach nur beim Schreiben in eine Datei? Da könnte das helfen: http://www.codeproject.com/Articles/415732/Reading-and-Writing-CSV-Files-in-Csharp

PS: die beiden Bedingungen (if items.Count > 0) kannst Du Dir komplett sparen, weil Du sowieso hinterher per Schleife die Elemente durchgehst. Wenn es keine gibt, wir d einfach die Schleife nie durchlaufen. Insbesondere mit SPList.Items muß man sehr vorsichtig sein. Das holt bei jedem Zugriff alle Elemente der Liste aus der Datenbank.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 11 Nov. 2013 15:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Irgendwie zerhaut es mir hier meine Posts. Hier nochmals:

 

 

Hi Andi,

danke für die Hilfe. Kannst du mir noch sagen wie ich sagen kann welche Spalten in einer Zeile exportiert werden? Aktuell klatscht es alles untereinander.

Hier mein Code:

      public void ExporItemFromSharePoint(string exportCAML)
        {
            // Filepath
                string exportFolder = @"C:\exports\";
                string exportFileName = "Export_File.csv";

            //Query from "CAML" field in Configlist
                SPQuery exportquery = new SPQuery();
                exportquery.Query = string.Format("" + exportCAML + "");
            //Get SPFieldname from CSV Mapping File
 //Fetch item from the User List by passing query to the User List
                SPListItemCollection exportItemColl = destinationList.GetItems(exportquery);
                using (StreamWriter writer = new StreamWriter(exportFolder + exportFileName))
          
            // Write each line from Query in CSV
                if (exportItemColl.Count > 0)
                {
                    //If record found in the list

                    for (int icount = 0; icount < exportItemColl.Count; icount++)
                    {
                        SPListItem listItem = exportItemColl[icount];
                           
                            writer.WriteLine(SPEncode.HtmlEncode(listItem["Path"].ToString()) + ";");
                    }
                   
                }
        }

Ich möchte ungern sowas hier machen:

 

SPEncode.HtmlEncode(listItem["Feld1"].ToString()) + ";" + SPEncode.HtmlEncode(listItem["Feld2"].ToString()) + SPEncode.HtmlEncode(listItem["Feld3"].ToString()));

Habe mir mal eine TXT Datei erstellt die wow folgt aussieht:

SPSpalte1,

 

 

SPSpalte2,

 

SPSpalte3,
etc.
Frage:
Wie bekomme ich es dynamisch hin alle Spalten in einer Zeile reinzukopieren und dann die nächste Zeile zu beginnen. Möchte das gern dynamisch.

writer.WriteLine(

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 11 Nov. 2013 16:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

hab es hinbekommen. Leider bekomme ich beim Export von Benutzefelder ein Format. Wie kann ich sagen, dass ich bei "People and Groups" Felder das format wie folgt aussieht:

Domain\Benutzername

Aktuell ist das so:

ID;#Domain\Benutzername

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Nov. 2013 11:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du verwendest wahrschein einfach ein item["Feld"].ToString()

Im Grunde solltest Du die meisten Feldtypen jeweils separat behandeln. Denke dabei auch an Zahlen- und Datumsfelder. Wenn Du den Text so haben möchtest, wie er innerhalb von SharePoint dargestellt wird, kannst Du für alle Felder SPField.GetFieldValueAsText() verwenden. Wenn Du es individuell haben möchtest, kannst Du den jeweils zum Feld passenden Typ verwenden. Bei Personenfeldern ist das SPFieldUserValue:

SPFieldUserValue value = new SPFieldUserValue(web, item["Feld"].ToString());

SPFieldUserValue hat eine User-Eigenschaft, die Dir direkt den ausgewählten SPUser mit Login, E-Mail, Anzeigename usw. liefert.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 13 Nov. 2013 16:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

 

danke für deinen Tipp. Hab das nun so entsprechend umgesetzt. Nun hätte ich ein anderes Problem. Ich habe eine Generic list, die aber nicht mit Komma seperiert ist sondern mit Semikolon.

Mein Problem ist, dass in den Spalteninhalten auch Kommazeichen drin sein könnten, weswegen ich nicht sagen kann replace semikolon durch kommazeichen.

Kannst du mir sagen wie ich das einlesen kann mit einer Generic List?

Hier mal mein Code:

 

  public static void startCsvImportMain(string sasstringCsvImportPath, string destinationUrl, string configListName, string importtyp, string strMappingFilePath, string stringDelete, string destinationListName, string ConfiglistURL, string stringMove,string stringMoveDestination,string exportCAML, string exportPath)
        {
            SPSite siteconfig = default(SPSite);
            SPSite site = default(SPSite);

            SPWeb web = default(SPWeb);
            SPWeb webconfig = default(SPWeb);


            siteconfig = new SPSite(ConfiglistURL);
            webconfig = siteconfig.OpenWeb();

            site = new SPSite(destinationUrl);
            web = site.OpenWeb();


            List<String> listImportCsvFiles = new List<string>();
            try
            {
                if (importtyp != "Export")
                {
                  
                    // get the file attributes for file or directory
                    SPFile spfile = web.GetFile(sasstringCsvImportPath);

                    listImportCsvFiles.Add(sasstringCsvImportPath);

                   
                    foreach (String csvImportFilePath in listImportCsvFiles)
                    {
                        startCsvImportForThisFile(sasstringCsvImportPath, destinationUrl, configListName, importtyp, strMappingFilePath, stringDelete, destinationListName, ConfiglistURL, stringMove, stringMoveDestination, exportCAML, exportPath);
                    }
                }
                    else
                    {
                        startCsvImportForThisFile(sasstringCsvImportPath, destinationUrl, configListName, importtyp, strMappingFilePath, stringDelete, destinationListName, ConfiglistURL, stringMove, stringMoveDestination, exportCAML, exportPath);
                    }

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 13 Nov. 2013 16:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn die Felder der CSV-Datei durch Semikolon getrennt sind, dann ist doch ein Komma in den Werten überhaupt kein Problem. Oder verstehe ich da was falsch?

Wie auch immer: Du kannst das nicht nachträglich behandeln, sondern mußt gleich beim Schreiben eines einzelnen Feldwerts alle ungültigen Zeichen entfernen (oder durch harmlose ersetzen). Denke dabei auch an Zeilenumbrüche, die es bei mehrzeiligen Textfeldern geben kann.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
302 Beiträge
Ardenda Als Antwort am 13 Nov. 2013 16:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok wenn das kein problem ist. aber warum zum Teufel kann ich keine Seminikolon seperated List in eine Generic laden? Wenn die mit Komma getrennt ist gehts komischerweise.

Ohne Rang
302 Beiträge
Ardenda Als Antwort am 13 Nov. 2013 16:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

 

vielen Dank für die Hilfe. Habe mein Fehler gefunden. An jeder Spalte muss am Ende  ein Semikolon stehen dann klappts.