Asp.net에서 로컬 Excel 테이블을 만들어 서버에서 분산시키는 것은 쉽지만, 내장된 Excel.exe 프로세스를 삭제하는 것은 어렵습니다. 따라서 Excel.exe 프로세스와 관련된 항목이 아직 메모리에 있는지 확인하기 위해 작업 관리자를 열지 마십시오. 여기서는 두 가지 방법을 제공하는 솔루션을 제공합니다.
"CreateExcelWorkbook"(Excel 통합 문서를 만드는 방법 설명) 이 메서드는 저장 프로시저를 실행하고 DataReader를 반환하며 DataReader를 기반으로 Excel 통합 문서를 생성하고 이를 파일 시스템에 저장한 다음 사용자가 다운로드할 수 있도록 "다운로드" 연결을 생성합니다. Excel을 다운로드할 수 있습니다. 테이블을 브라우저로 가져오거나 기계로 직접 다운로드할 수 있습니다.
두 번째 방법: generateCSVReport는 파일을 CSV 형식으로 저장한다는 점을 제외하면 기본적으로 동일한 작업을 수행합니다. 여전히 Excel로 가져온 CSV 코드는 개발 시 일반적인 문제를 해결할 수 있습니다. 즉, 열에 여러 개의 0이 쏟아져 있고 CSV 코드는 0이 비어 있지 않은지 확인할 수 있습니다. (설명: 엑셀 표에 여러 개의 0 값을 저장할 수 없는 문제입니다)
다운로드 가능한 솔루션에는 저장 프로시저를 실행하고 DataReader를 반환하는 유효한 클래스 "SPGen"과 특정 시간 값보다 오래된 파일을 삭제하는 제거 메서드가 포함되어 있습니다. 아래에 나타나는 주요 방법은 CreateExcelWorkbook입니다.
참고: 이 페이지를 실행할 때 WebSever 서버의 파일 시스템에 Excel 및 Csv 파일을 작성하려면 관리자 권한이 필요할 수 있다는 점에 유의해야 합니다. 이 문제를 해결하는 가장 쉬운 방법은 자체 폴더에서 페이지를 실행하고 자체 구성 파일을 포함하는 것입니다. 그리고 구성 파일에 <identity impersonate ="true" ... 요소를 추가합니다. 페이지를 실행하는 ID에 쓰기 액세스 권한이 있도록 하기 위해서만 실제 폴더의 ACL(액세스 제어 목록)에 대한 쓰기 액세스 권한이 필요합니다. 마지막으로 Excel 9.0 또는 Excel 10 형식 라이브러리에 대한 COM 연결을 설정해야 합니다. , VS.NET 어셈블리가 생성됩니다. 나는 Microsoft가 Office 웹 사이트에 Microsoft의 초기 어셈블리를 다운로드할 수 있는 링크를 갖고 있다고 생각합니다. (정확하지 않을 수도 있습니다. .net용 어셈블리인 것으로 알고 있습니다.)
<identity impersonate="true" userName="adminuser" 비밀번호="adminpass" />
Excel 개체를 지우는 다음 코드 블록에 특히 주의하세요.
// 모든 참조를 정리하고 제거하려면 다음 코드가 모두 필요합니다!!!
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);
o시트=null;
oWB=널;
oXL = 널;
GC.Collect(); // 최종 정리를 강제합니다!
이는 oSheet", "oWb", 'oRng" 및 기타 개체도 COM의 인스턴스이기 때문에 필요합니다.
.NET에서 이를 제거하려면 Marshal 클래스의 ReleaseComObject 메서드가
필요합니다.private void CreateExcelWorkbook(string spName, SqlParameter[] parms )
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // 오래된 파일을 정리하는 유틸리티 메서드
Excel.응용 프로그램 oXL;
Excel._통합문서 oWB;
Excel._Worksheet oSheet;
Excel.Range 또는
Rng
;
{
GC.Collect();// 주변에 있는 다른 Excel 직원을 정리합니다...
oXL = 새로운 Excel.Application();
oXL.Visible = 거짓;
//새 통합 문서를 가져옵니다.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//데이터
문자열 가져오기 strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = new SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// 헤더와 시트 생성...
int iRow =2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// 시트 내용 작성
동안(myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//끝나는 동안
myReader.Close();
myReader=null;
//A1:Z1 형식을 굵게, 세로 정렬 = 가운데로 지정합니다.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//A:Z 열 자동 맞춤.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = 거짓;
oXL.UserControl = 거짓;
문자열 strFile ="보고서" + 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);
// 모든 참조를 정리하고 제거하려면 다음 코드가 모두 필요합니다!!!
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);
o시트=null;
oWB=널;
oXL = 널;
GC.Collect(); // 최종 정리를 강제합니다!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">보고서 다운로드</a>"
}
catch(예외 theException)
{
문자열 오류 메시지;
errorMessage = "오류: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text=오류메시지;
}
}
다음은
Peter A. Bromberg, Ph.D.의
C#에서 동적 ASP.NET Excel 통합 문서
만들기 원본 문서입니다.
인쇄용 버전
다운로드 가능한 솔루션에는 저장된 실행을 처리하는 유틸리티 클래스 "SPGen"도 있습니다
. 웹 서버에서 기본 Excel 스프레드시트를 생성하는 것은 ASP.NET에서 그리 어렵지 않습니다. Excel.exe 인스턴스를 없애는 것이 어려울 수 있습니다. TaskMgr을 열지 않았는데 123개의 EXCEL.EXE 인스턴스가 여전히 메모리에 남아 있는 것을 볼 수 있습니다. 여기서는 DataReader를 반환하고 기본 Excel 통합 문서를 조합하는 저장 프로시저를 실행하는 "CreateExcelWorkbook"이라는 두 가지 메서드가 있는 솔루션을 제공합니다. 이를 파일 시스템에 저장하고 사용자가 브라우저에서 Excel로 보고서를 로드하거나 XLS 파일을 다운로드할 수 있도록 "다운로드" 링크를 생성합니다. 두 번째 방법인 generateCSVReport는 기본적으로 동일한 작업을 수행하지만 CSV를 생성합니다. 물론 Excel에도 로드되는 파일입니다. CSV 코드는 앞에 0이 있는 열이 있으면 보존된다는 점에서 일반적인 개발자 문제를 올바르게 처리합니다.
프로시저 및 DataReaders 반환, 지정된 시간(분)보다 오래된 XLS 또는 CSV 파일을 정리하는 RemoveFiles 유틸리티 메서드 아래에 제시된 주요 메서드는 CreateExcelWorkbook 메서드입니다.
참고: 이 메서드를 실행해야 할 수도 있습니다. 생성된 Excel 또는 CSV 파일을 웹 서버의 파일 시스템에 저장하려면 쓰기 권한이 필요하므로 관리 권한이 있는 계정의 페이지를 처리하는 가장 쉬운 방법은 자체 web.config가 있는 자체 폴더에 페이지를 두는 것입니다. <identity impersonate ="true" ... 요소를 삽입합니다. 페이지가 실행되는 ID에 쓰기 권한이 있도록 물리적 폴더에서도 ACL 권한을 활성화해야 할 수도 있습니다. Excel 9.0 또는 Excel 10 Typelibrary에 대한 COM 참조를 사용하고 VS.NET에서 Interop 어셈블리를 생성하도록 합니다. MS에도 Office 기본 Interop 어셈블리를 다운로드할 수 있는 Office 사이트 링크가 있다고 생각합니다.
<identity impersonate="true" userName="adminuser" 비밀번호="adminpass" />
특히 Excel 개체의 "정리"를 수행하는 코드 블록에 유의하세요.
// 모든 참조를 정리하고 제거하려면 다음 코드가 모두 필요합니다!!!
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);
o시트=null;
oWB=널;
oXL = 널;
GC.Collect(); // 최종 정리를 강제합니다!
모든 작은 개체 "oSheet", "oWb", 'oRng" 등은 모두 COM 인스턴스이고 Marshal 클래스의 InteropServices ReleaseComObject 메서드를 사용하여
.NET
에서 제거해야 하기 때문에 이는 필요합니다.
CreateExcelWorkbook(문자열 spName, SqlParameter[] parms)
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // 오래된 파일을 정리하는 유틸리티 메서드
Excel.응용 프로그램 oXL;
Excel._통합문서 oWB;
Excel._Worksheet oSheet;
Excel.Range 또는
Rng
;
{
GC.Collect();// 주변에 있는 다른 Excel 직원을 정리합니다...
oXL = 새로운 Excel.Application();
oXL.Visible = 거짓;
//새 통합 문서를 가져옵니다.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//데이터
문자열 가져오기 strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = new SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// 헤더와 시트 생성...
int iRow =2;
for(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// 시트 내용 작성
동안(myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//끝나는 동안
myReader.Close();
myReader=null;
//A1:Z1 형식을 굵게, 세로 정렬 = 가운데로 지정합니다.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//A:Z 열 자동 맞춤.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = 거짓;
oXL.UserControl = 거짓;
문자열 strFile ="보고서" + 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);
// 모든 참조를 정리하고 제거하려면 다음 코드가 모두 필요합니다!!!
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);
o시트=null;
oWB=널;
oXL = 널;
GC.Collect(); // 최종 정리를 강제합니다!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">보고서 다운로드</a>"
}
catch(예외 theException)
{
문자열 오류 메시지;
errorMessage = "오류: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text=오류메시지;
}
}
-급하게 번역했으니 실수가 있으면 용서해주세요. 조언과 토론을 환영합니다---Xiao Xu
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html