Es ist einfach, eine lokale Excel-Tabelle in Asp.net zu erstellen und sie vom Server zu verteilen, aber es ist schwierig, den eingebetteten Excel.exe-Prozess zu löschen. Öffnen Sie also nicht den Task-Manager, um zu sehen, ob sich noch Dinge im Zusammenhang mit dem Excel.exe-Prozess im Speicher befinden. Ich stelle hier eine Lösung bereit, die zwei Methoden bietet:
„CreateExcelWorkbook“ (beschreibt, wie eine Excel-Arbeitsmappe erstellt wird) Diese Methode führt eine gespeicherte Prozedur aus, gibt einen DataReader zurück und generiert eine Excel-Arbeitsmappe basierend auf dem DataReader, speichert sie im Dateisystem und erstellt eine „Download“-Verbindung, damit der Benutzer Sie können Excel herunterladen. Die Tabelle kann in den Browser importiert oder direkt auf die Maschine heruntergeladen werden.
Die zweite Methode: GenerateCSVReport macht im Wesentlichen dasselbe, außer dass sie die Datei im CSV-Format speichert. Immer noch in Excel importiert, kann der CSV-Code ein häufiges Problem in der Entwicklung lösen: Sie haben mehrere Nullen in eine Spalte gegossen und der CSV-Code kann sicherstellen, dass Nullen nicht leer sind. (Erklärung: Dies ist das Problem, dass mehrere Nullwerte nicht in der Excel-Tabelle gespeichert werden können)
Die herunterladbare Lösung enthält eine gültige Klasse „SPGen“, die eine gespeicherte Prozedur ausführt und einen DataReader zurückgibt, sowie eine Remove-Methode, die Dateien löscht, die älter als ein bestimmter Zeitwert sind. Die unten angezeigte Hauptmethode ist CreateExcelWorkbook
Hinweis: Sie müssen sich darüber im Klaren sein, dass Sie beim Ausführen dieser Seite möglicherweise Administratorrechte benötigen, um Excel- und CSV-Dateien in das Dateisystem des WebSever-Servers zu schreiben. Der einfachste Weg, dieses Problem zu lösen, besteht darin, die Seite in einem eigenen Ordner auszuführen und eine eigene Konfigurationsdatei einzubinden. Und fügen Sie das folgende Element <identity impersonate ="true" ... in der Konfigurationsdatei hinzu. Sie benötigen weiterhin Schreibzugriff auf die Zugriffskontrollliste (ACL) des physischen Ordners, nur damit die Identität, mit der Sie die Seite ausführen, Schreibzugriff hat. Schließlich müssen Sie eine COM-Verbindung zur Excel 9.0- oder Excel 10-Typbibliothek einrichten , VS.NET Eine Assembly wird für Sie generiert. Ich glaube, Microsoft hat auf seiner Office-Website einen Link zum Herunterladen der ersten Microsoft-Assembly. (Es ist möglicherweise nicht korrekt, ich verstehe, dass es sich um eine Assembly für .net handelt)
<identity impersonate="true" userName="adminuser" passwort="adminpass" />
Achten Sie besonders auf den folgenden Codeblock, der Excel-Objekte löscht.
// Benötige den gesamten folgenden Code, um alle Referenzen zu bereinigen und zu löschen!!!
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(); // endgültige Bereinigung erzwingen!
Dies ist notwendig, da oSheet“, „oWb“, „oRng“ und andere Objekte ebenfalls Instanzen von COM sind. Wir benötigen
die ReleaseComObject-Methode der Marshal-Klasse, um sie aus .NET
private void CreateExcelWorkbook(string spName, SqlParameter[] parms
zu entfernen)
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // Dienstprogramm zum Bereinigen alter Dateien
Excel.Anwendung oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
Excel.Range oRng;
versuchen Sie es
{
GC.Collect();// Beräum alle anderen herumhängenden Excel-Leute ...
oXL = new Excel.Application();
oXL.Visible = false;
//Holen Sie sich eine neue Arbeitsmappe.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//unseren Datenstring abrufen
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = new SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Kopfzeile und Blatt erstellen...
int iRow =2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// den Blattinhalt erstellen
while (myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//end while
myReader.Close();
myReader=null;
//Formatieren Sie A1:Z1 fett, vertikale Ausrichtung = Mitte.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Spalten A:Z automatisch anpassen.
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,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// Benötige den gesamten folgenden Code, um alle Referenzen zu bereinigen und zu löschen!!!
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(); // endgültige Bereinigung erzwingen!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Bericht herunterladen</a>"
}
Catch(Ausnahme theException)
{
String errorMessage;
errorMessage = "Fehler: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= errorMessage;
}
}
Das Folgende ist der Originalartikel: Erstellen Sie
dynamische ASP.NET Excel-Arbeitsmappen in C#
von Peter A. Bromberg, Ph.D.
Druckerfreundliche Version
In der herunterladbaren Lösung gibt es auch eine Dienstprogrammklasse „SPGen“, die die Ausführung gespeicherter Excel.exe-Instanzen verwaltet
. Das Generieren nativer Excel-Tabellen von Ihrem Webserver ist mit ASP.NET nicht so schwierig. Schwierig kann es sein, Instanzen von Excel.exe zu entfernen Sie öffnen TaskMgr nicht und sehen, dass sich noch 123 Instanzen von EXCEL.EXE im Speicher befinden. Ich stelle hier eine Lösung mit zwei Methoden zur Verfügung: „CreateExcelWorkbook“, die eine gespeicherte Prozedur ausführt, die einen DataReader zurückgibt und daraus eine native Excel-Arbeitsmappe zusammenstellt Es speichert ihn im Dateisystem und erstellt einen „Download“-Link, sodass der Benutzer den Bericht entweder in seinem Browser in Excel laden oder die XLS-Datei herunterladen kann. Die zweite Methode, GenerateCSVReport, macht im Wesentlichen das Gleiche, erstellt jedoch eine CSV Datei, die natürlich auch in Excel geladen werden kann. Der CSV-Code löst ein häufiges Entwicklerproblem, da eine Spalte mit führenden Nullen beibehalten wird.
Prozeduren und zurückgebende DataReader sowie eine RemoveFiles-Dienstprogrammmethode, die alle XLS- oder CSV-Dateien bereinigt, die älter als die angegebene Anzahl von Minuten sind.
HINWEIS: Sie sollten sich darüber im Klaren sein, dass Sie diese Methode ausführen müssen Seite unter einem Konto, das über Administratorrechte verfügt, da es Schreibrechte benötigt, um die generierten Excel- oder CSV-Dateien im Dateisystem des Webservers zu speichern. Der wahrscheinlich einfachste Weg, dies zu handhaben, besteht darin, die Seite in einem eigenen Ordner mit einer eigenen web.config zu haben. und fügen Sie ein <identity impersonate ="true" ...-Element ein. Möglicherweise müssen Sie auch ACL-Berechtigungen für den physischen Ordner aktivieren, damit die Identität, unter der die Seite ausgeführt wird, über Schreibberechtigungen verfügt COM-Referenz auf die Excel 9.0- oder Excel 10-Typenbibliothek und lassen Sie VS.NET die Interop-Assemblys für Sie generieren. Ich glaube, MS hat auf seiner Office-Site auch einen Link, über den Sie die primären Office-Interop-Assemblys herunterladen können.
<identity impersonate="true" userName="adminuser" passwort="adminpass" />
Beachten Sie insbesondere den Codeblock, der die „Bereinigung“ der Excel-Objekte durchführt:
// Benötigt den gesamten folgenden Code, um alle Referenzen zu bereinigen und zu löschen!!!
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(); // endgültige Bereinigung erzwingen!
Dies ist notwendig, da alle diese kleinen Objekte „oSheet“, „oWb“, „oRng“ usw. alle COM-Instanzen sind und wir die InteropServices ReleaseComObject-Methode der Marshal-Klasse verwenden müssen, um sie in .NET zu entfernen.
private void CreateExcelWorkbook(string spName, SqlParameter[] parms)
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // Dienstprogramm zum Bereinigen alter Dateien
Excel.Anwendung oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
Excel.Range oRng;
versuchen Sie es
{
GC.Collect();// Beräum alle anderen herumhängenden Excel-Leute ...
oXL = new Excel.Application();
oXL.Visible = false;
//Holen Sie sich eine neue Arbeitsmappe.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//unseren Datenstring abrufen
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = new SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Kopfzeile und Blatt erstellen...
int iRow =2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// den Blattinhalt erstellen
while (myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//end while
myReader.Close();
myReader=null;
//Formatieren Sie A1:Z1 fett, vertikale Ausrichtung = Mitte.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Spalten A:Z automatisch anpassen.
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,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// Benötige den gesamten folgenden Code, um alle Referenzen zu bereinigen und zu löschen!!!
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(); // endgültige Bereinigung erzwingen!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Bericht herunterladen</a>"
}
Catch(Ausnahme theException)
{
String errorMessage;
errorMessage = "Fehler: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= errorMessage;
}
}
- Ich habe es eilig übersetzt, bitte verzeihen Sie mir, wenn es Fehler gibt. Willkommen, um Ratschläge und Diskussionen zu geben --- Xiao Xu
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html