【问题标题】:Extract Data from Excel File and Store in SQL Server database从 Excel 文件中提取数据并存储在 SQL Server 数据库中
【发布时间】:2014-10-28 23:33:54
【问题描述】:

我正在寻找有关解析 Microsoft Excel 文件并将数据更新/存储到给定 SQL Server 数据库中的最佳方法的建议。我使用 ASP.NET MVC,因此我计划在 Excel 电子表格中使用页面/视图并使用该用户给定的文件,我将需要使用 C# 来解析列中的数据并根据与电子表格列的匹配来更新数据库包含数据库表的键列。电子表格将始终采用相同的格式,因此我只需要处理格式。这似乎是一件很常见的事情,我只是在开始之前寻找解决这个问题的最佳方法。我在当前的应用程序中使用实体框架,但我不必使用它。

我发现这个解决方案似乎是一个不错的选择:

public IEnumerable<MyEntity> ReadEntitiesFromFile( IExcelDataReader reader, string filePath )
{
   var myEntities = new List<MyEntity>();
   var stream = File.Open( filePath, FileMode.Open, FileAccess.Read );

   using ( var reader = ExcelReaderFactory.CreateOpenXmlReader( stream ) )
   {
     while ( reader.Read() )
     {
        var myEntity = new MyEntity():
        myEntity.MyProperty1 = reader.GetString(1);
        myEntity.MyProperty2 = reader.GetInt32(2);

        myEntites.Add(myEntity);
      }
   }

   return myEntities;
}

这是一个文件可能是什么样子的示例(时钟# 是关键)

因此,给定一个这种格式的文件,我想使用时钟 # 将用户与数据表记录匹配,并使用每个单元格信息更新记录。电子表格中的每一列在数据表中都有一个相关的列。非常感谢所有帮助。

【问题讨论】:

  • 问题是导入该数据还是导入后处理数据?你能解释一下你的实际问题吗?
  • 对不起,问题实际上是导入数据。我可以得到excel文件并加载得很好。我只需要知道如何遍历电子表格中的每一行并使用 c# 更新数据
  • 你是说要写回刚刚导入的Excel文件,还是更新刚刚导入的表中的数据?

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


【解决方案1】:

您可以使用命名空间Microsoft.Office.Interop.Excel 中的类,它会抽象出您找到的所有解决方案。无需我重写,您可以查看这篇文章:http://www.codeproject.com/Tips/696864/Working-with-Excel-Using-Csharp

更好的是,为什么不绕过中间人?您可以使用现有的 ETL 工具,例如 Pentaho 或 Talend,或者直接从 Excel 导入数据库的工具。这些类型的工具通常提供大量自定义,并且使用起来相当简单。对于您所描述的内容,我已经大量使用 Pentaho,它使我免于自己编写代码的头痛。除非您想/需要自己编写,否则我认为后者是最好的方法。

【讨论】:

  • 在服务器上安装 Excel 只是为了使用互操作是一个非常糟糕的主意,并且肯定会导致问题。至于 ETL,SQL Server 本身包含一个自 1990 年代以来功能齐全的 ETL 系统。这是 Pentaho 等人的基础
【解决方案2】:

试试这个 公共字符串 GetDataTableOfExcel(字符串文件路径) {

            using (OleDbConnection conn = new OleDbConnection())
            {
                DataTable dt = new DataTable();
                string Import_FileName = Server.MapPath(file_path);
                //Import_FileName = System.IO.Path.GetDirectoryName(file_path);
                string fileExtension = Path.GetExtension(Import_FileName);
                if (fileExtension == ".xlsx")
                    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'";
                using (OleDbCommand comm = new OleDbCommand())
                {
                    comm.CommandText = "Select * from [Sheet1$]";
                    comm.Connection = conn;
                    using (OleDbDataAdapter da = new OleDbDataAdapter())
                    {
                        da.SelectCommand = comm;
                        da.Fill(dt);
                                                    }
                }
            }
        }

现在您的数据在 DataTable 中。您可以从数据表的数据创建插入查询。

file_path 是 excel 文件的完整路径,带有目录名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多