【问题标题】:Best way to export data from an Excel file to SQL server database将数据从 Excel 文件导出到 SQL Server 数据库的最佳方法
【发布时间】:2016-01-15 10:47:02
【问题描述】:

我有一个已打开的 Excel 文件。我想编写可以将该文件的数据导出到 SQL Server 数据库表的 C# 代码,而无需提供该打开文件的路径。

Excel.Application sourceApp;
sourceApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
sourceApp.Visible = true;
Excel.Workbook sourceWorkBook = sourceApp.ActiveWorkbook;

Excel.Worksheet sourceWorkSheet = sourceWorkBook.ActiveSheet;

Excel.Range sourceRange = sourceWorkSheet.UsedRange;

这是我用于打开 Excel 文件的代码。

如何将它连接到数据库以及导入它的适当方式?

【问题讨论】:

  • 就像你在最后一句话中所说的,你的意思是导入而不是导出,并且有太多的方法可以做到这一点,一个可以读取excel然后执行插入,如果数据太多,您可以改用批量插入插入。
  • @AlexKrups 实际上我正在为 vba 应用程序实现这个程序。我会将它用作库并将其附加到 vba 代码中。我不使用 VBA 的原因是 - VBA 缺乏版本控制,这是程序的主要要求。
  • @JuanRuizdeCastilla 是的,我目前正在考虑批量插入,但我面临的主要问题是将 excel 连接到数据库而不提供文件路径,因为我想从已经打开的 excel 表中导出这些数据到数据库(活动一个),并从数据库导入到当前打开的 Excel 表(再次活动一个)
  • 你说“缺乏版本控制”是什么意思,你可以对任何文件实施版本控制,我的意思是你可以把你的 vba 代码和使用 git - github 来控制你在 excel 之外的更改,您显然需要 vba 或一些来自 excel 的向导。如果选项是第二个,请告诉我,我会尽力帮助您。

标签: c# sql-server database excel import


【解决方案1】:

这实际上取决于许多因素,但是您可以创建一个Datatable,将值映射到 SQL 表,然后将 Datatable 批量插入到表中。下面是这段代码的通用 sn-p。

public static void insertToDB(List<YourModel> list)
    {

        DataTable table = new DataTable("table");

        DataColumn colA = new DataColumn("Column_A", Type.GetType("System.String"));
        table.Columns.Add(colA);
        DataColumn colB = new DataColumn("Column_B", Type.GetType("System.DateTime"));
        table.Columns.Add(colB);
        DataColumn colC = new DataColumn("Column_C", Type.GetType("System.TimeSpan"));
        table.Columns.Add(colC);
        DataColumn colD = new DataColumn("Column_D", Type.GetType("System.Int32"));
        table.Columns.Add(colD);

        foreach (var item in list)
        {
            DataRow newRow = table.NewRow();
            newRow["Column_A"] = item.colA == null ? DBNull.Value : (object)item.Celda_Destino;
            newRow["Column_B"] = item.colB == null ? DBNull.Value : (object)item.Celda_Origen; ;
            newRow["Column_C"] = item.colC == null ? DBNull.Value : (object)item.Celda_Destino;
            newRow["Column_D"] = item.colD;

            table.Rows.Add(newRow);
        }


        using (SqlConnection conn = new SqlConnection("YOUR CONNECTION STRING"))
        {
            conn.Open();
            using (SqlBulkCopy s = new SqlBulkCopy(conn))
            {
                s.DestinationTableName = table.TableName;
                foreach (DataColumn dc in table.Columns)
                {
                    s.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                }
            }
        }

    }

根据您的 Excel 文件,您将必须实现使用“YourModel”对象获取列表的逻辑

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2011-10-09
    相关资源
    最近更新 更多