我有三个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电子表格,但只输出第一个数据集作为数据表。
赞赏任何意见。
答案 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);
}
}
}