【问题标题】:How can we Validate Column names of Excel sheet with Table values using OLEDB我们如何使用 OLEDB 使用表值验证 Excel 工作表的列名
【发布时间】:2025-11-25 06:20:10
【问题描述】:

我想用表格定义验证上传的 Excel 工作表的列名。 在这里,我从数据库中获取表定义,并使用 OLEDB 从 excel 表中获取列名。

我想验证表格中所有列在 excel 列中的可用位置。在这里,我得到了两个列名(即来自 excel 和表(DB))。

这是我尝试过的代码

    //for validating column names
        public bool ValidateColumnNames(string filename,DataExchangeDefinition dataExchangeDefinition)
        {          
            string extension = Path.GetExtension(filename);
            string connstring = string.Empty;
            try
            {
                switch (extension)
                {
                    case ".xls":
                        connstring = string.Format(ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString, filename);
                        break;
                    case ".xlsx":
                        connstring = string.Format(ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString, filename);
                        break;
                }               
                using (OleDbConnection connExcel = new OleDbConnection(connstring))
                {
                    using (OleDbCommand cmd = new OleDbCommand())
                    {
                        cmd.Connection = connExcel;
                        connExcel.Open();                        
                        var dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        connExcel.Close();
                        string firstSheet = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();

                        cmd.CommandText = "SELECT top 1 * FROM [" + firstSheet + "]";
                        using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
                        {
                            DataTable HeaderColumns = new DataTable();
                            da.SelectCommand = cmd;
                            da.Fill(HeaderColumns);
                            foreach (DataColumn column in HeaderColumns.Columns)
                            {     

//Here i want to validate the column names


                                dataExchangeDefinition.FieldName = column.Caption.ToString();                               
                            }
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return true;
        }

【问题讨论】:

  • 我猜你可以通过使用EPPlus库来避免使用OleDbConnection(即不需要安装Office)。如果您知道标头的范围,则此库可以轻松获取它们。
  • 旁注:throw ex 稍后会给您带来麻烦,因为它消除了原始堆栈跟踪。堆栈跟踪将表明异常源自throw ex 行,因此您不会知道它实际发生在哪里。如果您所做的只是捕捉和重新抛出,那么最好完全忽略 try/catch

标签: c# excel asp.net-mvc oledb


【解决方案1】:

这是对我有用的答案

//for validating column names
    public List<DataExchangeDefinition> ValidateColumnNames(string filename, List<DataExchangeDefinition> dataExchangeDefinitionList)
    {
        DataExchangeDefinition dt = new DataExchangeDefinition();

        //List<DataExchangeDefinition> dataexchangedefinitionList = new List<DataExchangeDefinition>();
        string extension = Path.GetExtension(filename);
        string connstring = string.Empty;
        try
        {
            switch (extension)
            {
                case ".xls":
                    connstring = string.Format(ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString, filename);
                    break;
                case ".xlsx":
                    connstring = string.Format(ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString, filename);
                    break;
            }
            using (OleDbConnection connExcel = new OleDbConnection(connstring))
            {
                using (OleDbCommand cmd = new OleDbCommand())
                {
                    cmd.Connection = connExcel;
                    connExcel.Open();
                    var dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //To get the sheet name
                    connExcel.Close();
                    string firstSheet = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();

                    cmd.CommandText = "SELECT top 1 * FROM [" + firstSheet + "]";
                    using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
                    {
                        DataTable HeaderColumns = new DataTable();
                        da.SelectCommand = cmd;
                        da.Fill(HeaderColumns);

                        //List<DataColumn> excelColumn = new List<DataColumn>();
                        //var excelColumn = new List<DataColumn>();
                        //foreach (DataColumn column in HeaderColumns.Columns)
                        //{
                        //    excelColumn.Add(column);                               
                        //}

                            foreach (DataExchangeDefinition data in dataExchangeDefinitionList)
                            //for(int i=0;i<dataExchangeDefinitionList.Count;i++)
                        {
                            dt.IsColumnValid = false;

                            //var result = from excelColumn in HeaderColumns;
                            foreach (DataColumn column in HeaderColumns.Columns)
                            {
                                if (data.FieldCaption == column.Caption)
                                {
                                    data.IsColumnValid = true;
                                    break;
                                }
                            }
                        }
                        return dataExchangeDefinitionList;
                    }

                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        //return isColumnValid;
    }
}

}

【讨论】: