C# 当DataTable中有有效数据时,为什么visualiser中没有数据?

C# 当DataTable中有有效数据时,为什么visualiser中没有数据?,c#,datatable,datarow,spreadsheetlight,C#,Datatable,Datarow,Spreadsheetlight,我正在尝试为SpreadsheetLight构建一个包装器,它从通过它的任何.xlsx文档返回一个数据集。然而,我似乎在没有将数据行添加到临时数据表中时遇到了问题 下面是解析工作表并从中生成DataTable的部分代码: public DataSet ReadToDataSet(string fileName) { using (var wb = new SLDocument(fileName)) { var set =

我正在尝试为SpreadsheetLight构建一个包装器,它从通过它的任何.xlsx文档返回一个数据集。然而,我似乎在没有将数据行添加到临时数据表中时遇到了问题

下面是解析工作表并从中生成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;
        }
    }
公共数据集ReadToDataSet(字符串文件名)
{
使用(var wb=new SLDocument(文件名))
{
var set=新的数据集(generateTile(wb.DocumentProperties.Title));
foreach(wb.GetWorksheetNames()中的wsvar name)
{
var ws=wb.SelectWorksheet(wsName);
//选择工作表返回bool,因此如果返回false,请尝试下一个工作表。
如果(!ws)继续;
//统计信息给出第一个和最后一个数据单元的索引
var stats=wb.GetWorksheetStatistics();
//为每个工作表创建一个新的数据表
var dt=新数据表(wsName);
//var addDataColumns=true;
对于(var colIdx=stats.StartColumnIndex;colIdx=stats.EndColumnIndex)
//addDataColumns=false;
}
dt.Rows.Add(newRow);
}
集合。表格。添加(dt);
}
//调试输出
foreach(集合中的DataRow行。表[0]。行)
{
foreach(row.ItemArray中的变量输出)
{
Console.WriteLine(output.ToString());
}
}
返回集;
}
}
注:电子表格指示灯从1开始,而不是从0开始

现在,我尝试用新对象[stats.EndColumnIndex-1]替换
dt.Rows.Add()
,以及来自
var newRow=dt.newRow()的临时变量
在运行时浏览对象时,它会在相关属性中显示正确的行数和列数。但是当您在DataVisualiser中打开它时,您只能看到列,而不能看到行

我一定错过了什么明显的东西

更新

我循环遍历生成的表,并将值作为测试输出到控制台。显示所有正确的值,但visualiser仍为空:

我想现在的问题是,当数据表中有有效数据时,为什么可视化程序中没有数据

更新2
添加了完整的方法供参考,包括一组简单的for循环,以循环第一个数据表中的所有行和列。注意:我还尝试过将列创建从循环中拉出来,甚至设置数据类型。没什么区别。注释后的代码显示了原始代码。

好的,问题很可能是添加的列造成的。要么是visualiser无法处理太多的列(1024个),这让我很难相信,要么是VisualStudio中存在一个随机更正的错误

SpreadsheetLight中还有一个bug,当您调用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;
    }
}
公共数据集ReadToDataSet(字符串文件名)
{
使用(var wb=new SLDocument(文件名))
{
var set=新的数据集(generateTile(wb.DocumentProperties.Title));
foreach(wb.GetWorksheetNames()中的wsvar name)
{
var ws=wb.SelectWorksheet(wsName);
//选择工作表返回bool,因此如果返回false,请尝试下一个工作表。
如果(!ws)继续;
//统计信息给出第一个和最后一个数据单元的索引
var stats=wb.GetWorksheetStatistics();
//统计列有一个bug。获取可用元素的总数或统计表中的列,以最小的为准
var newColumnIndex=stats.NumberOfCells