我正在尝试为 SpreadsheetLight 构建一个包装器,该包装器从通过它的任何 .xlsx 文档返回一个 DataSet。但是,我似乎遇到了未将 DataRows 添加到临时 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 索引从 1 而不是 0 开始;
现在,我尝试用dt.Rows.Add()
,new object[stats.EndColumnIndex -1];
以及一个临时变量 from替换,var newRow = dt.NewRow();
然后将它们传递到 DataTable 中,但仍然得到相同的最终结果。行对象正确填充,但最后没有传输到 DataTable。
当您在运行时探索对象时,它会在相关属性中显示正确的行数和列数。但是当你在 DataVisualiser 中打开它时,你只能看到列,看不到行。
我一定遗漏了一些明显的东西。
更新
我遍历结果表并将值输出到控制台作为测试。出现所有正确的值,但可视化器保持为空:
我想现在的问题是,当 DataTable 中有有效数据时,为什么可视化器中没有数据?
更新 2 添加了完整的参考方法,包括一组简单的 for 循环,用于循环第一个 DataTable 中的所有行和列。注意:我还尝试将列创建拉出循环,甚至设置数据类型。没区别。注释代码显示原始代码。