ciao a tutti,
dovrei creare un excel con i dati contenuti in una gridview salvare questo excel sul server in un path specifico senza che l'utente se ne accorga.
la strada che sto seguendo è la seguente:
ho una classe a cui vanno passati un datatable e il path del file da creare.
classe:
public class ExportData
{
System.Web.HttpResponse response;
public ExportData()
{
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.");
DataSet dsExport = new DataSet("Export");
DataTable dtExport = DetailsTable.Copy();
dtExport.TableName = "Values";
dsExport.Tables.Add(dtExport);
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].Caption;
sFileds[i] = 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
{
response.Clear();
response.Buffer= true;
response.ContentType = "application/vnd.ms-excel";
response.AppendHeader("content-disposition", "attachment; filename=" + FileName);
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);
response.Write(sw.ToString());
sw.Close();
writer.Close();
stream.Close();
response.End();
}
catch(ThreadAbortException Ex)
{
string ErrMsg = Ex.Message;
}
catch(Exception Ex)
{
throw Ex;
}
}
private void CreateStylesheet(XmlTextWriter writer, string[] sHeaders, string[] sFileds)
{
try
{
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( );
writer.WriteStartElement("xsl:template");
writer.WriteAttributeString("match","/");
for(int i=0; i< sHeaders.Length; i++)
{
writer.WriteString("\"");
writer.WriteStartElement("xsl:value-of");
writer.WriteAttributeString("select", "'" + sHeaders[i] + "'");
writer.WriteEndElement( );
writer.WriteString("\"");
if (i != sFileds.Length - 1) writer.WriteString("");
}
writer.WriteStartElement("xsl:for-each");
writer.WriteAttributeString("select","Export/Values");
writer.WriteString("\r\n");
for(int i=0; i< sFileds.Length; i++)
{
writer.WriteString("\"");
writer.WriteStartElement("xsl:value-of");
writer.WriteAttributeString("select", sFileds[i]);
writer.WriteEndElement( );
writer.WriteString("\"");
if (i != sFileds.Length - 1) writer.WriteString("");
}
writer.WriteEndElement( );
writer.WriteEndElement( );
writer.WriteEndElement( );
writer.WriteEndDocument( );
}
catch(Exception Ex)
{
throw Ex;
}
}
}
la istanzio cosi...
DataTable dtExcel = dsExcel.Tables[0].Copy();
string path = Request.PhysicalApplicationPat + "sorgente.xls";
ExportData EdExcel = new ExportData();
EdExcel.ExportDetails(dtExcel,path);
sembra che vada in errore sul response.End() ultima istruzione del metodo Export_with_XSLT_Web della classe.Cmq il programma va avanti e viene fuori la finestra apri o salva.il file excel viene creato correttamente.
come potrei salvarlo direttamente sul server senza che l'utente se ne accorga?
nel metodo Export_with_XSLT_Web dove faccio response.Write(sw.ToString());
e quindi viene fuori apri o salva...vorrei che il file venisse salvato sul server e basta....non ci riesco...credo che debba creare un file con sw e poi salvarlo ma non so neanche se è possibile..
spero di non essere stato troppo contorto
grazie.