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:
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.
Wenn Sie eine Frage downvote, zumindest die Anständigkeit zu erklären, warum ... – Dezzamondo
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
Am Ende der for-Schleife wird die DataTable zu einem DataSet hinzugefügt – Dezzamondo