É fácil criar uma tabela local do Excel no Asp.net e distribuí-la no servidor, mas é difícil excluir o processo Excel.exe incorporado. Portanto, não abra o gerenciador de tarefas para ver se coisas relacionadas ao processo Excel.exe ainda estão na memória. Eu forneço uma solução aqui, que fornece dois métodos:
"CreateExcelWorkbook" (descreve como criar uma pasta de trabalho do Excel) Este método executa um procedimento armazenado, retorna um DataReader e gera uma pasta de trabalho do Excel baseada no DataReader, salva-a no sistema de arquivos e cria uma conexão de "download" para que o usuário pode baixar Excel A tabela pode ser importada para o navegador ou baixada diretamente na máquina.
O segundo método: GenerateCSVReport faz essencialmente a mesma coisa, exceto que salva o arquivo no formato CSV. Ainda importado para o Excel, o código CSV pode resolver um problema comum no desenvolvimento: você tem vários zeros colocados em uma coluna, e o código CSV pode garantir que os zeros não fiquem vazios. (Explicação: Este é o problema de que vários valores zero não podem ser salvos na tabela do Excel)
A solução para download contém uma classe válida "SPGen" que executa um procedimento armazenado e retorna um DataReader, e um método de remoção que exclui arquivos anteriores a um valor de tempo específico. O método principal que aparece abaixo é CreateExcelWorkbook
Nota: Você deve estar ciente de que ao executar esta página, você pode precisar de direitos de administrador para gravar arquivos Excel e CSV no sistema de arquivos do servidor WebSever. A maneira mais fácil de lidar com esse problema é executar a página em sua própria pasta e incluir seu próprio arquivo de configuração. E adicione o seguinte elemento <identity personate ="true" ... no arquivo de configuração. Você ainda precisa de acesso de gravação à lista de controle de acesso (ACL) da pasta física, apenas para que a identidade que você executa na página tenha acesso de gravação. Finalmente, você precisa configurar uma conexão COM com a biblioteca de tipos do Excel 9.0 ou Excel 10. , VS.NET Um assembly será gerado para você. Acredito que a Microsoft tenha um link no site do Office para baixar a montagem inicial da Microsoft. (Pode não ser exato, meu entendimento é que é um assembly para .net)
<identidade impersonate="true" userName="adminuser" senha="adminpass" />
Preste atenção especial ao bloco de código a seguir, que limpa objetos do Excel.
// Necessita de todo o código a seguir para limpar e extinguir todas as referências!!!
oWB.Close(nulo,nulo,nulo);
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);
oPlanilha=null;
oWB=nulo;
oXL = nulo;
GC.Collect(); // força a limpeza final!
Isso é necessário porque oSheet", "oWb", 'oRng" e outros objetos também são instâncias de COM. Precisamos
do método ReleaseComObject da classe Marshal para removê-los do .NET
private void CreateExcelWorkbook(string spName, SqlParameter[] parms )
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // método utilitário para limpar arquivos antigos
Excel.Aplicativo oXL;
Excel._Workbook oWB;
Excel._Planilha oPlanilha;
Excel.Range ou
tente
;
{
GC.Collect();// limpe qualquer outro cara do Excel que esteja por aí...
oXL = novo Excel.Application();
oXL.Visível = falso;
//Obter uma nova pasta de trabalho.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//obter nossa
string de dados strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = novo SPGen(strConnect,spName,parms);
SqlDataReader meuLeitor = sg.RunReader();
// Cria cabeçalho e planilha...
int iLinha =2;
for(int j=0;j<meuLeitor.FieldCount;j++)
{
oSheet.Cells[1, j+1] = meuReader.GetName(j).ToString();
}
//construi o conteúdo da planilha
enquanto (meuLeitor.Read())
{
for(int k=0;k < meuLeitor.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= meuReader.GetValue(k).ToString();
}
iRow++;
} //terminar enquanto
meuLeitor.Close();
meuLeitor=null;
//Formate A1:Z1 em negrito, alinhamento vertical = centro.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Ajuste automático das colunas A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visível = falso;
oXL.UserControl = falso;
string strFile ="relatório" + 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);
// Necessita de todo o código a seguir para limpar e extinguir todas as referências!!!
oWB.Close(nulo,nulo,nulo);
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);
oPlanilha=null;
oWB=nulo;
oXL = nulo;
GC.Collect(); // força a limpeza final!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Baixar relatório</a>"
;
catch(Exceção theException)
{
String mensagem de erro;
errorMessage = "Erro: ";
errorMessage = String.Concat(errMessage, theException.Message );
errorMessage = String.Concat(errMessage, "Linha:");
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= mensagem de erro;
}
}
A seguir está o artigo originalCriar
pastas de trabalho dinâmicas do ASP.NET Excel em C#
Por Peter A. Bromberg, Ph.D.
Versão para impressão
Há também, na solução para download, uma classe de utilitário "SPGen" que lida com a execução armazenada.
Gerar planilhas nativas do Excel a partir do seu servidor web não é tão difícil com o ASP.NET. O que pode ser difícil é fazer com que as instâncias do Excel.exe desapareçam. você não abre o TaskMgr e vê 123 instâncias do EXCEL.EXE ainda na memória. Forneço aqui uma solução que possui dois métodos, "CreateExcelWorkbook", que executa um procedimento armazenado que retorna um DataReader e monta uma pasta de trabalho nativa do Excel. salva-o no sistema de arquivos e cria um link "Download" para que o usuário possa carregar o relatório no Excel em seu navegador ou baixar o arquivo XLS. O segundo método, GenerateCSVReport, faz essencialmente a mesma coisa, mas cria um arquivo CSV. arquivo que, é claro, também será carregado no Excel O código CSV lida corretamente com um problema comum do desenvolvedor: se você tiver uma coluna com zeros à esquerda, eles serão preservados.
procedimentos e retornando DataReaders e um método utilitário RemoveFiles que limpa qualquer arquivo XLS ou CSV mais antigo que o número especificado de minutos. O método principal apresentado abaixo é o método CreateExcelWorkbook
. página em uma conta que possui privilégios administrativos, pois precisa de permissões de gravação para armazenar os arquivos Excel ou CSV gerados no sistema de arquivos do servidor web. Provavelmente a maneira mais fácil de lidar com isso é ter a página em sua própria pasta com seu próprio web.config. e insira um elemento <identity personate ="true" ... Você também pode precisar habilitar permissões ACL na pasta física para que a identidade sob a qual a página é executada tenha permissões de gravação. Referência COM para o Excel 9.0 ou Excel 10 Typelibrary e permitir que o VS.NET gere os assemblies de interoperabilidade para você. Acredito que a MS também tenha um link em seu site do Office onde você pode baixar os assemblies de interoperabilidade primários do Office.
<identidade impersonate="true" userName="adminuser" senha="adminpass" />
Observe principalmente o bloco de código que faz a "limpeza" dos objetos Excel:
// Necessita de todo o código a seguir para limpar e extinguir todas as referências!!!
oWB.Close(nulo,nulo,nulo);
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);
oPlanilha=nulo;
oWB=nulo;
oXL = nulo;
GC.Collect(); // força a limpeza final!
Isso é necessário porque todos aqueles pequenos objetos "oSheet", "oWb", 'oRng", etc. são todos instâncias COM e precisamos usar o método InteropServices ReleaseComObject da classe Marshal para nos livrar deles no .NET.
private void CreateExcelWorkbook(string spName, SqlParameter[] parms)
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // método utilitário para limpar arquivos antigos
Excel.Aplicativo oXL;
Excel._Workbook oWB;
Excel._Planilha oPlanilha;
Excel.Range ou
tente
;
{
GC.Collect();// limpe qualquer outro cara do Excel que esteja por aí...
oXL = novo Excel.Application();
oXL.Visível = falso;
//Obter uma nova pasta de trabalho.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//obter nossa
string de dados strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = novo SPGen(strConnect,spName,parms);
SqlDataReader meuLeitor = sg.RunReader();
// Cria cabeçalho e planilha...
int iLinha =2;
for(int j=0;j<meuLeitor.FieldCount;j++)
{
oSheet.Cells[1, j+1] = meuReader.GetName(j).ToString();
}
//construi o conteúdo da planilha
enquanto (meuLeitor.Read())
{
for(int k=0;k < meuLeitor.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= meuReader.GetValue(k).ToString();
}
iRow++;
} //terminar enquanto
meuLeitor.Close();
meuLeitor=null;
//Formate A1:Z1 em negrito, alinhamento vertical = centro.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Ajuste automático das colunas A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visível = falso;
oXL.UserControl = falso;
string strFile ="relatório" + 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);
// Necessita de todo o código a seguir para limpar e extinguir todas as referências!!!
oWB.Close(nulo,nulo,nulo);
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);
oPlanilha=nulo;
oWB=nulo;
oXL = nulo;
GC.Collect(); // força a limpeza final!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Baixar relatório</a>"
;
catch(Exceção theException)
{
String mensagem de erro;
errorMessage = "Erro: ";
errorMessage = String.Concat(errMessage, theException.Message );
errorMessage = String.Concat(errMessage, "Linha:");
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= mensagem de erro;
}
}
-Traduzido com pressa, por favor, perdoe-me se houver algum erro. Bem-vindo para dar conselhos e discussões --- Xiao Xu
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html
.