Il est facile de créer un tableau Excel local dans Asp.net et de le diffuser à partir du serveur, mais il est difficile de supprimer le processus Excel.exe intégré. N'ouvrez donc pas le gestionnaire de tâches pour voir si les éléments liés au processus Excel.exe sont toujours en mémoire. Je propose ici une solution, qui propose deux méthodes :
"CreateExcelWorkbook" (décrit comment créer un classeur Excel) Cette méthode exécute une procédure stockée, renvoie un DataReader et génère un classeur Excel basé sur le DataReader, l'enregistre dans le système de fichiers et crée une connexion de "téléchargement" afin que l'utilisateur peut télécharger Excel Le tableau peut être importé dans le navigateur ou téléchargé directement sur la machine.
La deuxième méthode : GenerateCSVReport fait essentiellement la même chose, sauf qu'elle enregistre le fichier au format CSV. Toujours importé dans Excel, le code CSV peut résoudre un problème courant en développement : vous avez plusieurs zéros versés dans une colonne, et le code CSV peut garantir que les zéros ne sont pas vides. (Explication : c'est le problème que plusieurs valeurs zéro ne peuvent pas être enregistrées dans le tableau Excel)
La solution téléchargeable contient une classe valide « SPGen » qui exécute une procédure stockée et renvoie un DataReader, ainsi qu'une méthode de suppression qui supprime les fichiers plus anciens qu'une valeur temporelle spécifique. La méthode principale qui apparaît ci-dessous est CreateExcelWorkbook
Remarque : Vous devez savoir que lors de l'exécution de cette page, vous aurez peut-être besoin de droits d'administrateur pour écrire des fichiers Excel et Csv dans le système de fichiers du serveur WebSever. Le moyen le plus simple de résoudre ce problème consiste à exécuter la page dans son propre dossier et à inclure son propre fichier de configuration. Et ajoutez l'élément suivant Portez une attention particulière au bloc de code suivant, qui efface les objets Excel. // Besoin de tout le code suivant pour nettoyer et éteindre toutes les références !!! Cela est nécessaire car oSheet", "oWb", "oRng" et d'autres objets sont également des instances de COM. Nous avons besoin de la méthode ReleaseComObject de la classe Marshal pour les supprimer des parms .NET private void CreateExcelWorkbook(string spName, SqlParameter[] . ) essayez chaîne de données strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"]; } Ce qui suit est l'article original Créer des classeurs Excel ASP.NET dynamiques en C# par Peter A. Bromberg, Ph.D. Il existe également, dans la solution téléchargeable, une classe d'utilitaire "SPGen" qui gère l'exécution des feuilles de calcul Excel stockées. La génération de feuilles de calcul Excel natives à partir de votre serveur Web n'est pas si difficile avec ASP.NET. Ce qui peut être difficile, c'est de faire disparaître les instances d'Excel.exe. vous n'ouvrez pas TaskMgr et voyez 123 instances d'EXCEL.EXE toujours en mémoire. Je propose ici une solution qui comporte deux méthodes, "CreateExcelWorkbook", qui exécute une procédure stockée qui renvoie un DataReader et assemble un classeur Excel natif à partir de l'enregistre dans le système de fichiers et crée un lien "Télécharger" afin que l'utilisateur puisse soit charger le rapport dans Excel dans son navigateur, soit télécharger le fichier XLS. La deuxième méthode, GenerateCSVReport, fait essentiellement la même chose mais crée un CSV. qui, bien sûr, sera également chargé dans Excel. Le code CSV gère correctement un problème courant des développeurs dans la mesure où si vous avez une colonne comportant des zéros non significatifs, ils sont conservés. procédures et renvoyant des DataReaders, ainsi qu'une méthode utilitaire RemoveFiles qui nettoie tout fichier XLS ou CSV plus ancien que le nombre de minutes spécifié. La méthode clé présentée ci-dessous est la méthode CreateExcelWorkbook. REMARQUE : vous devez savoir que vous devrez probablement l'exécuter. page sous un compte disposant de privilèges administratifs car il a besoin d'autorisations d'écriture pour stocker les fichiers Excel ou CSV générés sur le système de fichiers du serveur Web. Le moyen le plus simple de gérer cela est probablement d'avoir la page dans son propre dossier avec son propre web.config, et insérez un élément Notez surtout le bloc de code qui fait le "nettoyage" des objets Excel : // Besoin de tout le code suivant pour nettoyer et éteindre toutes les références !!! Ceci est nécessaire car tous ces petits objets "oSheet", "oWb", "oRng", etc. sont tous des instances COM et nous devons utiliser la méthode InteropServices ReleaseComObject de la classe Marshal pour nous en débarrasser dans .NET . CreateExcelWorkbook (chaîne spName, paramètres SqlParameter[]) essayez chaîne de données strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"]; } http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html
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);
oFeuille=null ;
oWB = nul ;
oXL = nul ;
GC.Collect(); // force le nettoyage final !
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // méthode utilitaire pour nettoyer les anciens fichiers
Excel.Application oXL ;
Excel._Workbook oWB ;
Excel._Worksheet oFeuille ;
Excel.Range ouRng;
{
GC.Collect();// nettoie tous les autres gars d'Excel qui traînent...
oXL = nouveau Excel.Application();
oXL.Visible = faux ;
//Obtenir un nouveau classeur.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oFeuille = (Excel._Worksheet)oWB.ActiveSheet ;
// récupère notre
SPGen sg = nouveau SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Créer un en-tête et une feuille...
int iRow =2;
pour(int j=0;j
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// construit le contenu de la feuille
tandis que (myReader.Read())
{
pour(int k=0;k < monLecteur.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++ ;
}//fin pendant
monLecteur.Close();
monLecteur=null ;
//Format A1:Z1 en gras, alignement vertical = centre.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Ajustement automatique des colonnes A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = faux ;
oXL.UserControl = faux ;
string strFile ="rapport" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// Besoin de tout le code suivant pour nettoyer et éteindre toutes les références !!!
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);
oFeuille=null ;
oWB = nul ;
oXL = nul ;
GC.Collect(); // force le nettoyage final !
chaîne strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="Télécharger le rapport"
catch(Exception l'Exception)
{
Chaîne errorMessage ;
message d'erreur = "Erreur : " ;
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Ligne : " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= message d'erreur ;
}
}
Version imprimable
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);
oFeuille=null ;
oWB = nul ;
oXL = nul ;
GC.Collect(); // force le nettoyage final !
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // méthode utilitaire pour nettoyer les anciens fichiers
Excel.Application oXL ;
Excel._Workbook oWB ;
Excel._Worksheet oFeuille ;
Excel.Range ouRng;
{
GC.Collect();// nettoie tous les autres gars d'Excel qui traînent...
oXL = nouveau Excel.Application();
oXL.Visible = faux ;
//Obtenir un nouveau classeur.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oFeuille = (Excel._Worksheet)oWB.ActiveSheet ;
// récupère notre
SPGen sg = nouveau SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Créer un en-tête et une feuille...
int iRow =2;
pour(int j=0;j
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// construit le contenu de la feuille
tandis que (myReader.Read())
{
pour(int k=0;k < monLecteur.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++ ;
}//fin pendant
monLecteur.Close();
monLecteur=null ;
//Format A1:Z1 en gras, alignement vertical = centre.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Ajustement automatique des colonnes A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = faux ;
oXL.UserControl = faux ;
string strFile ="rapport" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// Besoin de tout le code suivant pour nettoyer et éteindre toutes les références !!!
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);
oFeuille=null ;
oWB = nul ;
oXL = nul ;
GC.Collect(); // force le nettoyage final !
chaîne strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="Télécharger le rapport"
catch(Exception l'Exception)
{
Chaîne errorMessage ;
message d'erreur = "Erreur : " ;
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Ligne : " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= message d'erreur ;
}
}
-Traduit à la hâte, pardonnez-moi s'il y a des erreurs. Bienvenue pour donner des conseils et discuter ---Xiao Xu