这个问题在这里已有答案:
在我的Windows窗体应用程序中加载Excel文件时,我可以正常加载.xls
和.xlsx
格式,但是当我选择.CSV
时,我收到以下错误:
System.NullReferenceException:'对象引用未设置为对象的实例。' sConnectionString为null。
错误发生在该行:
if (sConnectionString.Length > 0)
从完整的代码部分:
public string sConnectionString;
public void FillData()
{
if (sConnectionString.Length > 0)
{
OleDbConnection cn = new OleDbConnection(sConnectionString);
{
cn.Open();
DataTable dt = new DataTable();
OleDbDataAdapter Adpt = new OleDbDataAdapter("select * from [sheet1$]", cn);
Adpt.Fill(dt);
dataGridView1.DataSource = dt;
}
}
}
这是在Button代码之前:
private void Browse_Click(object sender, EventArgs e)
{
OpenFileDialog op = new OpenFileDialog();
op.InitialDirectory = @"C:\";
op.Title = "Browse Excel Files";
op.CheckFileExists = true;
op.CheckPathExists = true;
op.DefaultExt = "csv";
op.Filter = "CSV Files (*.csv)|*.csv";
op.FilterIndex = 2;
op.RestoreDirectory = true;
op.ReadOnlyChecked = true;
op.ShowReadOnly = true;
if (op.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if (File.Exists(op.FileName))
{
string[] Arr = null;
Arr = op.FileName.Split('.');
if (Arr.Length > 0)
{
if (Arr[Arr.Length - 1] == "xls")
sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
op.FileName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
}
else if (Arr[Arr.Length - 1] == "xlsx")
{
sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + op.FileName + ";Extended Properties='Excel 12.0 Xml;HDR=YES';";
}
}
FillData();
fileTextBox.Text = op.FileName;
}
}
编辑
添加:
else if (Arr[Arr.Length - 1] == "csv")
{
sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + op.FileName +
";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
}
仍然得到相同的错误。
关于报告的错误:
System.NullReferenceException:'对象引用未设置为对象的实例。' sConnectionString为null。
生成异常是因为Connection字符串声明为:
public string sConnectionString;
因为它从未初始化,因为连接字符串的初始化仅针对某些文件类型执行,但不是针对OpenFileDialog.Filter
中包含的所有文件类型。当代码测试字符串的长度时,字符串仍然是null
。这可以避免设置初始值:
public string sConnectionString = string.Empty;
关于使用qazxsw poi打开qazxsw poi文件所需的连接字符串:
.CSV
OleDbConnection
Microsoft.Jet.OLEDB.4.0
Microsoft.ACE.OLEDB.12.0
文件)需要Microsoft.ACE.OLEDB.16.0
,则必须将应用程序编译为32Bit,因此请安装其他提供程序的相应32位版本:
Microsoft.Jet.OLEDB.4.0
.mdb
要读取CSV文件,连接字符串(适用于所有提供者)的组成如下:
Microsoft Database Engine 2010 Redistributable
哪里:
{Provider};Data Source={Catalog}; Extended Properties="text; HDR=Yes; IMEX=1; FMT=Delimited;
包含要打开的文件的目录。{Provider} =>
{Catalog} =>
文件包含一个标题:如果HDR=Yes/No =>
,标题是文件的第一行CSV
导入/导出模式设置为1(导出模式= 0;导入模式= 1,链接模式= 2),忽略数值并仅使用字符串。这里实际上并不相关。最好保留它,作为一般帮助(如果文件中没有标题和Yes
)。IMEX=1 =>
文件格式:分隔。标题/字段由分隔符分隔。公认的分隔符是逗号(HDR=Yes
)。此设置可能取决于系统(第3部分应用程序可能已根据自身的需要修改了注册表)。要指定与默认值不同的分隔符(FMT=Delimited =>
中的,
表示逗号),C
文件夹中必须有一个CSV
文件,用于定义特定文件的特定分隔符:
Schema.iniCatalog
是目录名称(将其视为数据库),因此要在查询中指定要打开的文件的文件名:
[MyFile.csv]
Format=Delimited(;)
使用Data Source
作为提供者的示例连接字符串:
SELECT * FROM MyFile.csv
有关其他可用的连接字符串格式,请参阅Microsoft.ACE.OLEDB.12.0
网站
用于测试结果的示例代码(在本例中使用string connectionString = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dirName};" +
"Extended Properties=\"text; HDR=Yes; IMEX=1; FMT=Delimited\";";
):
The Connection Strings Reference