C# 读取表单C中的Excel文档时出错#

C# 读取表单C中的Excel文档时出错#,c#,excel,datagridview,C#,Excel,Datagridview,我试图获取XLSX数据,并使用ExcelDataReader NuGet包将其放入DataGridView。 但是我在第35行得到一个对象引用,它没有设置为对象错误的实例 foreach (DataTable dt in result.Tables) 这是完整的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dr

我试图获取XLSX数据,并使用ExcelDataReader NuGet包将其放入DataGridView。 但是我在第35行得到一个对象引用,它没有设置为对象错误的实例

foreach (DataTable dt in result.Tables)
这是完整的代码

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
using Excel;

namespace MyForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        DataSet result;

        private void butOpen_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    FileStream fs = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read);
                    IExcelDataReader reader = ExcelReaderFactory.CreateBinaryReader(fs);
                    reader.IsFirstRowAsColumnNames = true;
                    result = reader.AsDataSet();
                    cboSheet.Items.Clear();
                    foreach (DataTable dt in result.Tables)
                    cboSheet.Items.Add(dt.TableName);
                    reader.Close();

                }
            }

        }

        private void cboSheet_SelectedIndexChanged(object sender, EventArgs e)
        {
            dataGridView.DataSource = result.Tables[cboSheet.SelectedIndex];

        }
    }
}
以下是错误消息:
针对这些评论:

较新版本的软件包不再提供属性IsFirstRowAsColumnNames

从GitHub页面:

AsDataSet配置选项

函数的作用是:接受一个可选的配置对象 修改数据集转换的行为:

我猜这行
UseHeaderRow=trueExcelDataTAbleConfiguration
中的code>将导致想要的行为

编辑:添加工作示例

此示例适用于在Excel 2016中创建的新.xlsx文件。 该文件包含两张图纸:图纸1和图纸2。两者都包含两列和两行文本

List<string> tblNames = new List<string>();
OpenFileDialog ofd = new OpenFileDialog();

if (ofd.ShowDialog() ?? false)
{
    using (FileStream fs = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(fs))
        {
            var result = reader.AsDataSet(new ExcelDataSetConfiguration()
            {
                UseColumnDataType = true,

                ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                {                                
                    UseHeaderRow = true
                }
            });

            foreach (DataTable dt in result.Tables)
                tblNames.Add(dt.TableName);
        }
    }
}
List tblNames=new List();
OpenFileDialog ofd=新建OpenFileDialog();
if(ofd.ShowDialog()??false)
{
使用(FileStream fs=File.Open(ofd.FileName,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
{
使用(IExcelDataReader=ExcelReaderFactory.CreateReader(fs))
{
var result=reader.AsDataSet(新的ExcelDataSetConfiguration()
{
UseColumnDataType=true,
ConfigureDataTable=(tableReader)=>new ExcelDataTableConfiguration()
{                                
UseHeaderRow=true
}
});
foreach(result.Tables中的数据表dt)
tblNames.Add(dt.TableName);
}
}
}

这是一个WPF应用程序,因此OpenFileDialog的用法看起来有点不同。

回应评论:

较新版本的软件包不再提供属性IsFirstRowAsColumnNames

从GitHub页面:

AsDataSet配置选项

函数的作用是:接受一个可选的配置对象 修改数据集转换的行为:

我猜这行
UseHeaderRow=trueExcelDataTAbleConfiguration
中的code>将导致想要的行为

编辑:添加工作示例

此示例适用于在Excel 2016中创建的新.xlsx文件。 该文件包含两张图纸:图纸1和图纸2。两者都包含两列和两行文本

List<string> tblNames = new List<string>();
OpenFileDialog ofd = new OpenFileDialog();

if (ofd.ShowDialog() ?? false)
{
    using (FileStream fs = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(fs))
        {
            var result = reader.AsDataSet(new ExcelDataSetConfiguration()
            {
                UseColumnDataType = true,

                ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                {                                
                    UseHeaderRow = true
                }
            });

            foreach (DataTable dt in result.Tables)
                tblNames.Add(dt.TableName);
        }
    }
}
List tblNames=new List();
OpenFileDialog ofd=新建OpenFileDialog();
if(ofd.ShowDialog()??false)
{
使用(FileStream fs=File.Open(ofd.FileName,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
{
使用(IExcelDataReader=ExcelReaderFactory.CreateReader(fs))
{
var result=reader.AsDataSet(新的ExcelDataSetConfiguration()
{
UseColumnDataType=true,
ConfigureDataTable=(tableReader)=>new ExcelDataTableConfiguration()
{                                
UseHeaderRow=true
}
});
foreach(result.Tables中的数据表dt)
tblNames.Add(dt.TableName);
}
}
}

这是一个WPF应用程序,因此
OpenFileDialog
的用法看起来有点不同。

之所以出现错误,是因为
reader.AsDataSet()
返回null,并且您试图访问属性
result.Tables
。您是否有一个.xlsx文件的示例来测试这一点?您的数据集
结果
可能包含空内容。尝试调试并查看
结果的内容。还要尝试实例化为
DataSet result=new DataSet()
这似乎是较新的.xlsx文件的问题。IExcelDataREader对象包含一条错误消息,指示文件签名存在问题。当我将包更新到最新的预发布版本(v3.0.0-develop0086)并添加包
ExcelDataREader.DataSet
(现在需要使用
AsDataSet()
扩展方法)我能够读取xlsx文件并访问数据集中的表。所以你是说我需要更新NuGet软件包?最新版本是预发布的。如果您愿意在生产环境中使用显式标记为prerelease的包,是的,这将是一个选项。否则,您将不得不等待包的“完成”版本,或者找到另一个完全避免nuget包的解决方案。之所以会出现错误,是因为
reader.AsDataSet()
返回null,并且您正在尝试访问属性
result.Tables
。您是否有一个.xlsx文件的示例来测试这一点?您的数据集
结果
可能包含空内容。尝试调试并查看
结果的内容。还要尝试实例化为
DataSet result=new DataSet()
这似乎是较新的.xlsx文件的问题。IExcelDataREader对象包含一条错误消息,指示文件签名存在问题。当我将包更新到最新的预发布版本(v3.0.0-develop0086)并添加包
ExcelDataREader.DataSet
(现在需要使用
AsDataSet()
扩展方法)我能够读取xlsx文件并访问数据集中的表。所以你是说我需要更新NuGet软件包?最新版本是预发布的。如果您愿意在生产环境中使用显式标记为prerelease的包,是的,这将是一个选项。否则,您将不得不等待包的“完成”版本,或者找到另一个完全避免nuget包的解决方案