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 <identity impersonate ="true" ... dans le fichier de configuration. Vous avez toujours besoin d'un accès en écriture à la liste de contrôle d'accès (ACL) du dossier physique, uniquement pour que l'identité avec laquelle vous exécutez la page dispose d'un accès en écriture. Enfin, vous devez configurer une connexion COM à la bibliothèque de types Excel 9.0 ou Excel 10. , VS.NET Un assembly sera généré pour vous. Je pense que Microsoft a un lien sur son site Web Office pour télécharger l'assemblage initial de Microsoft. (Ce n'est peut-être pas exact, je crois comprendre qu'il s'agit d'un assembly pour .net)
<identity impersonate="true" userName="adminuser" password="adminpass" />
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 !!!
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 !
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[] . )
{
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;
essayez
{
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
chaîne de données strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
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<myReader.FieldCount;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="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Télécharger le rapport</a>"
}
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 ;
}
}
Ce qui suit est l'article original Créer
des classeurs Excel ASP.NET dynamiques en C#
par Peter A. Bromberg, Ph.D.
Version imprimable
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 <identity impersonate ="true" ... Vous devrez peut-être également activer les autorisations ACL sur le dossier physique afin que l'identité sous laquelle la page s'exécute dispose d'autorisations en écriture. Référence COM à la bibliothèque de types Excel 9.0 ou Excel 10 et laissez VS.NET générer les assemblys d'interopérabilité pour vous. Je pense que MS a également un lien sur son site Office où vous pouvez télécharger les assemblys d'interopérabilité principaux d'Office.
<identity impersonate="true" userName="adminuser" password="adminpass" />
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 !!!
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 !
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[])
{
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;
essayez
{
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
chaîne de données strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
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<myReader.FieldCount;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="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Télécharger le rapport</a>"
}
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
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html
.