Os pongo la clase que uso cuando quiero exportar un DataTable a un archivo Excel (XLS). El DataTable se puede rellenar con un GridView, el contenido de una base de datos, el contenido de una tabla… La conversión se hace pasando el contenido a XML y luego con un StreamWriter cargamos el Response que mostrará un Mensaje en el Navegador para descargarnos el archivo generado.
public class Export
{
System.Web.HttpResponse response;
public Export()
{
response = System.Web.HttpContext.Current.Response;
}
public void ExportDetails(DataTable DetailsTable, string FileName)
{
try
{
if (DetailsTable.Rows.Count == 0)
throw new Exception(”There are no details to export.”);
// Creamos el Dataset
DataSet dsExport = new DataSet(”Export”);
DataTable dtExport = DetailsTable.Copy();
dtExport.TableName = “Values”;
dsExport.Tables.Add(dtExport);
// Obtenemos el nombre de las celdas
string[] sHeaders = new string[dtExport.Columns.Count];
string[] sFileds = new string[dtExport.Columns.Count];
for (int i = 0; i < dtExport.Columns.Count; i++)
{
sHeaders[i] = dtExport.Columns[i].ColumnName;
sFileds[i] = ReplaceSpclChars(dtExport.Columns[i].ColumnName);
}
Export_with_XSLT_Web(dsExport, sHeaders, sFileds,FileName);
}
catch (Exception Ex)
{
throw Ex;
}
}
private void Export_with_XSLT_Web(DataSet dsExport, string[] sHeaders, string[] sFileds, string FileName)
{
try
{
// Añadimos las cabeceras
response.Clear();
response.Buffer = true;
response.AddHeader(”accept-ranges”, “bytes”);
response.AppendHeader(”Pragma”, “cache”);
response.ContentType = “application/vnd.ms-excel”;
response.AppendHeader(”content-disposition”, “attachment; filename=” + FileName);
response.Charset = “UTF-8″;
response.ContentEncoding = System.Text.Encoding.Default;
MemoryStream stream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);
CreateStylesheet(writer, sHeaders, sFileds);
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
XslTransform xslTran = new XslTransform();
xslTran.Load(new XmlTextReader(stream), null, null);
System.IO.StringWriter sw = new System.IO.StringWriter();
xslTran.Transform(xmlDoc, null, sw, null);
//Escribimos el contenido y se muestra el Box para descargarlo
response.Write(sw.ToString());
sw.Close();
writer.Close();
stream.Close();
response.End();
}
catch (ThreadAbortException Ex)
{
string ErrMsg = Ex.Message;
}
catch (Exception Ex)
{
throw Ex;
}
}
// Creamos el XML con el formato de la tabla
private void CreateStylesheet(XmlTextWriter writer, string[] sHeaders, string[] sFileds)
{
try
{
// xsl:stylesheet
string ns = “http://www.w3.org/1999/XSL/Transform”;
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement(”xsl”, “stylesheet”, ns);
writer.WriteAttributeString(”version”, “1.0″);
writer.WriteStartElement(”xsl:output”);
writer.WriteAttributeString(”method”, “text”);
writer.WriteAttributeString(”version”, “4.0″);
writer.WriteEndElement();
// xsl-template
writer.WriteStartElement(”xsl:template”);
writer.WriteAttributeString(”match”, “/”);
// xsl:value-of for headers
for (int i = 0; i < sHeaders.Length; i++)
{
writer.WriteString(”\”");
writer.WriteStartElement(”xsl:value-of”);
writer.WriteAttributeString(”select”, “‘” + sHeaders[i] + “‘”);
writer.WriteEndElement(); // xsl:value-of
writer.WriteString(”\”");
if (i != sFileds.Length – 1) writer.WriteString(” ”);
}
// xsl:for-each
writer.WriteStartElement(”xsl:for-each”);
writer.WriteAttributeString(”select”, “Export/Values”);
writer.WriteString(”\r\n”);
// xsl:value-of for data fields
for (int i = 0; i < sFileds.Length; i++)
{
writer.WriteString(”\”");
writer.WriteStartElement(”xsl:value-of”);
writer.WriteAttributeString(”select”, sFileds[i]);
writer.WriteEndElement(); // xsl:value-of
writer.WriteString(”\”");
if (i != sFileds.Length – 1) writer.WriteString(” ”);
}
writer.WriteEndElement(); // xsl:for-each
writer.WriteEndElement(); // xsl-template
writer.WriteEndElement(); // xsl:stylesheet
writer.WriteEndDocument();
}
catch (Exception Ex)
{
throw Ex;
}
}
// Reemplazamos los carácteres especiales por códigos XML
private string ReplaceSpclChars(string fieldName)
{
fieldName = fieldName.Replace(” “, “_x0020_”); //espacio
fieldName = fieldName.Replace(”%”, “_x0025_”);
fieldName = fieldName.Replace(”#”, “_x0023_”);
fieldName = fieldName.Replace(”&”, “_x0026_”);
fieldName = fieldName.Replace(”/”, “_x002F_”);
return fieldName;
}
}
Está hecho en C# pero portarla a Visual Basic.Net es muy fácil.
Es muy fácil de usar, en Visual Studio crear una clase nueva con este contenido, y desde vuestro proyecto (Web Form) haceis una llamada como la siguiente:
DataTable dt = new DataTable();
//cargar dt con el contenido de una base de datos, tabla, gridview…
Export exp = new Export();
exp.ExportDetails(dt, “C:\\pruebaexport.xls”);
No comments yet.
RSS feed for comments on this post. TrackBack URL
You must be logged in to post a comment.
---