使用C#从包含多个表的Excel工作表中读取数据

时间:2010-11-14 08:59:56

标签: c# excel

假设我有一个Excel文件包含一个工作表,在这个工作表中有2个表,一个用于员工,包含字段[empID,empName,title],另一个表用于包含字段[deptId,deptName]的部门。

我想知道如何从该Excel文件中读取数据并在数据表中加载两个表,一个用于emplyee,另一个用于department

我搜索并发现在使用Excel进行oleDb连接后,我可以通过“select * from [sheet $]”查询表单,但在我的情况下,表单包含两个结构不同的表。

我正在使用VS2010 C#开发Windows应用程序。

1 个答案:

答案 0 :(得分:1)

首先,制作SheetSelectionForm。然后将这些代码放在表单上,​​并调用PopulateSheetsOfExcelFile(excelFilePath)方法。此表单将显示Excel工作表的名称,您可以选择要从Excel中读取的工作表。

正如您所说,这些表具有不同的结构,因此您需要为每张Excel制作不同的DataTable。

还有另一种方法可以使用DataAdapter读取整个Excel。使用我的方法,您可以创建自定义DataTable,并通过提供excel列/行索引来填充它。

using System.Data.OleDb;


private void SelectItem() 
        { 
            ExcelSheetName = excelSheetsListBox.SelectedItem != null ? 
                excelSheetsListBox.SelectedItem.ToString() : string.Empty; 
            Close(); 
        }

private void PopulateSheetsOfExcelFile(string excelFilePath) 
        { 
            try 
            { 
                String connString = string.Empty;

                try 
                { 
                                      connString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;\"", excelFilePath); 
                    using (OleDbConnection objConn = new OleDbConnection(connString)) 
                    { 
                        objConn.Open(); 
                        using (DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)) 
                        { 
                            if (dt == null) 
                                return;

                            excelSheetsListBox.Items.Clear();

                            for (int i = 0; i < dt.Rows.Count; i++) 
                            { 
                                DataRow row = dt.Rows[i]; 
                                excelSheetsListBox.Items.Add(row["TABLE_NAME"].ToString()); 
                            } 
                        } 
                    } 
                } 
                catch (Exception exA1) 
                { 
                                        connString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"", excelFilePath); 
                    using (OleDbConnection objConn = new OleDbConnection(connString)) 
                    { 
                        objConn.Open(); 
                        using (DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)) 
                        { 
                            if (dt == null) 
                                return;

                            excelSheetsListBox.Items.Clear();

                            for (int i = 0; i < dt.Rows.Count; i++) 
                            { 
                                DataRow row = dt.Rows[i]; 
                                excelSheetsListBox.Items.Add(row["TABLE_NAME"].ToString()); 
                            } 
                        } 
                    } 
                } 
            } 
            catch (Exception ex) 
            { 
               MessageBox.Show(“HATA”);

                ExcelSheetName = string.Empty; 
                Close(); 
            } 
        }