当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的空:
我想现在的问题是,为什么会有在Visualiser的没有数据时,有DataTable中有效数据?
更新2 添加以供参考的全部方法中,包括一个简单的指令集,用于通过在所述第一数据表中的所有行和列的循环进行循环。注意:我还尝试将列创建从循环中取出,甚至设置数据类型。没有区别。评论代码显示原始。
好吧,事实证明,问题最有可能来自被添加的列。无论是可视化器处理的列数太多(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。如果有人知道对视觉器的任何限制,我全都是耳朵!
如果你打算低估一个问题,至少要有正当理由来解释为什么...... – Dezzamondo
你确定你在探索实际的DataTable吗?因为它好像你的DataTable不过是一个局部变量...... – MetaColon
在for循环结束时,DataTable被添加到DataSet中 – Dezzamondo