C# | .NET 表格 |如何制作一个显示 Excel 工作表的 ComboBox,然后将其显示在 dataViewGrid 中?

Posted

技术标签:

【中文标题】C# | .NET 表格 |如何制作一个显示 Excel 工作表的 ComboBox,然后将其显示在 dataViewGrid 中?【英文标题】:C# | Forms .NET | How can I make a ComboBox that show's Excel sheets which it then displays in the dataViewGrid? 【发布时间】:2020-07-06 12:49:44 【问题描述】:

所以我一直在研究一个小应用程序,到目前为止它非常愉快。您可以选择所需的任何 Excel 文件和所需的任何 Access 数据库,然后将 Excel 数据保存到其中。它还在 dataGridview 中显示 Excel 数据。最终,我希望能够在它自己的 Gridview 中更改数据并能够保存它,但那是另一次了。现在我想知道如何制作一个组合框,让我可以选择 Excel 文件的工作表。

我当前的 GUI 如下所示: GUI

物品名称:

btnrun - "Runs" the excel file in the datagridview
btnbrowse - chooses which Excel file you want to use
btnbrowse2 - chooses which Access Database file you want to use
btnsave - saves Excel data to Access Database
textBox1 - Shows the file path for Excel
textBox2 - Shows the file path for Access Database
comboBox1 - This is where i need help :)
dataGridView1 - Shows the Excel data

这是我当前的代码:

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;

namespace Datatestje

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        


        //Buttons
        private void btnrun_Click(object sender, EventArgs e) //Run
        
            string EXpath = textBox1.Text;
            string PathConn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + EXpath + ";Extended Properties=\"Excel 8.0;HDR=Yes;\";";
            OleDbConnection conn = new OleDbConnection(PathConn);

            var sqlQuery = "Select * from [Sheet1$]";
            OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(sqlQuery, conn);
            DataTable dt = new DataTable();

            myDataAdapter.Fill(dt);
            dataGridView1.DataSource = dt;
        

        private void btnsave_Click(object sender, EventArgs e) //Save
        
            
                //File Path
                string EXpath = textBox1.Text;
                string fileNameExcel = @EXpath;
                string ACpath = textBox2.Text;
                string fileNameAccess = @ACpath;

                //Connection string for Excel
                string connectionStringExcel =
                    string.Format("Data Source= 0;Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;", fileNameExcel);

                //Connection string for Access
                string ConnectionStringAccess =
                    string.Format("Data Source= 0; Provider=Microsoft.Jet.OLEDB.4.0; Persist security Info = false", fileNameAccess);

                OleDbConnection connExcel = new OleDbConnection(connectionStringExcel);
                OleDbConnection connAccess = new OleDbConnection(ConnectionStringAccess);
                OleDbCommand cmdExcel = connExcel.CreateCommand();
                cmdExcel.CommandType = CommandType.Text;

                //Excel Sheet
                cmdExcel.CommandText = "SELECT * FROM [Sheet1$]";

                //Command object for Access
                OleDbCommand cmdAccess = connAccess.CreateCommand();
                cmdAccess.CommandType = CommandType.Text;
                
                //Add parameters *
                cmdAccess.CommandText = "INSERT INTO Informatie (Naam, Achternaam, Land, Stad, Huisnummer, Postcode, Telefoonnummer) VALUES(@Naam, @Achternaam, @Land, @Stad, @Huisnummer, @Postcode, @Telefoonnummer)";

                //Add parameters to Access command object **
                OleDbParameter param1 = new OleDbParameter("@Naam", OleDbType.VarChar);
                cmdAccess.Parameters.Add(param1);
                OleDbParameter param2 = new OleDbParameter("@Achternaam", OleDbType.VarChar);
                cmdAccess.Parameters.Add(param2);
                OleDbParameter param3 = new OleDbParameter("@Land", OleDbType.VarChar);
                cmdAccess.Parameters.Add(param3);
                OleDbParameter param4 = new OleDbParameter("@Stad", OleDbType.VarChar);
                cmdAccess.Parameters.Add(param4);
                OleDbParameter param5 = new OleDbParameter("@Huisnummer", OleDbType.VarChar);
                cmdAccess.Parameters.Add(param5);
                OleDbParameter param6 = new OleDbParameter("@Postcode", OleDbType.VarChar);
                cmdAccess.Parameters.Add(param6);
                OleDbParameter param7 = new OleDbParameter("@Telefoonnummer", OleDbType.VarChar);
                cmdAccess.Parameters.Add(param7);


                //Open connections
                connExcel.Open();
                connAccess.Open();
                OleDbDataReader drExcel = cmdExcel.ExecuteReader();

                while (drExcel.Read())
                
                    //Assign values to access command parameters ***
                    param1.Value = drExcel[0].ToString();
                    param2.Value = drExcel[1].ToString();
                    param3.Value = drExcel[2].ToString();
                    param4.Value = drExcel[3].ToString();
                    param5.Value = drExcel[4].ToString();
                    param6.Value = drExcel[5].ToString();
                    param7.Value = drExcel[6].ToString();

                    //Insert values in access
                    cmdAccess.ExecuteNonQuery();
                

                //close connections
                connAccess.Close();
                connExcel.Close();
                MessageBox.Show("Succesfully uploaded Excel data to Database.");

            
        

        private void btnbrowse_Click_1(object sender, EventArgs e)
        
            OpenFileDialog openfiledialog1 = new OpenFileDialog();
            openfiledialog1.ShowDialog();
            openfiledialog1.Filter = "allfiles|*.xls";
            textBox1.Text = openfiledialog1.FileName;
        

        private void btnbrowse2_Click(object sender, EventArgs e)
        
            OpenFileDialog openfiledialog1 = new OpenFileDialog();
            openfiledialog1.ShowDialog();
            openfiledialog1.Filter = "allfiles|*.mdb";
            textBox2.Text = openfiledialog1.FileName;
        
    

所以,是的。任何帮助将不胜感激。

谢谢:)

【问题讨论】:

恭喜您取得成功!你卡在哪一部分?如何列出工作表?如何填充组合框? 我以前从未使用过组合框,所以我不知道如何添加它以便从中选择 Excel 工作表。 如:如何在 ComboBox 中获取工作表名称以及如何制作它,以便当我从下拉菜单中选择工作表时,它会在 dataGridView 中打开工作表的信息。跨度> 另外,我知道我的代码中有var sqlQuery = "Select * from [Sheet1$]";。但这很简单,因为我一直在慢慢地将应用程序从一个按钮扩展为具有多种功能的实际应用程序。所以我知道我需要替换它,但我还不知道用什么替换。我已经尝试了一些我在网上找到的代码,但遗憾的是它们不起作用。 进展如何? AVG 的回答解决了您的问题吗? 【参考方案1】:

您应该能够通过以下方式获取工作表名称:

DataTable dtSheets = conn.GetSchema("Tables")

您可以通过简单的 Google 搜索找到如何填充 ComboBox。 您只需将“Sheet1$”替换为所选工作表的名称即可使用工作表内容填充数据表

 var sqlQuery = "Select * from [" + strSheetName + "]";

【讨论】:

那会是类似的东西:private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) DataTable dtSheets = conn.GetSchema("Tables") var sqlQuery = "Select * from [" + strSheetName + "]"; 没有。 GetSchema 用于使用工作表列表填充 DataTable。这就是您要填充 ComboBox 的内容。您不能使用 SelectedIndexChanged 事件来填充 ComboBox,因为不会有条目。您应该在用户选择文件后填充 ComboBox。然后在用户从 ComboBox 中选择一个条目后填充您的网格。

以上是关于C# | .NET 表格 |如何制作一个显示 Excel 工作表的 ComboBox,然后将其显示在 dataViewGrid 中?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net(C#)如何将查询到的数据导出Excel表格?

响应式数据表 SQL C# ASP.net

C# winform界面如何做出表格的样式

List<T> 的 C# ASP.NET MVC 模型绑定

C# winform中以excel的方式编辑表格

c#如何实现对表格(excel)的增删改查?