Search code examples
javascriptdocumentclient-sideserver-sidehtml-generation

Save the document generated by javascript


Javascript can manipulate the document the browser is displaying, so the following:

<script>
    document.write("<table><tr><td>Hola</td><td>Adios</td></tr></table>");
</script>

Will make the browser display a table just like if it was the original HTML document:

<table>
    <tr>
        <td>Hola</td>
        <td>Adios</td>
    </tr>
</table>

Is there a way I can save/serve this document content?

Currently we have some nicely generated reports using Ext-js, what I would like to do is to have the "text/html" version of it ( I mean, something that doesn't require javascript )

So at the end of the page I would add a button : "Save as blaba" and the document should display the text/plain version.

The only way I could think right now is, to write the content into a javascript variable like:

 var content = document.toString(); // or something magic like that.
 // post it to the server

Then post that value to the server, and have the server present that value.

 <%=request.getParameter("content-text")%>

But looks very tricky.

Is there an alternative?

EDIT

Ok, I almost got it. Now I just need the new window to pop up so the option "would you like to save it shows"

This is what I've got so far

<script>
    document.write("<div id='content'><table><tr><td>Hola</td><td>Adios</td></tr></table></div>");
    function saveAs(){
        var sMarkup =  document.getElementById('content').innerHTML; 
        var oNewDoc = document.open('application/vnd.ms-excel');        
        oNewDoc.write( sMarkup + "<hr>" );
        oNewDoc.close();
    }
</script>

<input type="button" value="Save as" onClick="saveAs()"/>

The line:

    var oNewDoc = document.open('application/vnd.ms-excel');        

Should specify the new content type, but it is being ignored.


Solution

  • Here's the upgraded version to open the table contents in .xls format.

    <head>
    <script>
    
             document.write("<table id='targetTable'><tr><td>Hola</td><td>Adios</td></tr><tr><td>eins</td><td>zwei</td></table>"); 
            function saveAsXLS()
            {
                var xlObj = new ActiveXObject("Excel.Application");
                var xlBook = xlObj.Workbooks.Add();
                var xlSheet = xlBook.Worksheets(1);
                for (var y=0;y<targetTable.rows.length;y++) // targetTable=id of the table
                {
                    for (var x=0;x<targetTable.rows(y).cells.length;x++)
                    {
                        xlSheet.Cells(y+1,x+1)=targetTable.rows(y).cells(x).innerText;
                    }
                }   
                xlObj.Visible=true;
                document.write("The table contents are opened in a new Excel sheet.");//Print on webpage 
            }
    </script>
    </head>
    <body>  
    <input type="button" value="Open table in Excel!" onclick="saveAsXLS()"/> 
    </body>
    

    This code is tested in IE6 and is using ActiveXObject control.

    • The table I've used here is of order 2x2 and the individual contents are mapped respectively into the excel sheet.
    • Unlike the .doc version, this does not save the file in client's system. It opens the application with the table content and the client has to save it.

    Hope this helps in answering ur question. Lemme know if u face any issues.

    Peace.