2016-09-22 12 views
0

すべての主キーが同じ3つのExcelファイルがあります。私はこれらのExcelファイルを自分のアプリケーションにアップロードしており、それらを1つのデータセット/データテーブルにすべてマージしたいと思っています。私はいくつかのことを試しましたが失敗しました。ここで複数のExcelファイルからのデータセットの結合/マージ

私は現在、何をしようとしています...

[HttpPost] 
    public async Task<ActionResult> Index(ICollection<IFormFile> files) 
    { 
     var uploads = Path.Combine(_environment.WebRootPath, "uploads"); 

     DataSet ds = new DataSet(); 
     IExcelDataReader reader = null; 
     DataTable dt = new DataTable(); 

     foreach (var file in files) 
     { 

      Dataset ds2 = null; 

      if (file == null || file.Length == 0) 
      { 
       ViewBag.Error = "Please Select An Excel File<br>"; 
       return View("Index"); 
      } 
      else 
      { 
       using (var fileStream = new FileStream(Path.Combine(uploads, file.FileName), FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
       { 
        await file.CopyToAsync(fileStream); 

        if (file.FileName.EndsWith("xls")) 
        { 
         reader = ExcelReaderFactory.CreateBinaryReader(fileStream);      
        } 
        else if (file.FileName.EndsWith("xlsx")) 
        { 
         reader = ExcelReaderFactory.CreateOpenXmlReader(fileStream); 
        } 
        else 
        { 
         ViewBag.Error = "File type is incorrect<br>"; 
         return View("Index"); 
        } 

        reader.IsFirstRowAsColumnNames = true;      
        //set the second dataset as the value of the excel data 
        ds2 = reader.AsDataSet(); 

        //merge the second dataset with the first... 
        ds.Merge(ds2); 
       }          
      }     
     } 

     dt = ds.Tables[0]; 

     return View("Index", dt); 
    } 

は、私は、データセットの主キーを指定する必要がありますか?現在、3つすべてのExcelスプレッドシートをループしていますが、最初のデータセットのみをデータテーブルとして出力しています。

ご了承ください。

答えて

0

私はIExcelDataReader.AsDataSetだけDataRowsにエクセル-行を読み取り、DataTableに追加しますが、実際の主キーを定義することなく、その後DataSet/DataTable.Mergeだけで、実際にそれらをマージすることなく行を追加することを推測します。

次に、あなたは、テーブルをマージするためにここに私のアプローチを使用することができます。

Combining n DataTables into a Single DataTable

だから、残りのコードは次のようになります。マージするデータセットの

var tables = new List<DataTable>(); 
foreach (var file in files) 
{ 
      // .... 
      tables.Add(reader.AsDataSet().Tables[0]); 
      // ... 
} 

DataTable mergedTables = tables.MergeAll("PimaryKeyColumnName"); 
+0

マージ。どうもありがとうございます。私は列のいくつかのデータ型を混乱させなければならなかったが、いくつかの変換の後、それは完璧に動作している! – dev53

0

を、あなたは指定する必要があります主キー。

ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns["pri_key"] }; 
ds2.Tables[0].PrimaryKey = new DataColumn[] { ds2.Tables[0].Columns["pri_key"] }; 
ds.Merge(ds2); 

これが役立つかどうかを教えてください。

0

この点についてはどうですか?

グラブ辞書への内容:

private Dictionary<string, string> LoadFile(string path) 
     { 
      string line; 
      Dictionary<string, string> vals = new Dictionary<string, string>(); 
      using (StreamReader file = new StreamReader(path)) 
      { 
       while ((line = file.ReadLine()) != null) 
       { 
        string[] parts = line.Split(','); 
        vals.Add(parts[0], parts[1]); 
       } 
      } 
      return vals; 
     } 

は、その後、あなたのプログラムの中で、それぞれのファイルをロードし、これは素晴らしいです

Dictionary<string, string> fileAValues = LoadFile(@"C:\Temp\FileA.txt"); 
Dictionary<string, string> fileBValues = LoadFile(@"C:\Temp\FileB.txt"); 

      using (StreamWriter sr = new StreamWriter(@"C:\Temp\FileC.txt")) 
      { 
       foreach (string key in fileAValues.Keys) 
       { 
        if (fileBValues.ContainsKey(key)) 
        { 
         string combined = key + "," + 

          String.Join(",", fileAValues[key].ToString(), 
         fileBValues[key].ToString()); 
         sr.WriteLine(combined); 
        } 
       } 
      } 
関連する問題