2014-10-28 93 views
1

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

我发现这个解决方案,它似乎像它可能是一个不错的选择:

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

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

+0

导入数据或导入数据后处理数据是问题吗?你能解释你的实际问题吗? – 2014-10-28 23:41:10

+0

对不起,问题实际上是导入数据。我可以得到excel文件并加载正常。我只需要知道如何运行电子表格中的每一行并使用c#更新数据。 – user3788671 2014-10-28 23:42:37

+0

您是说您想要回写刚刚导入的Excel文件,或更新刚刚导入的表中的数据? – 2014-10-29 01:02:08

回答

2

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

更好的是,为什么不绕过中间人?您可以使用现有的ETL工具(如Pentaho或Talend)或其他软件直接从Excel导入数据库。这些类型的工具通常提供很多定制,并且使用起来相当简单。我使用Pentaho的字面意义很大,它为我省去了编写代码的头痛。除非你想/需要自己写,否则我认为后者是最好的方法。

+0

在服务器上安装Excel只是为了使用interop是一个非常糟糕的主意,并保证会导致问题。至于ETL,自20世纪90年代以来,SQL Server本身就包含一个全功能的ETL系统。这是Pentaho等人的基础 – 2017-06-29 08:08:09

0

尝试这个 公共字符串GetDataTableOfExcel(字符串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); 
                } 
       } 
      } 
     } 

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

file_path是具有目录名称的excel文件的完整路径。

相关问题