gpt4 book ai didi

c# - OpenFileDialog 无法加载 CSV 文件但可以加载 xls/xlsx Excel 文件

转载 作者:行者123 更新时间:2023-12-04 20:09:51 25 4
gpt4 key购买 nike

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





What is a NullReferenceException, and how do I fix it?

(27 个回答)


3年前关闭。




在我的 Windows 窗体应用程序中加载 Excel 文件时,我可以加载 .xls.xlsx格式很好,但是当我选择 .CSV我收到以下错误:

System.NullReferenceException: 'Object reference not set to an instance of an object.' sConnectionString was 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;
}
}
}

在按钮代码之前:
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: Object reference not set to aninstance of an object. sConnectionString was null.


生成异常是因为 Connection 字符串声明为:
public string sConnectionString;
因为它从未初始化,因为 Connection 字符串的初始化仅对某些文件类型执行,而不是对所有包含在 OpenFileDialog.Filter 中的文件类型执行。 .当代码测试字符串的长度时,字符串仍然是 null .这可以避免设置初始值:
public string sConnectionString = string.Empty;
关于操作 .CSV 所需的连接字符串带有 OleDbConnection 的文件 :
  • 所有 OleDb 提供者都会:
  • Microsoft.Jet.OLEDB.4.0
  • Microsoft.ACE.OLEDB.12.0
  • Microsoft.ACE.OLEDB.16.0

  • 如果 Microsoft.Jet.OLEDB.4.0某些旧格式需要(旧的 Access .mdb 文件),应用程序必须编译为 32 位,因此安装其他提供程序的相应 32 位版本:

  • Microsoft Database Engine 2010 Redistributable
    Microsoft Database Engine 2016 Redistributable
    要读取 CSV 文件,连接字符串(适用于所有提供者)的组成如下:
    {Provider};Data Source={Catalog}; Extended Properties="text; HDR=Yes; IMEX=1; FMT=Delimited;
    在哪里:
  • {Provider} => OleDb 提供者之一。他们中的任何一个都可以。
  • {Catalog} => 包含要打开的文件的目录。
  • HDR=Yes/No => CSV文件包含一个标题:如果 Yes , Header 是文件的第一行
  • IMEX=1 => 导入/导出模式设置为 1(导出模式 = 0;导入模式 = 1,链接模式 = 2),以忽略数值并仅使用字符串。这里实际上并不相关。最好保留它,作为一般帮助(以防文件中没有 Header 和 HDR=Yes )。
  • FMT=Delimited => 文件格式:分隔。标题/字段由分隔符分隔。识别的分隔符是逗号 (,)。此设置可能与系统相关(第 3 部分应用程序可能出于自身原因修改了注册表)。要指定不同于默认的分隔符(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其他可用连接字符串格式的网站。
    测试结果的示例代码(在这种情况下使用 Microsoft.Jet.OLEDB.4.0) :
    private void Browse_Click(object sender, EventArgs e)
    {
    string userFileName = string.Empty;
    using (var ofd = new OpenFileDialog()) {
    ofd.Filter = "CSV Files|*.csv|Excel '97-2003|*.xls|Excel 2007-2019|*.xlsx";
    if (ofd.ShowDialog(this) == DialogResult.OK) {
    userFileName = ofd.FileName;
    }
    }

    if (userFileName.Length == 0) return;
    dataGridView1.DataSource = GetData(userFileName);
    }

    private DataTable GetData(string userFileName)
    {
    string dirName = Path.GetDirectoryName(userFileName);
    string fileName = Path.GetFileName(userFileName);
    string fileExtension = Path.GetExtension(userFileName);
    string conString = string.Empty;
    string query = string.Empty;

    switch (fileExtension)
    {
    // Can also use Microsoft.ACE.OLEDB.12 or Microsoft.ACE.OLEDB.16
    case ".xls":
    conString = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={userFileName};" +
    "Extended Properties=\"Excel 8.0; HDR=Yes; IMEX=1\"";
    query = "SELECT * FROM [Sheet1$]";
    break;
    // Can also use Microsoft.ACE.OLEDB.16
    case ".xlsx":
    conString = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={userFileName};" +
    "Extended Properties=\"Excel 12.0; HDR=Yes; IMEX=1\"";
    query = "SELECT * FROM [Sheet1$]";
    break;
    // Can also use Microsoft.ACE.OLEDB.16
    case ".csv":
    conString = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dirName};" +
    "Extended Properties=\"text; HDR=Yes; IMEX=1; FMT=Delimited\"";
    query = $"SELECT * FROM {fileName}";
    break;
    }
    return FillData(conString, query);
    }

    private DataTable FillData(string conString, string query)
    {
    var dt = new DataTable();
    using (var con = new OleDbConnection(conString)) {
    con.Open();
    using (var cmd = new OleDbCommand(query, con))
    using (var reader = cmd.ExecuteReader()) {
    dt.Load(reader);
    };
    }
    return dt;
    }

    关于c# - OpenFileDialog 无法加载 CSV 文件但可以加载 xls/xlsx Excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54349552/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com