当DataTable中存在有效数据时,为什么可视化器中没有数据?

问题描述:

我想为SpreadsheetLight构建一个包装器,它从任何通过它传递的.xlsx文档中返回一个DataSet。但是,我似乎遇到了DataRows没有被添加到临时DataTable的问题。当DataTable中存在有效数据时,为什么可视化器中没有数据?

下面是解析工作表,并生成从它的DataTable代码的一部分:

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; 
     } 
    } 

注:SpreadsheetLight indicies从1而不是0开始;现在

,我已经试过更换dt.Rows.Add()new object[stats.EndColumnIndex -1];,以及来自var newRow = dt.NewRow();一个临时变量,然后把它们传递到数据表之后,但仍得到相同的最终结果。行对象正确填充,但不会在最后传输到DataTable。

在运行时浏览对象时,它会在相关属性中显示正确的行数和列数。但是,当您在DataVisualiser中打开它时,您只能看到列,没有行。

我必须错过一些明显的东西。

更新

我通过所得到的表与输出的值循环到控制台作为测试。所有正确的价值观出现,但仍然Visualiser的空: enter image description here

我想现在的问题是,为什么会有在Visualiser的没有数据时,有DataTable中有效数据?

更新2 添加以供参考的全部方法中,包括一个简单的指令集,用于通过在所述第一数据表中的所有行和列的循环进行循环。注意:我还尝试将列创建从循环中取出,甚至设置数据类型。没有区别。评论代码显示原始。

+0

如果你打算低估一个问题,至少要有正当理由来解释为什么...... – Dezzamondo

+0

你确定你在探索实际的DataTable吗?因为它好像你的DataTable不过是一个局部变量...... – MetaColon

+0

在for循环结束时,DataTable被添加到DataSet中 – Dezzamondo

好吧,事实证明,问题最有可能来自被添加的列。无论是可视化器处理的列数太多(1024),我都觉得很难相信,或者视觉工作室中有一个随机纠正自己的错误。

SpreadsheetLight中还存在一个错误,当您调用GetWorksheetStatistics()时,它将所有列都列为数据。所以我使用了一种解决方法,它使用可用总单元的最大数量或stats.NumberOfColumns中最小的一个。

无论哪种方式,下面的代码现在起作用。

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; 
    } 
} 

希望别人认为这为今后一个有用的参考,无论是SpreadsheetLight或DataVisualiser在Visual Studio。如果有人知道对视觉器的任何限制,我全都是耳朵!