[CLOSED] MVC Grid/Store Export to .xls/.csv/.xml

  1. #1

    [CLOSED] MVC Grid/Store Export to .xls/.csv/.xml

    Hi,

    In relation with this post:

    http://forums.ext.net/showthread.php...csv-.xml-Error

    I'm trying to perform an Export action but there is no way to go...

    My code is as follows:

    Controller:
            public ActionResult Export(string data, string format)
            {
                Ext.Net.SubmitHandler submitData = new Ext.Net.SubmitHandler(data); 
                XmlNode xml = submitData.Xml; 
                MemoryStream m = new MemoryStream(System.Text.Encoding.Default.GetBytes(xml.OuterXml)); 
                XPathDocument xpathDoc = new XPathDocument(new StreamReader(m)); 
                XslCompiledTransform transform = new XslCompiledTransform(); 
                StringBuilder resultString = new StringBuilder(); 
                XmlWriter writer = XmlWriter.Create(resultString);
                string contentType = string.Empty;
    
                switch (format)
                {
                    case "xml":
                        contentType = "application/xml";
                        break;
    
                    case "xls":
                            contentType = "application/vnd.ms-excel";
                            transform.Load(Server.MapPath("~/Resources/xsl/Excel.xsl")); 
                            transform.Transform(xpathDoc, writer); 
                        break;
    
                    case "csv":
                        contentType = "application/octet-stream";
                        transform.Load(Server.MapPath("~/Resources/xsl/Csv.xsl")); 
                        transform.Transform(xpathDoc, writer);
                        break;
                }
    
                var result = new FileContentResult(Encoding.UTF8.GetBytes(resultString.ToString()), contentType);
                result.FileDownloadName = string.Format("TempoMillenium.{0}", format); 
                return result; 
            }
    View:

        <ext:Window ID="ResultsWindow" runat="server" Title="Results"
            Width="600" Height="300" MinHeight="300" MinWidth="600" Hidden="true" Border="false" Modal="true" Maximizable="true">
            <Items>
                <ext:BorderLayout runat="server">
                    <Center>        
                        <ext:FormPanel ID="ResultsForm" runat="server" Url='<%# Url.Action("Export") %>' AutoDataBind="true" Border="false" Frame="true" AutoHeight="true">
                            <Items>
                                <ext:Hidden ID="FormatType" runat="server" /> 
                                          
                                <ext:GridPanel 
                                    ID="gridResults" 
                                    runat="server" 
                                    Layout="Fit"
                                    TrackMouseOver="true"
                                    AutoExpandColumn="Msg"
                                    Title="Results"> 
                                    <Store>
                                        <ext:Store 
                                            runat="server" 
                                            ID="dsResults"
                                            RemoteSort="true" 
                                            AutoLoad="false">
                                            <Proxy>
                                                <ext:HttpProxy Method="POST" Url='<%# Url.Action("Results") %>' AutoDataBind="true" />
                                            </Proxy>
                                            <Reader>
                                                <ext:JsonReader IDProperty="Id" Root="data">
                                                    <Fields>
                                                        <ext:RecordField Name="Id" />
                                                        <ext:RecordField Name="Msg" />
                                                    </Fields>
                                                </ext:JsonReader>
                                            </Reader>
                                        </ext:Store>                                            
                                    </Store>
                                    <TopBar>
                                        <ext:Toolbar runat="server">
                                            <Items>
                                                <ext:ToolbarFill runat="server" />
                                                <ext:Button runat="server" Text="To XML" Icon="PageCode">
                                                    <DirectEvents>     
                                                        <Click Url='<%# Url.Action("Export") %>' AutoDataBind="true" IsUpload="true">         
                                                            <ExtraParams>             
                                                                <ext:Parameter Name="data" Value="#{gridResults}.getRowsValues()" Mode="Raw" Encode="true" />             
                                                                <ext:Parameter Name="format" Value="xml" Mode="Value" />         
                                                            </ExtraParams>     
                                                        </Click> 
                                                    </DirectEvents> 
                                                </ext:Button>
                            
                                                <ext:Button runat="server" Text="To Excel" Icon="PageExcel">
                                                    <DirectEvents>     
                                                        <Click Url='<%# Url.Action("Export") %>' AutoDataBind="true" IsUpload="true">         
                                                            <ExtraParams>             
                                                                <ext:Parameter Name="data" Value="#{gridResults}.getRowsValues()" Mode="Raw" Encode="true" />             
                                                                <ext:Parameter Name="format" Value="xls" Mode="Value" />         
                                                            </ExtraParams>     
                                                        </Click> 
                                                    </DirectEvents>
                                                </ext:Button>
                            
                                                <ext:Button runat="server" Text="To CSV" Icon="PageAttach">
                                                    <DirectEvents>     
                                                        <Click Url='<%# Url.Action("Export") %>' AutoDataBind="true" IsUpload="true">         
                                                            <ExtraParams>             
                                                                <ext:Parameter Name="data" Value="#{gridResults}.getRowsValues()" Mode="Raw" Encode="true" />             
                                                                <ext:Parameter Name="format" Value="csv" Mode="Value" />         
                                                            </ExtraParams>     
                                                        </Click> 
                                                    </DirectEvents>
                                                </ext:Button>
                                            </Items>
                                        </ext:Toolbar>
                                    </TopBar>
                                    <ColumnModel runat="server">
                                        <Columns>
                                            <ext:Column ColumnID="Id" DataIndex="Id" Header="Id" Width="100">
                                                <Renderer Handler="return Ext.util.Format.htmlEncode(value);" />
                                            </ext:Column>
                                            <ext:Column ColumnID="Msg" DataIndex="Msg" Header="Result">
                                                <Renderer Handler="return Ext.util.Format.htmlEncode(value);" />
                                            </ext:Column>
                                        </Columns>
                                    </ColumnModel>
                                    <SelectionModel>
                                        <ext:RowSelectionModel runat="server" />
                                    </SelectionModel>
                                    <LoadMask ShowMask="true" />
                                </ext:GridPanel>  
                            </Items>
                        </ext:FormPanel>                                                   
                    </Center>
                </ext:BorderLayout>
            </Items>
            <Buttons>
                <ext:Button runat="server" Text="Accept">
                    <Listeners>
                        <Click Handler="#{ResultsWindow}.hide();" />
                    </Listeners>
                </ext:Button>
            </Buttons>
        </ext:Window>
    At the moment, I have a Request Failure window with Status Text: NORESPONSE.

    Any clue about how to get it working?

    Thanks in advance.
    Last edited by Daniil; Jun 17, 2011 at 2:08 PM. Reason: [CLOSED]
  2. #2
    Hi,

    Here is the minimized working example of exporting to xml.

    Example View
    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                Store store = this.GridPanel1.GetStore();
                store.DataSource = new object[] 
                { 
                    new object[] { "test11", "test12", "test13" },
                    new object[] { "test12", "test22", "test23" },
                    new object[] { "test13", "test32", "test33" }
                };
                store.DataBind();
            }
        }
    </script>
    
    <!DOCTYPE html>
    <html>
    <head runat="server">
        <title>Ext.Net.MVC Example</title>
    </head>
    <body>
        <ext:ResourceManager runat="server" />
        <ext:Window 
            runat="server" 
            Width="300" 
            Height="150" 
            Layout="FitLayout">
            <Items>
                <ext:FormPanel runat="server" Layout="FitLayout">
                    <Items>
                        <ext:GridPanel ID="GridPanel1" runat="server" AutoHeight="true">
                            <Store>
                                <ext:Store runat="server">
                                    <Reader>
                                        <ext:ArrayReader>
                                            <Fields>
                                                <ext:RecordField Name="test1" />
                                                <ext:RecordField Name="test2" />
                                                <ext:RecordField Name="test3" />
                                            </Fields>
                                        </ext:ArrayReader>
                                    </Reader>
                                </ext:Store>
                            </Store>
                            <ColumnModel runat="server">
                                <Columns>
                                    <ext:Column Header="Test1" DataIndex="test1" />
                                    <ext:Column Header="Test2" DataIndex="test2" />
                                    <ext:Column Header="Test3" DataIndex="test3" />
                                </Columns>
                            </ColumnModel>
                            <TopBar>
                                <ext:Toolbar runat="server">
                                    <Items>
                                        <ext:ToolbarFill runat="server" />
                                        <ext:Button runat="server" Text="To XML" Icon="PageCode">
                                            <DirectEvents>
                                                <Click Url="/Data/ExportToXml" IsUpload="true">
                                                    <ExtraParams>
                                                        <ext:Parameter 
                                                            Name="data" 
                                                            Value="#{GridPanel1}.getRowsValues()" 
                                                            Mode="Raw" 
                                                            Encode="true" />
                                                    </ExtraParams>
                                                </Click>
                                            </DirectEvents>
                                        </ext:Button>
                                    </Items>
                                </ext:Toolbar>
                            </TopBar>
                        </ext:GridPanel>
                    </Items>
                </ext:FormPanel>
            </Items>
        </ext:Window>
    </body>
    </html>
    Example Action
    public ActionResult ExportToXml(string data)
    {
        Ext.Net.SubmitHandler submitData = new Ext.Net.SubmitHandler(data);
        XmlNode xml = submitData.Xml;
        var result = new FileContentResult(Encoding.UTF8.GetBytes(xml.OuterXml), "application/xml");
        result.FileDownloadName = string.Format("Temp.xml");
        return result;
    }
  3. #3
    Ok,

    Thank you very much.

    I notice the error was because we have a FuleUpload HttpModule and DirectEvents have defined IsUpload parameter.

    Now all works except CSV format. With code shown at first post, we have this error:

    Token Text in state Start would result in an invalid XML document. Make sure that the ConformanceLevel setting is set to ConformanceLevel.Fragment or ConformanceLevel.Auto if you want to write an XML fragment.

    Xsl file is next one:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text" />
    
    	<xsl:template match="records">
    		<xsl:apply-templates select="record" />
    	</xsl:template>
    
    	<xsl:template match="record">
    		<xsl:for-each select="*">
    			<xsl:text>"</xsl:text>	
    			<xsl:value-of select="." />
    			<xsl:text>"</xsl:text>
    			
    			<xsl:if test="position() != last()">
    				<xsl:value-of select="','" />
    			</xsl:if>
    		</xsl:for-each>
    		<xsl:text>
    </xsl:text>
    	</xsl:template>
    
    </xsl:stylesheet>
    Thanks.
  4. #4
    Well, I'm not the best in exporting data to files, xsl, etc.

    But I will try to help you if you provide me with simplified controller action code how you are trying, like that one I provided you.
  5. #5
    Hi again,

    The controller code is shown in my first post.

    Regards.
  6. #6
    Hi,

    We are not XSLT experts. It is better to redirect this question to specialized XSLT forums
    XSLT from the Ext.Net example was found in open source examples, it is not part of Ext.Net and we don't guarantee that XSLT transformation file will work correctly always
  7. #7
    Can you simplify the code removing the non required things to reproduce the problem?
  8. #8
    Hi again,

    That's the code needed to reprocude the problem:

    Controller:

            public ActionResult Export(string data, string format)
            {
                Ext.Net.SubmitHandler submitData = new Ext.Net.SubmitHandler(data); 
                XmlNode xml = submitData.Xml; 
                string contentType = string.Empty;
                byte[] resultFileContent = System.Text.Encoding.UTF8.GetBytes(xml.OuterXml);
    
                switch (format)
                {
                    case "xml":
                        contentType = "application/xml";
                        break;
    
                    case "xls":
                    case "csv":
                        XslCompiledTransform transform = new XslCompiledTransform();
    
                        if (format == "xls")
                        {
                            contentType = "application/vnd.ms-excel";
                            transform.Load(Server.MapPath("~/Resources/xsl/Excel.xsl")); 
                        }
                        else
                        {
                            contentType = "application/octet-stream";
                            transform.Load(Server.MapPath("~/Resources/xsl/Csv.xsl")); 
                        }
    
                        MemoryStream m = new MemoryStream(resultFileContent); 
                        XPathDocument xpathDoc = new XPathDocument(new StreamReader(m));  
                        StringBuilder resultString = new StringBuilder(); 
                        XmlWriter writer = XmlWriter.Create(resultString);
                        transform.Transform(xpathDoc, writer);
                        resultFileContent = Encoding.UTF8.GetBytes(resultString.ToString());
                        break;
                }
    
                var result = new FileContentResult(resultFileContent, contentType);
                result.FileDownloadName = string.Format("TempoMillenium.{0}", format); 
                return result; 
            }
    View:

    <%@ Page Language="C#" %>
      
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
      
    <script runat="server"> 
        protected void Page_Load(object sender, EventArgs e) 
        { 
            if (!X.IsAjaxRequest) 
            { 
                Store store = this.GridPanel1.GetStore(); 
                store.DataSource = new object[]  
                {  
                    new object[] { "test11", "test12", "test13" }, 
                    new object[] { "test12", "test22", "test23" }, 
                    new object[] { "test13", "test32", "test33" } 
                }; 
                store.DataBind(); 
            } 
        } 
    </script> 
      
    <!DOCTYPE html> 
    <html> 
    <head runat="server"> 
        <title>Ext.Net.MVC Example</title> 
    </head> 
    <body> 
        <ext:ResourceManager runat="server" /> 
        <ext:Window 
            runat="server" 
            Width="300" 
            Height="150" 
            Layout="FitLayout"> 
            <Items> 
                <ext:FormPanel runat="server" Layout="FitLayout"> 
                    <Items> 
                        <ext:GridPanel ID="GridPanel1" runat="server" AutoHeight="true"> 
                            <Store> 
                                <ext:Store runat="server"> 
                                    <Reader> 
                                        <ext:ArrayReader> 
                                            <Fields> 
                                                <ext:RecordField Name="test1" /> 
                                                <ext:RecordField Name="test2" /> 
                                                <ext:RecordField Name="test3" /> 
                                            </Fields> 
                                        </ext:ArrayReader> 
                                    </Reader> 
                                </ext:Store> 
                            </Store> 
                            <ColumnModel runat="server"> 
                                <Columns> 
                                    <ext:Column Header="Test1" DataIndex="test1" /> 
                                    <ext:Column Header="Test2" DataIndex="test2" /> 
                                    <ext:Column Header="Test3" DataIndex="test3" /> 
                                </Columns> 
                            </ColumnModel> 
                            <TopBar> 
                                <ext:Toolbar runat="server"> 
                                    <Items> 
                                        <ext:ToolbarFill runat="server" /> 
                                        <ext:Button runat="server" Text="To XML" Icon="PageCode"> 
                                            <DirectEvents> 
                                                <Click Url="/Data/Export" IsUpload="true"> 
                                                    <ExtraParams> 
                                                        <ext:Parameter 
                                                            Name="data" 
                                                            Value="#{GridPanel1}.getRowsValues()" 
                                                            Mode="Raw" 
                                                            Encode="true" />
                                                            <ext:Parameter Name="format" Value="xml" Mode="Value" />  
                                                    </ExtraParams> 
                                                </Click> 
                                            </DirectEvents> 
                                        </ext:Button> 
                                        <ext:Button runat="server" Text="To Excel" Icon="PageExcel"> 
                                            <DirectEvents> 
                                                <Click Url="/Data/Export" IsUpload="true"> 
                                                    <ExtraParams> 
                                                        <ext:Parameter 
                                                            Name="data" 
                                                            Value="#{GridPanel1}.getRowsValues()" 
                                                            Mode="Raw" 
                                                            Encode="true" />
                                                            <ext:Parameter Name="format" Value="xsl" Mode="Value" />  
                                                    </ExtraParams> 
                                                </Click> 
                                            </DirectEvents> 
                                        </ext:Button> 
                                        <ext:Button runat="server" Text="To CSV" Icon="PageAttach"> 
                                            <DirectEvents> 
                                                <Click Url="/Data/Export" IsUpload="true"> 
                                                    <ExtraParams> 
                                                        <ext:Parameter 
                                                            Name="data" 
                                                            Value="#{GridPanel1}.getRowsValues()" 
                                                            Mode="Raw" 
                                                            Encode="true" />
                                                            <ext:Parameter Name="format" Value="csv" Mode="Value" />  
                                                    </ExtraParams> 
                                                </Click> 
                                            </DirectEvents> 
                                        </ext:Button> 
                                    </Items> 
                                </ext:Toolbar> 
                            </TopBar> 
                        </ext:GridPanel> 
                    </Items> 
                </ext:FormPanel> 
            </Items> 
        </ext:Window> 
    </body> 
    </html>
    Regards.
  9. #9
    Did you follow the recommendation from the exception about ConformanceLevel?

    Example
    XmlWriterSettings settings = new XmlWriterSettings()
    {
        ConformanceLevel = ConformanceLevel.Auto
    };
    XmlWriter writer = XmlWriter.Create(s, settings);
    The following controller action appears to be working fine.

    Example Action
    public ActionResult Export(string data, string format)
    {
        Ext.Net.SubmitHandler submitData = new Ext.Net.SubmitHandler(data);
        XmlNode xml = submitData.Xml;
    
        XslCompiledTransform xtCsv = new XslCompiledTransform();
        xtCsv.Load(Server.MapPath("/Resources/xsl/Csv.xsl"));
        StringBuilder s = new StringBuilder();
        XmlWriterSettings settings = new XmlWriterSettings()
        {
            ConformanceLevel = ConformanceLevel.Auto
        };
        XmlWriter writer = XmlWriter.Create(s, settings);
        xtCsv.Transform(xml, writer);
    
        var result = new FileContentResult(Encoding.UTF8.GetBytes(s.ToString()), "application/octet-stream");
        result.FileDownloadName = "Temp.csv";
        return result;
    }
  10. #10
    Yes, it works!

    Thank you very much for your kind help.

Similar Threads

  1. [CLOSED] [1.0] MVC Grid/Store Export to .xls/.csv/.xml Error
    By rcaunt in forum 1.x Legacy Premium Help
    Replies: 34
    Last Post: Feb 13, 2014, 1:26 PM
  2. [CLOSED] how to export few columns from grid store to excel?
    By rnachman in forum 1.x Legacy Premium Help
    Replies: 1
    Last Post: Mar 28, 2012, 8:32 PM
  3. [CLOSED] Export dynamically created Grid/Store
    By CarWise in forum 1.x Legacy Premium Help
    Replies: 1
    Last Post: May 05, 2011, 12:40 PM
  4. Replies: 1
    Last Post: Apr 19, 2010, 2:44 PM
  5. Can we export all store's data?
    By xerobiker in forum 1.x Help
    Replies: 16
    Last Post: Apr 01, 2010, 12:10 PM

Tags for this Thread

Posting Permissions