从多个Excel文件合并/合并数据集

时间:2016-09-22 13:02:53

标签: c# asp.net datatable dataset

我有三个excel文件都具有相同的主键。我正在将这些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);
    }  

我是否需要指定数据集的主键?目前,它正在循环遍历所有三个excel电子表格,但只输出第一个数据集作为数据表。

赞赏任何意见。

3 个答案:

答案 0 :(得分:0)

我想IExcelDataReader.AsDataSet只会将excel行读入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");

答案 1 :(得分:0)

要合并DataSet,您必须指定主键。

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

如果有帮助,请告诉我。

答案 2 :(得分: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);
                    }
                }
            }