我有一个包含多个表的数据集(表的数量可能有所不同,与表名和结构相同)。我想获得一个新表,其中包含已有的表,并连接了列和行。
通过以下方式从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仅合并为一个)。