【问题标题】:Importation of Master data with standard validation通过标准验证导入主数据
【发布时间】:2018-09-12 13:52:51
【问题描述】:

我在 VB.Net 2013 上有 excel 文件按钮(导入)openfiledialoggridview。 我的任务是制作一个按钮,将所有数据从 excel 文件 提取到 datagridview

openFileDialog1.InitialDirectory = "C:\\Users\\ProgrammerPC1\\Desktop\\DLAV FILES";
openFileDialog1.Title = "Import Master Data";
openFileDialog1.FileName = "";
openFileDialog1.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm";

try { 
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string name = "Sheet1";
        string constr = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + openFileDialog1.FileName + "'; Extended Properties=Excel 8.0; HDR=Yes; IMEX=1;";

        System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr);
        System.Data.OleDb.OleDbCommand oconn = new System.Data.OleDb.OleDbCommand("SELECT * FROM [" + name + "$]", con);
                con.Open();

        System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(oconn);
        DataTable data = new DataTable();
        adapter.Fill(data);
        dataGridView1.DataSource = data;
    }
    else
    {
        MessageBox.Show("Operation Cancelled");
    }
}catch (Exception err)
    {
        MessageBox.Show(err.Message);
    }

我的错误是 外部表的格式不符合预期

【问题讨论】:

  • 欢迎来到 SO。你能更详细地描述你的问题吗?例如。通过添加相关命令、代码 sn-ps 或配置信息...否则您的问题可能会被归类为Help Center 中定义的题外话。谢谢。

标签: c# excel oledb


【解决方案1】:

我发现您对 XLS(用于 Excel 97-2003)和 XLSX(用于 Excel 2007 及更高版本)文件使用相同的连接字符串提供程序(MS Jet OLEDB 4.0 提供程序),因此导致 external 表尝试读取 XLSX/XLSM 文件时出现非预期格式错误。

您需要使用 2 个单独的连接字符串,并使用 Path.GetExtension() 方法从存储在 OpenFileDialog 中的文件扩展名切换它们,如下例所示:

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    string extension = Path.GetExtension(openFileDialog1.FileName); // get file extension
    string name = "Sheet1"

    using (System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection())
    {
        switch (extension)
        {
            case ".xls": // Excel 97-2003 files
               // Excel 97-2003 connection string
               string xlsconstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + openFileDialog1.FileName + "'; Extended Properties=Excel 8.0; HDR=Yes; IMEX=1;";
               con.ConnectionString = xlsconstr;
               break;

            case ".xlsx": // Excel 2007 files
            case ".xlsm":
               // Excel 2007+ connection string, see in https://www.connectionstrings.com/ace-oledb-12-0/    
               string xlsxconstr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + openFileDialog1.FileName + "'; Extended Properties=Excel 12.0; HDR=Yes; IMEX=1;";
               con.ConnectionString = xlsxconstr;
               break;
        }

        using (System.Data.OleDb.OleDbCommand oconn = new System.Data.OleDb.OleDbCommand("SELECT * FROM [" + name + "$]", con))
        {
            con.Open();

            System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(oconn);
            DataTable data = new DataTable();
            adapter.Fill(data);
            dataGridView1.DataSource = data;
        }
    }
}
else
{
    MessageBox.Show("Operation Cancelled");
}

【讨论】:

  • 它工作!顺便说一句,而不是表格数据如何显示工作簿中存在的所有工作表,我该怎么做?
  • 你能解释一下你想“在工作簿中显示所有现有工作表”吗?您想在一个工作簿文件中加入多个工作表,还是做其他事情?
  • 我不想让 dataGridView 显示所有数据,而是想要获取 excel 文件的所有工作表。前任。 excel1.xlsxsheet1,sheet2,sheet3 如果我点击按钮它将在 excel 文件中显示所有工作表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多