2017-04-11 6 views
-1

Ich versuche, einen Wrapper für SpreadsheetLight zu erstellen, der ein DataSet von einem beliebigen xsx-Dokument zurückgibt, das durch es übergeben wurde. Ich habe jedoch ein Problem mit DataRows, die nicht zu einer temporären DataTable hinzugefügt werden.Warum gibt es im Visualizer keine Daten, wenn gültige Daten in der DataTable vorhanden sind?

Hier ist ein Teil des Codes, der ein Arbeitsblatt analysiert und erzeugt eine Datentabelle von ihm:

public DataSet ReadToDataSet(string fileName) 
    { 

     using (var wb = new SLDocument(fileName)) 
     { 
      var set = new DataSet(GenerateTitle(wb.DocumentProperties.Title)); 

      foreach (var wsName in wb.GetWorksheetNames()) 
      { 

       var ws = wb.SelectWorksheet(wsName); 

       // Select worksheet returns a bool, so if it comes back false, try the next worksheet instead. 
       if (!ws) continue; 

       // Statistics gives indecies of the first and last data cells 
       var stats = wb.GetWorksheetStatistics(); 

       // Create a new DataTable for each worksheet 
       var dt = new DataTable(wsName); 

       //var addDataColumns = true; 

       for (var colIdx = stats.StartColumnIndex; colIdx < stats.EndColumnIndex; colIdx++) 
        dt.Columns.Add(colIdx.ToString(), typeof(string)); 


       // Scan each row 
       for (var rowIdx = stats.StartRowIndex; rowIdx < stats.EndRowIndex; rowIdx++) 
       { 
        //dt.Rows.Add(); 

        var newRow = dt.NewRow(); 

        // And each column for data 
        for (var colIdx = stats.StartColumnIndex; colIdx < stats.EndColumnIndex; colIdx++) 
        { 
         //if (addDataColumns) 
         // dt.Columns.Add(); 

         newRow[colIdx - 1] = wb.GetCellValueAsString(rowIdx, colIdx); 

         //if (colIdx >= stats.EndColumnIndex) 
         // addDataColumns = false; 
        } 
        dt.Rows.Add(newRow); 
       } 

       set.Tables.Add(dt); 
      } 

      // Debug output 
      foreach (DataRow row in set.Tables[0].Rows) 
      { 
       foreach (var output in row.ItemArray) 
       { 
        Console.WriteLine(output.ToString()); 
       } 
      } 

      return set; 
     } 
    } 

Hinweis: SpreadsheetLight indicies von 1 beginnen statt 0;

Jetzt habe ich versucht, dt.Rows.Add() mit new object[stats.EndColumnIndex -1]; ersetzt, sowie eine temporäre Variable aus var newRow = dt.NewRow(); und sie dann in die Datatable vorbei danach, aber immer noch das gleiche Endergebnis bekommen. Die Zeilenobjekte werden korrekt ausgefüllt, aber am Ende werden sie nicht in die DataTable übertragen.

Wenn Sie das Objekt zur Laufzeit untersuchen, wird die korrekte Anzahl der Zeilen und Spalten in den relevanten Eigenschaften angezeigt. Aber wenn Sie es im DataVisualizer öffnen, können Sie nur die Spalten sehen, keine Zeilen.

Ich muss etwas offensichtlich fehlen.

aktualisieren

I geschleift durch die resultierende Tabelle und Ausgabe der Werte auf der Konsole als Test. Alle richtigen Werte erscheinen, aber die visualiser bleibt leer: enter image description here

ich die Frage erraten ist jetzt, warum sollte es keine Daten in der visualiser sein, wenn es gültige Daten in der Datentabelle ist?

Update 2 hinzugefügt, durch die Methode als Referenz, in der ersten Datentabelle eines einfachen Satz von Schleifen für eine Schleife durch alle Zeilen und Spalten enthält. Hinweis: Ich habe auch damit experimentiert, die Spaltenerstellung aus der Schleife zu entfernen und sogar die Datentypen zu setzen. Machte keinen Unterschied. Der kommentierte Code zeigt das Original.

+0

Wenn Sie eine Frage downvote, zumindest die Anständigkeit zu erklären, warum ... – Dezzamondo

+0

Sind Sie sicher, dass Sie die tatsächliche DataTable erkunden? Weil es so aussieht, als wäre Ihre DataTable nicht mehr als eine lokale Variable ... – MetaColon

+0

Am Ende der for-Schleife wird die DataTable zu einem DataSet hinzugefügt – Dezzamondo

Antwort

0

Ok, stellt sich heraus, dass das Problem wahrscheinlich von den Spalten hinzugefügt wurde. Entweder gab es zu viele Spalten für den Visualisierer (1024), was ich kaum glauben kann, oder es gab einen Fehler im visuellen Studio, der sich zufällig selbst korrigiert hat.

Es gibt auch einen Fehler in SpreadsheetLight, der alle Spalten mit Daten auflistet, wenn Sie GetWorksheetStatistics() aufrufen; Daher habe ich eine Problemumgehung verwendet, bei der die maximale Anzahl der insgesamt verfügbaren Zellen ODER die stats.NumberOfColumns verwendet wird, je nachdem, welcher Wert der kleinste ist.

Wie auch immer, der folgende Code funktioniert jetzt.

public DataSet ReadToDataSet(string fileName) 
{ 

    using (var wb = new SLDocument(fileName)) 
    { 
     var set = new DataSet(GenerateTitle(wb.DocumentProperties.Title)); 

     foreach (var wsName in wb.GetWorksheetNames()) 
     { 

      var ws = wb.SelectWorksheet(wsName); 

      // Select worksheet returns a bool, so if it comes back false, try the next worksheet instead. 
      if (!ws) continue; 

      // Statistics gives indecies of the first and last data cells 
      var stats = wb.GetWorksheetStatistics(); 

      // There is a bug with the stats columns. Take the total number of elements available or the columns from the stats table, whichever is the smallest 
      var newColumnIndex = stats.NumberOfCells < stats.NumberOfColumns 
           ? stats.NumberOfCells 
           : stats.NumberOfColumns; 

      // Create a new DataTable for each worksheet 
      var dt = new DataTable(wsName); 

      var addDataColumns = true; 

      // Scan each row 
      for (var rowIdx = stats.StartRowIndex; rowIdx < stats.EndRowIndex; rowIdx++) 
      { 

       var newRow = dt.NewRow(); 

       // And each column for data 
       for (var colIdx = stats.StartColumnIndex; colIdx < newColumnIndex; colIdx++) 
       { 
        if (addDataColumns) 
         dt.Columns.Add(); 

        newRow[colIdx - 1] = wb.GetCellValueAsString(rowIdx, colIdx); 

       } 

       addDataColumns = false; 

       dt.Rows.Add(newRow); 
      } 

      set.Tables.Add(dt); 
     } 

     return set; 
    } 
} 

Hoffentlich jemand anderes findet diese als nützliche Referenz in Zukunft entweder für SpreadsheetLight oder DataVisualiser in Visual Studio. Wenn jemand irgendwelche Grenzen für den Visualisierer kennt, bin ich ganz Ohr!

Verwandte Themen