C# 读取表单C中的Excel文档时出错#
我试图获取XLSX数据,并使用ExcelDataReader NuGet包将其放入DataGridView。 但是我在第35行得到一个对象引用,它没有设置为对象错误的实例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
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包的解决方案