2014-10-28 196 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文件的完整路徑。

相關問題