[c#]联合收割机/合并来自多个 Excel 文件的数据集

发布时间: 2017/2/25 3:19:49
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有三个 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 电子表格,但只输出作为数据表的第一个数据集。

任何输入被赞赏。

解决方法 1:

我猜这 IExcelDataReader.AsDataSet 仅读取 excel 行到 DataRows 并将它们添加到 DataTable ,但没有定义真正的主键,然后 DataSet/DataTable.Merge 只追加行而不实际合并他们。

然后你可以使用我的方法在这里合并表︰

结合到单个数据表中的 n 数据表

因此将剩余的代码︰

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

DataTable mergedTables = tables.MergeAll("PimaryKeyColumnName");
官方微信
官方QQ群
31647020