【问题标题】:how to fetch the only column data from excel which is there in database table column in c#如何从excel中获取c#中数据库表列中唯一的列数据
【发布时间】:2015-05-19 16:46:15
【问题描述】:

我有一个包含 150 列的 Excel 文件,其中包含特定的列标题。在我的数据库中,有一个表 'ExcelImport' 列 ExcelHead (包含与 excel 列标题同名的列标题数据)。

create table ExcelImport( id int primary key,ExcelHead varchar(max))

insert into ExcelImport values(1,'Role'),(2,'Manager')

此表将根据另一个规则获取数据。我的要求是我需要从 ExcelImport 表中的 excel 中获取唯一的列数据并插入到另一个临时表中。从示例中我只需要获取 'Role' 和 'Manager' excel 列并且需要插入到临时表中。

注意:每次 ExcelImport 表数据都会被截断并插入 ExcelHead 的新值。

任何人都可以建议做同样的编码吗?

【问题讨论】:

  • ,让我和你确认一下。您有一个数据库名称 ExcelImport ,其中有一列 ExcelHeadExcelHead 将包含您要插入到另一个表中的 excel 文件的列名。您想要做的是您希望您的程序打开一个 excel 文件并仅获取与您之前添加到 ExcelHead 列中具有相同列的数据并将该数据添加到另一个表中。
  • ExcelImport 是表名..
  • 你说的是对的……

标签: c# asp.net .net sql-server excel


【解决方案1】:

首先,您必须从 Excel 文件中读取列标题。尝试查看here 以了解如何从 excel 文件中读取列标题。列标题通常是 excel 文件的第一行,所以如果您只是读取列标题的 excel 文件的第一行就可以了。我通常会使用Dictionary 来跟踪列标题及其列索引。然后,您将需要使用 sql 查询 ExcelImport 表以获取您想要用作过滤器的所有列名。我将交叉引用这两个数据(ExcelImport和Dictionary)来获取需要获取的excel文件的所有行索引。然后我将迭代所有行以获取excel文件的所有数据。最后我将删除所有来自ExcelImport 的数据并将新数据插入ExcelImport 表中。您可以查看下面的伪代码。

    public Dictionary<string,int> GetDictionary(string fullExcelPath)
    {
           //Dictionary<Column Header,Column Index>

           Dictionary<string,int> columns=new  Dictionary<string,int>();

             ExcelWorkbook excelWorkbook = ExcelWorkbook.ReadXLSX(fullExcelPath);

             ExcelWorksheet excelWorkSheet = excelWorkbook.Worksheets[0];

             DataTable dataTable = excelWorkSheet.WriteToDataTable();

             DataTable columns=dataTable.Rows[0];

             //iterate to get the column header

             for(int i=0;;i++)
             {
                string header=(string )row[i];

                if(!string.IsNullOrWhiteSpace(header))
                {
                       columns.Add(header,i);
                }
                else
                {
                   break;
                }
             }
           return columns;

    }

  public void DoWork()
  {
      Dictionary<string,int> columnsFromExcel=GetDictionary(excelPath);

      List<string> columnToFilter=GetFromDatabase();

      int[] columnIndex=CrossReferenceData(columnsFromExcel,columnToFilter);

      //column index=index we wanted to get data from
      //GetDataFromExcel =basically same as GetDictionary but it read from //second row instead of first row and used columnIndex to get data from //dataTable (look GetDictionary method).
      List<string> dataFromExcel=GetDataFromExcel(columnIndex);

      DeleteExcelImportTable();

      // dynamically created your insert sql

      string insertSQL=GetInsertSQL(dataFromExcel);

      InsertExcelImportTable(insertSQL);

  }

【讨论】:

  • 不要忘记从另一个线程而不是 UI 线程运行上面的代码。
  • 数据表列=dataTable.Rows[0];不正确,dataTable.Rows[0] 提供 DataRow,您可能正在寻找 DataColumnCollection dc = dataTable.Columns
  • 正如@Mirnal Kamboj 指出的那样 DataColumnCollection dc = dataTable.Columns 可能是更好的解决方案
  • @Lopht Ghost ExcelWorkbook 的命名空间是什么
  • @Lopht Ghost 你的想法正确,但在visualstudio2008中不能使用相同的代码。你能帮我吗
【解决方案2】:
            DataSet ExcelDataset = DBcom.GetDataset();
            //add logic for getting excel imported data in dataset format.
            string[] columnsNames = new string[100]; int loop = 0;

            //Comparing the Imported Excel Column With Database Table Column
            foreach (DataColumn column in ExcelDataset.Tables[0].Columns)
            {
                string clnameExcel = column.ColumnName;                
                int Exist = 0;
                foreach (DataTable table in DataBaseDataset.Tables)
                {
                    foreach (DataRow dr in table.Rows)
                    {
                        string ColnamesDB = dr["DBColumn"].ToString();//DBColumn is the name of database table column name


                        if (CompclnameExcel == CompColnamesDB)
                        {
                            Exist = 1;
                            break;
                        }

                    }
                }
                if (Exist == 0)
                {                    
                    columnsNames[loop] = clnameExcel;
                    loop++;
                }
            }
            //Deleting Imported Excel Columns which is not there in Database
            foreach (string cNames in columnsNames)
            {
                if (!string.IsNullOrEmpty(cNames))
                {
                    ExcelDataset.Tables[0].Columns.Remove(cNames);
                }
            }

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2014-01-11
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多