OpenFileDialog无法加载CSV文件但可以加载xls / xlsx Excel文件[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

在我的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'";
    }

仍然得到相同的错误。

c# excel winforms csv openfiledialog
1个回答
1
投票

关于报告的错误:

System.NullReferenceException:'对象引用未设置为对象的实例。' sConnectionString为null。

生成异常是因为Connection字符串声明为:

public string sConnectionString;

因为它从未初始化,因为连接字符串的初始化仅针对某些文件类型执行,但不是针对OpenFileDialog.Filter中包含的所有文件类型。当代码测试字符串的长度时,字符串仍然是null。这可以避免设置初始值:

public string sConnectionString = string.Empty;

关于使用qazxsw poi打开qazxsw poi文件所需的连接字符串:

  • 所有OleDb提供商都会这样做: .CSV OleDbConnection Microsoft.Jet.OLEDB.4.0
  • 如果某些遗留格式(旧的Access Microsoft.ACE.OLEDB.12.0文件)需要Microsoft.ACE.OLEDB.16.0,则必须将应用程序编译为32Bit,因此请安装其他提供程序的相应32位版本: Microsoft.Jet.OLEDB.4.0 .mdb

要读取CSV文件,连接字符串(适用于所有提供者)的组成如下:

Microsoft Database Engine 2010 Redistributable

哪里:

  • Microsoft Database Engine 2016 Redistributable OleDb供应商之一。他们中的任何一个都会。
  • {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.ini
  • 由于Catalog是目录名称(将其视为数据库),因此要在查询中指定要打开的文件的文件名: [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
© www.soinside.com 2019 - 2024. All rights reserved.