The following sample demonstrates how to flatten tree data into a XML, CSV and XLS file.
Web Form
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml.Xsl" %>
<%@ Import Namespace="System.Xml" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<script runat="server">
protected void ToXml(object sender, DirectEventArgs e)
{
string strXml = Server.HtmlDecode(Server.HtmlDecode(e.ExtraParams["nodes"]));
this.Response.Clear();
this.Response.AddHeader("Content-Disposition", "attachment; filename=submittedTree.xml");
this.Response.AddHeader("Content-Length", strXml.Length.ToString());
this.Response.ContentType = "application/xml";
this.Response.Write(strXml);
this.Response.End();
}
protected void ToExcel(object sender, DirectEventArgs e)
{
string strXml = Server.HtmlDecode(Server.HtmlDecode(e.ExtraParams["nodes"]));
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXml);
this.Response.Clear();
this.Response.ContentType = "application/vnd.ms-excel";
this.Response.AddHeader("Content-Disposition", "attachment; filename=submittedData.xls");
XslCompiledTransform xtExcel = new XslCompiledTransform();
xtExcel.Load(Server.MapPath("Excel.xsl"));
xtExcel.Transform(doc.DocumentElement, null, this.Response.OutputStream);
this.Response.End();
}
protected void ToCsv(object sender, DirectEventArgs e)
{
string strXml = Server.HtmlDecode(e.ExtraParams["nodes"]);
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXml);
this.Response.Clear();
this.Response.ContentType = "application/octet-stream";
this.Response.AddHeader("Content-Disposition", "attachment; filename=submittedData.csv");
XslCompiledTransform xtCsv = new XslCompiledTransform();
xtCsv.Load(Server.MapPath("Csv.xsl"));
xtCsv.Transform(doc.DocumentElement, null, this.Response.OutputStream);
this.Response.End();
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function tree2xml(node) {
var result;
if (node.getDepth() === 0) {
result = '<?xml version="1.0"?>';
}
else {
result = '';
}
result = '<node';
for (var key in node.attributes) {
if (key !== 'children') {
result += ' ' + key + '="' + node.attributes[key] + '"';
}
}
var children = node.childNodes;
var clen = children.length;
if (clen == 0) {
result += '/>';
} else {
result += '>';
for (var i = 0; i < clen; i++) {
result += this.tree2xml(children[i]);
}
result += '</node>';
}
return result;
}
</script>
</head>
<body>
<form runat="server">
<ext:ResourceManager runat="server" />
<ext:TreePanel
ID="TreePanel1"
runat="server"
Width="500"
Height="450"
Icon="BookOpen"
Title="Catalog"
RootVisible="false"
AutoScroll="true">
<TopBar>
<ext:Toolbar runat="server">
<Items>
<ext:Button ID="Button1" runat="server" Text="Expand All">
<Listeners>
<Click Handler="#{TreePanel1}.expandAll();" />
</Listeners>
</ext:Button>
<ext:Button ID="Button2" runat="server" Text="Collapse All">
<Listeners>
<Click Handler="#{TreePanel1}.collapseAll();" />
</Listeners>
</ext:Button>
<ext:ToolbarFill ID="ToolbarFill1" runat="server" />
<ext:Button runat="server" Text="To XML" Icon="PageCode">
<DirectEvents>
<Click OnEvent="ToXml" IsUpload="true">
<ExtraParams>
<ext:Parameter Name="nodes" Value="Ext.util.Format.htmlEncode(tree2xml(#{TreePanel1}.getRootNode()))" Mode="Raw" />
</ExtraParams>
</Click>
</DirectEvents>
</ext:Button>
<ext:Button runat="server" Text="To Excel" Icon="PageExcel">
<DirectEvents>
<Click OnEvent="ToExcel" IsUpload="true">
<ExtraParams>
<ext:Parameter Name="nodes" Value="Ext.util.Format.htmlEncode(tree2xml(#{TreePanel1}.getRootNode()))" Mode="Raw" />
</ExtraParams>
</Click>
</DirectEvents>
</ext:Button>
<ext:Button runat="server" Text="To CSV" Icon="PageAttach">
<DirectEvents>
<Click OnEvent="ToCsv" IsUpload="true">
<ExtraParams>
<ext:Parameter Name="nodes" Value="Ext.util.Format.htmlEncode(tree2xml(#{TreePanel1}.getRootNode()))" Mode="Raw" />
</ExtraParams>
</Click>
</DirectEvents>
</ext:Button>
</Items>
</ext:Toolbar>
</TopBar>
<Root>
<ext:TreeNode Text="Composers" Expanded="true">
<Nodes>
<ext:TreeNode Text="Beethoven" Icon="UserGray">
<Nodes>
<ext:TreeNode Text="Concertos">
<Nodes>
<ext:TreeNode Text="No. 1 - C" Icon="Music" />
<ext:TreeNode Text="No. 2 - B-Flat Major" Icon="Music" />
<ext:TreeNode Text="No. 3 - C Minor" Icon="Music" />
<ext:TreeNode Text="No. 4 - G Major" Icon="Music" />
<ext:TreeNode Text="No. 5 - E-Flat Major" Icon="Music" />
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Quartets">
<Nodes>
<ext:TreeNode Text="Six String Quartets" Icon="Music" />
<ext:TreeNode Text="Three String Quartets" Icon="Music" />
<ext:TreeNode Text="Grosse Fugue for String Quartets" Icon="Music" />
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Sonatas">
<Nodes>
<ext:TreeNode Text="Sonata in A Minor" Icon="Music" />
<ext:TreeNode Text="sonata in F Major" Icon="Music" />
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Symphonies">
<Nodes>
<ext:TreeNode Text="No. 1 - C Major" Icon="Music" />
<ext:TreeNode Text="No. 2 - D Major" Icon="Music" />
<ext:TreeNode Text="No. 3 - E-Flat Major" Icon="Music" />
<ext:TreeNode Text="No. 4 - B-Flat Major" Icon="Music" />
<ext:TreeNode Text="No. 5 - C Minor" Icon="Music" />
<ext:TreeNode Text="No. 6 - F Major" Icon="Music" />
<ext:TreeNode Text="No. 7 - A Major" Icon="Music" />
<ext:TreeNode Text="No. 8 - F Major" Icon="Music" />
<ext:TreeNode Text="No. 9 - D Minor" Icon="Music" />
</Nodes>
</ext:TreeNode>
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Brahms" Icon="UserGray">
<Nodes>
<ext:TreeNode Text="Concertos">
<Nodes>
<ext:TreeNode Text="Violin Concerto" Icon="Music" />
<ext:TreeNode Text="Double Concerto - A Minor" Icon="Music" />
<ext:TreeNode Text="Piano Concerto No. 1 - D Minor" Icon="Music" />
<ext:TreeNode Text="Piano Concerto No. 2 - B-Flat Major" Icon="Music" />
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Quartets">
<Nodes>
<ext:TreeNode Text="Piano Quartet No. 1 - G Minor" Icon="Music" />
<ext:TreeNode Text="Piano Quartet No. 2 - A Major" Icon="Music" />
<ext:TreeNode Text="Piano Quartet No. 3 - C Minor" Icon="Music" />
<ext:TreeNode Text="Piano Quartet No. 3 - B-Flat Minor" Icon="Music" />
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Sonatas">
<Nodes>
<ext:TreeNode Text="Two Sonatas for Clarinet - F Minor" Icon="Music" />
<ext:TreeNode Text="Two Sonatas for Clarinet - E-Flat Major" Icon="Music" />
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Symphonies">
<Nodes>
<ext:TreeNode Text="No. 1 - C Minor" Icon="Music" />
<ext:TreeNode Text="No. 2 - D Minor" Icon="Music" />
<ext:TreeNode Text="No. 3 - F Major" Icon="Music" />
<ext:TreeNode Text="No. 4 - E Minor" Icon="Music" />
</Nodes>
</ext:TreeNode>
</Nodes>
</ext:TreeNode>
<ext:TreeNode Text="Mozart" Icon="UserGray">
<Nodes>
<ext:TreeNode Text="Concertos">
<Nodes>
<ext:TreeNode Text="Piano Concerto No. 12" Icon="Music" />
<ext:TreeNode Text="Piano Concerto No. 17" Icon="Music" />
<ext:TreeNode Text="Clarinet Concerto" Icon="Music" />
<ext:TreeNode Text="Violin Concerto No. 5" Icon="Music" />
<ext:TreeNode Text="Violin Concerto No. 4" Icon="Music" />
</Nodes>
</ext:TreeNode>
</Nodes>
</ext:TreeNode>
</Nodes>
</ext:TreeNode>
</Root>
<BottomBar>
<ext:StatusBar ID="StatusBar1" runat="server" AutoClear="1500" />
</BottomBar>
<Listeners>
<Click
Handler="#{StatusBar1}.setStatus({text: 'Node Selected: <b>' + node.text + '<br />', clear: true});"
/>
<ExpandNode
Handler="#{StatusBar1}.setStatus({text: 'Node Expanded: <b>' + node.text + '<br />', clear: true});"
Delay="30"
/>
<CollapseNode
Handler="#{StatusBar1}.setStatus({text: 'Node Collapsed: <b>' + node.text + '<br />', clear: true});"
/>
</Listeners>
</ext:TreePanel>
</form>
</body>
</html>
CSV XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="//node[not(*)]">
<xsl:for-each select="ancestor::node[position()!=last()]">
<xsl:text>"</xsl:text>
<xsl:value-of select="@text"/>
<xsl:text>",</xsl:text>
</xsl:for-each>
<xsl:text>"</xsl:text>
<xsl:value-of select="@text" />
<xsl:text>"</xsl:text>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
XLS XSLT
<xsl:stylesheet version="1.0"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:template match="/node">
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet>
<xsl:attribute name="ss:Name">
<xsl:value-of select="@text" />
</xsl:attribute>
<Table x:FullColumns="1" x:FullRows="1">
<xsl:apply-templates />
</Table>
</Worksheet>
</Workbook>
</xsl:template>
<xsl:template match="//node[not(*)]">
<Row>
<xsl:for-each select="ancestor::node[position()!=last()]">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="@text"/>
</Data>
</Cell>
</xsl:for-each>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="@text" />
</Data>
</Cell>
</Row>
</xsl:template>
</xsl:stylesheet>
Hope it helps.