miércoles, 30 de septiembre de 2009

Exporting a Datagrid to Excel using AS3 and .NET

I haven't found on the Internet any complete solution for this problem using C# as the calling page receiving the Request object, so that's why I post it here. Hope this helps.

AS3 (Flex) code (taken from WiredWizard Web Design blog):


//Filename: Test_AS32XLS.mxml




import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.core.UIComponent;
import mx.core.Container;
import mx.events.ItemClickEvent;
import mx.utils.ObjectProxy;
import flash.errors.*;
import flash.events.*;
import flash.external.*;
import flash.net.URLLoader;
import flash.net.URLVariables;
import flash.net.URLRequest;

public var urlExcelExport:String = "here you need to write your url reference to SaveToXLFile.aspx";

[Bindable]
private var initialData:ArrayCollection;

private function initApp():void {
initialData = new ArrayCollection([{first:'aaa', last:'zzz', email:'email1@email.com'},
{first:'bbb', last:'yyy', email:'email2@email2.com'}]);
}

private function loadDGInExcel():void {
var variables:URLVariables = new URLVariables();
variables.XLtabletoconvert = convertDGToHTMLTable();

var u:URLRequest = new URLRequest(urlExcelExport);
u.data = variables;
u.method = URLRequestMethod.POST;

navigateToURL(u,"_self");
}

private function convertDGToHTMLTable():String {

dg.setStyle("headerColor","#33FFFF");
dg.setStyle("themeColor","#33FF00");

var font:String = dg.getStyle('fontFamily');
var size:String = dg.getStyle('fontSize');
var str:String = '';
var colors:String = '';
var style:String = 'style="font-family:'+font+';font-size:' + size + 'pt;"';
var hcolor:Array;

if(dg.getStyle("headerColor") != undefined) {
hcolor = [dg.getStyle("headerColor")];
} else {
hcolor = dg.getStyle("headerColors");
}

str+= '';

for(var i:int = 0;i colors = dg.getStyle("themeColor");

if(dg.columns[i].headerText != undefined) {
str+="
";
} else {
str+= "";
}
}
str += "";
colors = dg.getStyle("alternatingRowColors");
for(var j:int =0; j str+="";

for(var k:int=0; k < dg.columns.length; k++) {
if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {

if(dg.columns[k].labelFunction != undefined) {
str += "";

} else {
str += "";
}
}
}
str += "";
}
str+="
"+dg.columns[i].headerText+""+dg.columns[i].dataField+"
"+dg.columns[k].labelFunction( dg.dataProvider.getItemAt(j), dg.columns[k].dataField) + " " + dg.dataProvider.getItemAt(j)[dg.columns[k].dataField] + "
";

return str;
}
]]>














C# code:

// Filename: SaveToXLFile.aspx.cs
public partial class SaveToXLFile : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Change the response headers to output a Temporal XL File
Response.Clear();
Response.ContentType = "application/ms-excel";
Response.AddHeader("content-disposition", "attachment;filename=myfilename.xls");
// Get the variable and write it to the Response object
String x = Request["XLtabletoconvert"];
Response.Write(x);
Response.Flush();
Response.End();

}
}


Also, due to .NET Framework validation of Request object not to get cross-coding, you'll need to add in your SaveToXLFile.aspx the following directive:


<%@ Page ValidateRequest="false" ...

4 comentarios:

Porerror dijo...

Tu peor post! :(

Pedja dijo...

Es ésta la tercera entrega de la teoría de la evolución, es éste el primer ser vivo del que descendemos todos??? Lo digo porque complejo desde luego que lo es....

Kike dijo...

Jeje, no se si esto ha sido un error o no... pero es un tema relacionado con mi trabajo... He estado una mañana haciendo esto, y buscando lo que habia por internet, y como no encontre exactamente lo que buscaba, pues lo publico aqui con la esperanza de que alguno mas que lo busque lo encuentre... Los informaticos somos asi, con tal de no trabajar, trabajamos para que nos den las respuestas (a eso nos referimos como "no hay que reinventar la rueda" <--- lease, lo busco en internet, copio y pego)

Rocío dijo...

WTF?
Eres el Risto Mejide de los blogs. BASTA!

sholode