C#中WinForm制作点击"选择文件"按钮选择Excel文件, 并读取Excel内容到DataTable

虽然我是一个PHPer,但项目有C#的需求,我也只能顶着头皮上了。

不过每一份付出都是收货,通过对C#的了解,更加的加深了我对PHP的熟悉程度,将来会另开一个系列单独讲解两个语言对比的文章。

这篇文章的代码,讲的是在WinForm中,制作一个"选择文件"按钮,可以选取Excel文件,并返回DataTable类型的Excel文件内容。

        #region btnClick 点击"选择文件"按钮, 打开选择文件对话框
        private void selectFileBtn_Click(object sender, EventArgs e) {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Files|*.xls;*.xlsx";              // 设定打开的文件类型
            //openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;                       // 打开app对应的路径
            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);  // 打开桌面

            // 如果选定了文件
            string filePath = "";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                // 取得文件路径及文件名
                filePath = openFileDialog.FileName;
                dataGridView1.DataSource = null;                       // 每次打开清空内容
                this.excelDataTable = ReadExcelToTable(filePath);      // 读出excel并放入datatable
                dataGridView1.DataSource = this.excelDataTable;        // 测试用, 输出到dataGridView
            }
        }
        #endregion

        #region private 根据excle的路径把第一个sheet中的内容放入datatable
        /// 
        /// 根据excle的路径把第一个sheet中的内容放入datatable
        /// 
        /// excel文件存放的路径
        /// DataTable
        private static DataTable ReadExcelToTable(string path) {
            try {
                // 连接字符串(Office 07及以上版本 不能出现多余的空格 而且分号注意)
                string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";
                // 连接字符串(Office 07以下版本, 基本上上面的连接字符串就可以了) 
                //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";

                using (OleDbConnection conn = new OleDbConnection(connstring))
                {
                    conn.Open();
                    // 取得所有sheet的名字
                    DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
                    // 取得第一个sheet的名字
                    string firstSheetName = sheetsName.Rows[0][2].ToString();

                    // 查询字符串 
                    string sql = string.Format("SELECT * FROM [{0}]", firstSheetName);

                    // OleDbDataAdapter是充当 DataSet 和数据源之间的桥梁,用于检索和保存数据
                    OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);

                    // DataSet是不依赖于数据库的独立数据集合
                    DataSet set = new DataSet();

                    // 使用 Fill 将数据从数据源加载到 DataSet 中
                    ada.Fill(set);

                    return set.Tables[0];
                }
            } catch (Exception) {
                return null;
            }
        }
        #endregion

 

你可能感兴趣的:(C#)