【问题标题】:Reading data from Excel sheet containg multiple tables using C#使用 C# 从包含多个表的 Excel 工作表中读取数据
【发布时间】:2011-05-09 18:37:16
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# excel


    【解决方案1】:

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

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

    还有另一种使用 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(); 
                } 
            }
    

    【讨论】:

    • thnx serkan 我会尝试你的代码,我会回复你,让你知道我是否有任何问题,,,thnx 再次
    • 好的。文章是用土耳其语写的,如果你不懂土耳其语,请我翻译。
    • 我想问你关于你发布的代码中的一些内容,,你是什么意思 // excelSheetsListBox.Items.Add(row["TABLE_NAME"].ToString()); ["table_name"] 是什么意思??
    • 此代码行会将 Excel 工作表名称添加到您的 excelSheetsListBox。
    • 我想问你一些事情是你的代码仅在 excelSheetListBox 中显示工作表名称,我想加载两个数据表中的 2 个表中的数据,并将每个数据表绑定到网格,,,我的工作表包含 2 个结构不同的表,我想知道如何在工作表内查询以获取每个表的数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2011-12-30
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多