74 messaggi dal 06 settembre 2002
per favore: ho bisogno di un aiuto... su questo problema sto perdendo la testa da giorni...

Si tratta di questo: debbo sviluppare una pagina asp.net (c#) che mi generi un file excel (il quale conterrà un certo report in base ad una serie di dati... bla bla bla)

Sono ancora fermo alla fase di test...

allora:
Il sistema sul quale sto testando è windows xp professional con net framework 2.0 e office 2007 eng version.

Mi sono installato le PIAs (http://www.microsoft.com/downloads/details.aspx?familyid=59daebaa-bed4-4282-a28c-b864d8bfa513&displaylang=en) ed ho importato nella bin dell'applicazione le seguenti dll

- Interop.Excel.dll
- Interop.Microsoft.Office.Core.dll
- Interop.Microsoft.Office.Interop.Excel.dll
- Interop.Office.dll
- Interop.VBIDE.dll

Sto lavorando ad una semplice pagina di test che genera (dovrebbe generare) un file excel...

questo il codice (il try {} catch {} è commentato...) :

public void Create()
{
System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

string strCurrentDir = "c:\\il_path_prescelto\\";
Microsoft.Office.Interop.Excel.Application oXL;
Microsoft.Office.Interop.Excel._Workbook oWB;
Microsoft.Office.Interop.Excel._Worksheet oSheet;
Microsoft.Office.Interop.Excel.Range oRng;
//try
{
GC.Collect();// clean up any other excel guys hangin' around...
oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.Visible = false;
//Get a new workbook.
oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(System.Reflection.Missing.Value));
oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;

//get our Data
oSheet.Cells[1, 1] = "ci metto questo";

//Format A1:Z1 as bold, vertical alignment = center.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
//AutoFit columns A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();

oXL.Visible = false;
oXL.UserControl = false;
string strFile = "report" + System.DateTime.Now.Ticks.ToString() + ".xls";
oWB.SaveAs(
strCurrentDir + strFile
, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal
, null, null, false, false
, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, false, false, null, null, null
);
// Need all following code to clean up and extingush all references!!!
oWB.Close(null, null, null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oWB);
oSheet = null;
oWB = null;
oXL = null;
GC.Collect(); // force final cleanup!
}
/*
catch (Exception theException)
{
String errorMessage;
errorMessage = "Error: ";
errorMessage = String.Concat(errorMessage, theException.Message);
errorMessage = String.Concat(errorMessage, " Line: ");
errorMessage = String.Concat(errorMessage, theException.Source);
//Response.Write( errorMessage );
}
*/
}
}

protected void Page_Load(Object sender, EventArgs e)
{
ExcelCreator my_excelCreator = new ExcelCreator();
my_excelCreator.Create();
}

Ebbene... quando provo a lanciare la pagina vien fuori questo errore:
-------------------------------------------------------------------------------

Microsoft Office Excel cannot open or save any more documents because there is not enough available memory or disk space.

• To make more memory available, close workbooks or programs you no longer need.

• To free disk space, delete files you no longer need from the disk you are saving to.
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.Runtime.InteropServices.COMException: Microsoft Office Excel cannot open or save any more documents because there is not enough available memory or disk space.

• To make more memory available, close workbooks or programs you no longer need.

• To free disk space, delete files you no longer need from the disk you are saving to.

Errore nel codice sorgente:


Riga 29: oXL.Visible = false;
Riga 30: //Get a new workbook.
Riga 31: oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(System.Reflection.Missing.Value));
Riga 32: oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;
Riga 33:


File di origine: c:\Inetpub\wwwroot\STYLGRAND\excel_doc.aspx Riga: 31

-------------------------------------------------------------------------------

Proprio non capisco che razza dfi errore possa essere... escludo assolutamente si tratti di un problema di memoria (da task manager la situazione appare assolutamente normale).

Vi prego vi prego... sono giorni e giorni che vado errando su google alla ricerca di una soluzione...
Qualcuno di quelli che legge questo forum ha mai generato un file excel con le PIAs? Mi date una dritta per favore?

Grazie infinite,
Francesco.
43 messaggi dal 03 luglio 2006
Ciao,

ti rispondo di fretta, anche se io ho usato il Late Bindig al posto della PIA. Ho risolto.

Potrebbe esserti dare un'occhiata qui http://blogs.ugidotnet.org/liberobalsamo/articles/85943.aspx


Sem

Sem Tamburella
43 messaggi dal 03 luglio 2006
Lupo ha scritto:


Ebbene... quando provo a lanciare la pagina vien fuori questo errore:
-------------------------------------------------------------------------------

Microsoft Office Excel cannot open or save any more documents because there is not enough available memory or disk space.

• To make more memory available, close workbooks or programs you no longer need.

• To free disk space, delete files you no longer need from the disk you are saving to.
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.Runtime.InteropServices.COMException: Microsoft Office Excel cannot open or save any more documents because there is not enough available memory or disk space.

• To make more memory available, close workbooks or programs you no longer need.

• To free disk space, delete files you no longer need from the disk you are saving to.

Errore nel codice sorgente:


Riga 29: oXL.Visible = false;
Riga 30: //Get a new workbook.
Riga 31: oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(System.Reflection.Missing.Value));
Riga 32: oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;
Riga 33:


File di origine: c:\Inetpub\wwwroot\STYLGRAND\excel_doc.aspx Riga: 31



Hai mai controllato quanto spazio libero è rimasto sul tuo disco fisso?

Sem

Sem Tamburella
432 messaggi dal 31 gennaio 2007
Ciao a tutti ,
proprio ieri mi sono imbattuto nella creazione di un file di Excel ed ho utilizzato questo script

public partial class ExportExcel : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Creo manualmente l'istanza del controllo DataGrid
DataGrid grid = new DataGrid();

// chiamo la routine che imposta alcune proprietà di visualizzazione della griglia
SetGridLayout(ref grid);

// chiamo la routine ch emi restituisce una datatable da usare come sorgente dei dati per il report
DataTable dt = CreateDataSource();

// 1) imposto la sorgente dei dati per la griglia
grid.DataSource = dt;
grid.DataBind();

// 2) imposto il tipo di ContentType e la codifica per il Response
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "inline;filename=VimerCommande.xls");
Response.ContentEncoding = System.Text.Encoding.Default;
this.EnableViewState=false;

// 3) creo l'HtmlTextWriter su cui renderizzo la griglia
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
grid.RenderControl(hw);

// 4) ottiene la stringa HTML dallo stream, e lo manda al browser, per essere intrpretato da Excel
string str_tw = tw.ToString();
Response.Write(str_tw);
Response.Flush();
Response.Close();
}

private DataTable CreateDataSource()
{

String connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = connection;
cmd3.CommandText = "SELECT tabella.* "
+ " FROM tabella ";
cmd3.Connection.Open();
SqlDataReader rGriglia = cmd3.ExecuteReader();

// Creo manualmente, a scopo di esempio, l'origine dati da passare come DataSource alla griglia

DataTable dt = new DataTable("worksheet");
dt.Columns.Add(new DataColumn("a", typeof(String)));
dt.Columns.Add(new DataColumn("b", typeof(String)));
dt.Columns.Add(new DataColumn("c", typeof(String)));
dt.Columns.Add(new DataColumn("d", typeof(String)));
dt.Columns.Add(new DataColumn("e", typeof(DateTime)));
dt.Columns.Add(new DataColumn("f", typeof(DateTime)));
dt.Columns.Add(new DataColumn("g", typeof(DateTime)));
dt.Columns.Add(new DataColumn("h", typeof(String)));
dt.Columns.Add(new DataColumn("i", typeof(String)));
object[] values = new object[9];

while (rGriglia.Read())
{

values[0] = rGriglia["a"];
values[1] = rGriglia["b"];
values[2] = rGriglia["c"];
values[3] = rGriglia["d"];
values[4] = rGriglia["e"];
values[5] = rGriglia["f"];
values[6] = rGriglia["g"];
values[7] = rGriglia["h"];
values = rGriglia["i"];
dt.Rows.Add(values);
}
rGriglia.Close();
cmd3.Connection.Close();
return dt;
}

private void SetGridLayout(ref DataGrid grid)
{
grid.ShowHeader = true;
grid.HeaderStyle.BackColor = System.Drawing.Color.Orange;
grid.HeaderStyle.Font.Bold = true;
}
}


crea tante righe quanti sono i record della query...
ne ho anche un'altro che recupera i dati direttamente da un gridview

fammi sapere se ti va bene questo, altrimenti ti posto l'altro...

Ciao
74 messaggi dal 06 settembre 2002
sem.tamburella ha scritto:
Ciao,

ti rispondo di fretta, anche se io ho usato il Late Bindig al posto della PIA. Ho risolto.

Potrebbe esserti dare un'occhiata qui http://blogs.ugidotnet.org/liberobalsamo/articles/85943.aspx


Sem


Ho scritto persino in India ad un tipo che aveva postato su un forum ( http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?query=+cannot+open+or+save+any+more+documents+because+there+is+not+enough+available+memory+&dg=&cat=en_us_d0f9ba07-9b21-4721-8014-45952da05215&lang=en&cr=us&pt=&catlist=&dglist=&ptlist=&exp=&sloc=en-us ) il mio stesso identico problema. A lui non aveva risposto nessuno. Gli hjo chiesto se nel frattempo avesse trovato la soluzione al problema e questa è stata la laconica risposta di questo gentilissimo programmatore:

--------------------------------------
Hi Francesco,

We were unable to solve the below problem. However, as a case of Urgency, we removed excel 2007 from Live and again installed Excel 2000.

However, our team is still doing RND on the below issue. Once we find the solution, we will surely let you know. J

Regards,

Parag
--------------------------------------


A questo punto il tuo suggerimento per il "Late Bindig" (di cui ignoravo completamente l'esistenza) diventa molto interessante...

Vorrei approfittare ancora della tua gentilezza per chiederti se, sul web è possibile trovare qualche riferimento per l'utilizzo del "late binding" con asp.net (meglio se con c#)...

DI nuovo grazie infinite,
Francesco.
74 messaggi dal 06 settembre 2002
sem.tamburella ha scritto:

Hai mai controllato quanto spazio libero è rimasto sul tuo disco fisso?

Sem


Tipo una 50na di giga :( ...
74 messaggi dal 06 settembre 2002
Allora: il codice che si trova a questo indirizzo:
http://blogs.ugidotnet.org/liberobalsamo/articles/85943.aspx?Pending=true

FUNZIONAAAAAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!
Un milione di grazie a chi mi ha suggerito il link ed anche a tutti gli altri che hanno partecipato alla discussione!!!!

Siete tutti dei grandissimiiiiiiiiiiiiiiiiiiiiiiiiii!!!!!!!!!!!!!!!!!!

Viva la asp.net!!!!!!!
Viva aspitalia!!!!!!!!!!!
74 messaggi dal 06 settembre 2002
Attenzione: con il codice suggerito (che ribadisco funziona) c'è un problema. Allla fine della procedura rimane un processo excel.exe attivo.

Si può rimediare lanciando, alla fine delle operazioni, questa ulteriore procedura che ho trovato nel web:

private void kill()
{
// uccide i processi excel attivi
System.Diagnostics.Process[] PROC = System.Diagnostics.Process.GetProcessesByName("EXCEL");
foreach (System.Diagnostics.Process PK in PROC)
{//User excel process always have window name
//COM process do not.
if (PK.MainWindowTitle.Length == 0)
PK.Kill();
}
}

di nuovo saluti a tutti e di nuovo grazie!!

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.