Es fácil crear una tabla de Excel local en Asp.net y distribuirla desde el servidor, pero es difícil eliminar el proceso Excel.exe integrado. Por lo tanto, no abra el administrador de tareas para ver si todavía hay elementos relacionados con el proceso Excel.exe en la memoria. Proporciono una solución aquí, que proporciona dos métodos:
"CreateExcelWorkbook" (describe cómo crear un libro de Excel) Este método ejecuta un procedimiento almacenado, devuelve un DataReader y genera un libro de Excel basado en el DataReader, lo guarda en el sistema de archivos y crea una conexión de "descarga" para que el usuario puede descargar Excel La tabla se puede importar al navegador o descargar directamente a la máquina.
El segundo método: GenerateCSVReport esencialmente hace lo mismo, excepto que guarda el archivo en formato CSV. Aún importado a Excel, el código CSV puede resolver un problema común en el desarrollo: tiene varios ceros en una columna y el código CSV puede garantizar que los ceros no estén vacíos. (Explicación: este es el problema de que no se pueden guardar varios valores cero en la tabla de Excel)
La solución descargable contiene una clase válida "SPGen" que ejecuta un procedimiento almacenado y devuelve un DataReader, y un método de eliminación que elimina archivos anteriores a un valor de tiempo específico. El método principal que aparece a continuación es CreateExcelWorkbook
Nota: Debe tener en cuenta que al ejecutar esta página, es posible que necesite derechos de administrador para escribir archivos Excel y Csv en el sistema de archivos del servidor WebSever. La forma más sencilla de solucionar este problema es ejecutar la página en su propia carpeta e incluir su propio archivo de configuración. Y agregue el siguiente elemento Preste especial atención al siguiente bloque de código, que borra los objetos de Excel. // ¡¡¡Necesita todo el código siguiente para limpiar y extinguir todas las referencias!!! Esto es necesario porque oSheet", "oWb", 'oRng" y otros objetos también son instancias de COM. Necesitamos el método ReleaseComObject de la clase Marshal para eliminarlos de .NET private void CreateExcelWorkbook(string spName, SqlParameter[] parms. ) Excel.Rango oRng; cadena de datos strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"]; } El siguiente es el artículo original Crear libros de trabajo dinámicos de Excel ASP.NET en C# por Peter A. Bromberg, Ph.D. También hay, en la solución descargable, una clase de utilidad "SPGen" que maneja la ejecución almacenada. Generar hojas de cálculo de Excel nativas desde su servidor web no es tan difícil con ASP.NET. Lo que puede ser difícil es hacer que las instancias de Excel.exe desaparezcan. no abre TaskMgr y ve 123 instancias de EXCEL.EXE todavía en la memoria. Aquí proporciono una solución que tiene dos métodos, "CreateExcelWorkbook", que ejecuta un procedimiento almacenado que devuelve un DataReader y ensambla un libro de Excel nativo. lo guarda en el sistema de archivos y crea un enlace de "Descargar" para que el usuario pueda cargar el informe en Excel en su navegador o descargar el archivo XLS. El segundo método, GenerateCSVReport, hace esencialmente lo mismo pero crea un CSV. archivo que, por supuesto, también se cargará en Excel. El código CSV maneja correctamente un problema común de los desarrolladores en el sentido de que si tiene una columna que tiene ceros a la izquierda, estos se conservan. procedimientos y devolución de DataReaders, y un método de utilidad RemoveFiles que limpia cualquier archivo XLS o CSV que tenga más de la cantidad de minutos especificada. El método clave que se presenta a continuación es el método CreateExcelWorkbook. NOTA: Debe tener en cuenta que probablemente necesitará ejecutar esto. página bajo una cuenta que tiene privilegios administrativos ya que necesita permisos de escritura para almacenar los archivos Excel o CSV generados en el sistema de archivos del servidor web. Probablemente la forma más fácil de manejar esto es tener la página en su propia carpeta con su propio web.config. e inserte un elemento Tenga en cuenta especialmente el bloque de código que realiza la "limpieza" de los objetos de Excel: // ¡¡¡Necesita todo el código siguiente para limpiar y extinguir todas las referencias!!! Esto es necesario porque todos esos pequeños objetos "oSheet", "oWb", 'oRng", etc. son todos instancias COM y necesitamos usar el método InteropServices ReleaseComObject de la clase Marshal para deshacernos de ellos en .NET. private void CreateExcelWorkbook(cadena spName, SqlParameter[] parámetros) Excel.Rango oRng; cadena de datos strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"]; } http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html
oWB.Close(nulo,nulo,nulo);
oXL.Workbooks.Close();
oXL.Salir();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oHoja=nulo;
oWB=nulo;
XL = nulo;
GC.Collect(); // ¡fuerza la limpieza final!
{
cadena strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // método de utilidad para limpiar archivos antiguos
Excel.Aplicación oXL;
Excel._Libro de trabajo oWB;
Excel._Hoja de trabajo oHoja;
{
GC.Collect();// limpia cualquier otro chico de Excel que ande por ahí...
oXL = nueva Excel.Aplicación();
oXL.Visible = falso;
//Obtener un nuevo libro de trabajo.
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Falta.Valor));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//obtenemos nuestra
SPGen sg = nuevo SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Crear encabezado y hoja...
int iRow =2;
para(int j=0;j
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// construir el contenido de la hoja
mientras (myReader.Read())
{
para(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//finalizar mientras
miReader.Close();
miLector=null;
//Formatear A1:Z1 en negrita, alineación vertical = centro.
oSheet.get_Range("A1", "Z1").Font.Bold = verdadero;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Autoajustar columnas A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = falso;
oXL.UserControl = falso;
cadena strFile ="informe" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
nulo,nulo,falso,falso,Excel.XlSaveAsAccessMode.xlShared,falso,falso,nulo,nulo,nulo);
// ¡¡¡Necesita todo el código siguiente para limpiar y extinguir todas las referencias!!!
oWB.Close(nulo,nulo,nulo);
oXL.Workbooks.Close();
oXL.Salir();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oHoja=nulo;
oWB=nulo;
XL = nulo;
GC.Collect(); // ¡fuerza la limpieza final!
cadena strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="Descargar informe"
atrapar(Excepción laExcepción)
{
Mensaje de error de cadena;
mensaje de error = "Error: ";
mensaje de error = String.Concat (mensaje de error, theException.Message);
mensaje de error = String.Concat (mensaje de error, "Línea:");
mensaje de error = String.Concat (mensaje de error, theException.Source);
errLabel.Text= mensaje de error;
}
}
Versión para imprimir
oWB.Close(nulo,nulo,nulo);
oXL.Workbooks.Close();
oXL.Salir();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oHoja=nulo;
oWB=nulo;
XL = nulo;
GC.Collect(); // ¡fuerza la limpieza final!
{
cadena strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // método de utilidad para limpiar archivos antiguos
Excel.Aplicación oXL;
Excel._Libro de trabajo oWB;
Excel._Hoja de trabajo oHoja;
{
GC.Collect();// limpia cualquier otro chico de Excel que ande por ahí...
oXL = nueva Excel.Aplicación();
oXL.Visible = falso;
//Obtener un nuevo libro de trabajo.
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Falta.Valor));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//obtenemos nuestra
SPGen sg = nuevo SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Crear encabezado y hoja...
int iRow =2;
para(int j=0;j
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// construir el contenido de la hoja
mientras (myReader.Read())
{
para(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//finalizar mientras
miReader.Close();
miLector=null;
//Formatear A1:Z1 en negrita, alineación vertical = centro.
oSheet.get_Range("A1", "Z1").Font.Bold = verdadero;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Autoajustar columnas A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = falso;
oXL.UserControl = falso;
cadena strFile ="informe" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
nulo,nulo,falso,falso,Excel.XlSaveAsAccessMode.xlShared,falso,falso,nulo,nulo,nulo);
// ¡¡¡Necesita todo el código siguiente para limpiar y extinguir todas las referencias!!!
oWB.Close(nulo,nulo,nulo);
oXL.Workbooks.Close();
oXL.Salir();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oHoja=nulo;
oWB=nulo;
XL = nulo;
GC.Collect(); // ¡fuerza la limpieza final!
cadena strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="Descargar informe"
atrapar(Excepción laExcepción)
{
Mensaje de error de cadena;
mensaje de error = "Error: ";
mensaje de error = String.Concat (mensaje de error, theException.Message);
mensaje de error = String.Concat (mensaje de error, "Línea:");
mensaje de error = String.Concat (mensaje de error, theException.Source);
errLabel.Text= mensaje de error;
}
}
-Traducido rápidamente, perdóneme si hay algún error. Bienvenido a dar consejos y discusiones---Xiao Xu