将具有DataRelations的多个DataTable加入新的DataTable

时间:2018-09-19 16:32:19

标签: c# excel xml join dataset

我有一个包含多个表的数据集(表的数量可能有所不同,与表名和结构相同)。我想获得一个新表,其中包含已有的表,并连接了列和行。

通过以下方式从XML文件加载数据集:

DataSet dsXML = new DataSet();
dsXML.ReadXml(strXMLPath);

XML文件是使用Oracle Reports 6i创建的,并且我们有多个具有不同结构的报告,因此XML文件可能被解析为一个或多个表。如果您使用Microsoft Excel打开XML文件,那么它的数据就会“神奇地”连接到一个表中,我希望自动实现相同的结果,而无需用户做任何事情,也不必安装Office。

我设法遍历了Dataset的DataRelations并收集了我感兴趣的所有列(除了在父表和子表中重复的联接列之外的所有列,而我只得到其中之一):< / p>

bool blnContinue = true;
DataTable table = ds.Tables[0];
List<DataColumn> allColumns = new List<DataColumn>();
while (blnContinue)
{
    foreach (DataColumn col in table.Columns)
    {
        if (table.ParentRelations != null 
            && table.ParentRelations.Count > 0)
        {
            if (!table.ParentRelations[0].ChildColumns.Contains(col))
                allColumns.Add(col);
        }
        else
        {
            allColumns.Add(col);
        }
    }
    if (table.ChildRelations != null && table.ChildRelations.Count > 0)
        table = table.ChildRelations[0].ChildTable;
    else blnContinue = false;
}

由于列与表紧密绑定,因此我必须遍历allColumns对象以创建具有相同名称的新列(所有列均使用字符串数据类型创建)。在创建新列之后,再次遍历Dataset和Datarelations以获取所有数据。

我尝试过

var tablesJoined = from t1 in ds.Tables[0].Rows.Cast<DataRow>()
                   join t2 in ds.Tables[1].Rows.Cast<DataRow>() on t1["key_column"] equals t2["key_column"]
                   select new { t1, t2 };

并阅读this question。但是我对Linq的了解不够,也不知道如何动态地创建该句子,以便它可用于任何数量的表。另外,“ key_column”可能会有所不同,因此我必须根据自己的表进行动态设置。

如何制作XML文件的示例:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Generated by Oracle Reports version 6.0.8.11.3 -->
<SOME_ROOT_LABEL>
  <BEGIN_LIST_LABEL>
    <RECORD_LABEL>
      <PROPERTY_LABEL1>XXX</PROPERTY_LABEL1>
      <PROPERTY_LABEL2>YYY</PROPERTY_LABEL2>
      <PROPERTY_LABEL3>ZZZ</PROPERTY_LABEL3>
        ...
    </RECORD_LABEL>
    ...
    <RECORD_LABEL>
        ...
    </RECORD_LABEL>
  </BEGIN_LIST_LABEL>
  <SOME_OTHER_LABEL> whatever </SOME_OTHER_LABEL>
</SOME_ROOT_LABEL>

将所有数据放入一个DataTable之后,我想创建一个“ .xlsx”文件(也许使用Epplus)。

是否有更好的方法来实现这一目的(将具有DataRelations的N个DataTable仅合并为一个)。

0 个答案:

没有答案