从Excel文件中提取数据并存储在SQL Server数据库中

时间:2014-10-28 23:33:54

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

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

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

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;
}

以下是文件外观的示例(时钟#是密钥)

enter image description here

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

2 个答案:

答案 0 :(得分:3)

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

更好的是,为什么不绕过中间人呢?您可以使用现有的ETL工具(如Pentaho或Talend)或其他东西直接从Excel到数据库。这些类型的工具通常提供大量自定义,并且使用起来相当简单。我已经将Pentaho用于你所描述的字面上了很多,它让我免于自己编写代码。除非你想/需要自己写,否则我认为后者是最好的方法。

答案 1 :(得分:0)

试试这个 public string GetDataTableOfExcel(string file_path)         {

            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文件的完整路径,包含目录名。