84 messaggi dal 21 ottobre 2004
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.

Carpe Diem.
141 messaggi dal 21 febbraio 2002
www.melisweb.eu
Non ho capito allora perchè devi fare il response verso il client del foglio excel che hai appena creato.

Non fai prima ad aprire uno StreamWriter (la butto li) che ti salva dove vuoi (SOLO SUL SERVER!) e al client gli fai vedere quello che vuoi...

A.

On 8 May 2007 10:55:42 +0200, mimmoronci <daemon@forum.aspitalia.com> wrote:
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_We dsExport, sHeaders, sFileds, FileName);
}
catch(Exception Ex)
{
throw Ex;
}
}

private void Export_with_XSLT_We 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.UTF ;
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 utput");
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 alue-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 alue-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.
--
Carpe Diem.


Per modificare la tua iscrizione:
http://forum.aspitalia.com/forum/user/ml.aspx



]aMelix[
-------------------------------
http://www.melisweb.eu/
http://www.puntodidomanda.com/
http://www.cucinamore.com/
-------------------------------

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.