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 <identity impersonate ="true"... en el archivo de configuración. Aún necesita acceso de escritura a la lista de control de acceso (ACL) de la carpeta física, solo para que la identidad con la que ejecuta la página tenga acceso de escritura. Finalmente, debe configurar una conexión COM a la biblioteca de tipo Excel 9.0 o Excel 10. , VS.NET Se generará un ensamblado para usted. Creo que Microsoft tiene un enlace en su sitio web de Office para descargar el ensamblaje inicial de Microsoft. (Puede que no sea exacto, tengo entendido que es un ensamblado para .net)
<identidad suplantar="true" nombre de usuario="usuario administrador" contraseña="contraseña de administrador" />
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!!!
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!
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. )
{
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;
Excel.Rango
oRng;
{
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
cadena de datos strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = nuevo SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Crear encabezado y hoja...
int iRow =2;
para(int j=0;j<myReader.FieldCount;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="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Descargar informe</a>"
}
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;
}
}
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.
Versión para imprimir
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 <identity impersonate ="true" ... Es posible que también necesite habilitar los permisos ACL en la carpeta física para que la identidad con la que se ejecuta la página tenga permisos de escritura. COM a la biblioteca de tipos de Excel 9.0 o Excel 10 y permita que VS.NET genere los ensamblados de interoperabilidad por usted. Creo que MS también tiene un enlace en su sitio de Office donde puede descargar los ensamblados de interoperabilidad principales de Office.
<identidad suplantar="true" nombre de usuario="usuario administrador" contraseña="contraseña de administrador" />
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!!!
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!
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)
{
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;
Excel.Rango
oRng;
{
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
cadena de datos strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = nuevo SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Crear encabezado y hoja...
int iRow =2;
para(int j=0;j<myReader.FieldCount;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="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Descargar informe</a>"
}
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
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html
.