C#을 사용하여 애플리케이션에서 Excel 문서를 생성하고 직접 다운로드 기능을 제공하는 것은 비교적 일반적인 애플리케이션입니다. 여기에서는 제가 접한 몇 가지 방법을 기록했는데, 주의가 필요한 몇 가지 사항이 있습니다.
a) 먼저 데이터 클래스를 정의합니다.
암호
공개 클래스 DataContent
{
공개 문자열 이름 { 설정 }
공개 문자열 주소 { 설정 }
공개 문자열 전화 { 설정 }
공개 문자열 GetContentByIndex(int index)
{
문자열 값 = 문자열.Empty;
스위치(색인)
{
사례 1:
값 = 이름;
부서지다;
사례 2:
값 = 주소;
부서지다;
사례 3:
값 = 전화;
부서지다;
기본:
값 = "";
부서지다;
}
반환 값;
}
}
b) 가장 간단한 방법: HTML 문자열을 함께 연결하여 직접 Excel 파일을 생성합니다. 장점은 다음과 같습니다. 코드는 매우 편리하고 사무실 인터페이스 확장 없이 작동할 수 있습니다. 단점은 다음을 통해 설정할 수 있지만 적용되는 셀이 제한된다는 것입니다. 중간 방법이지만 열 때 여전히 형식이 잘못된 문제가 있어 정상적인 탐색 및 편집에 영향을 미치지 않습니다. 그러나 코드를 통해 Excel 파일을 작동해야 하는 일부 응용 프로그램의 경우 내용을 읽을 때와 같은 문제가 발생할 수 있습니다. OleDB.
1 공개 무효 GetExcelDataToClient()
2 {
3 List<DataContent> arrDatas = new List<DataContent>() {
4 새로운 DataContent() { Address="aaa", Name="aaa", Phone="aaa" },
5 새로운 DataContent() { Address="bbb", Phone="bbb", Name="bbb" },
6 새로운 DataContent() { Name="ccc", Phone="ccc", Address="ccc"}
7};
8
9 StringBuilder sb = new StringBuilder("<HTML xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns= " http://www.w3.org/TR/REC-html40"><HEAD><META HTTP-EQUIV="Content-Type" content="text/html; charset=gb_2312-80 "><TITLE></TITLE><style>td{mso-number-format:" \@";}</style></HEAD><BODY><TABLE border="1"> ", 500);
10 // 제목 열.
11 sb.Append(string.Format("<TR><TD><B>Event_CourseId<B/></TD><TD><B>사용자 ID</B></TD><TD><B>참석 </B></TD>{0}</TR>", GetExCells(30)));
12 // 콘텐츠 열.
13 foreach(arrDatas의 DataContent 데이터)
14 sb.Append(string.Format("<TR><TD>{0}</TD><TD>{1}</TD><TD>{2}</TD>{3}</TR> ", 데이터.이름, 데이터.주소, 데이터.전화, GetExCells(30)));
15 // 확장 행을 추가합니다.
16 sb.Append(GetExRows(50, 33));
17 // 마지막 부분.
18 sb.Append("</TABLE></BODY></HTML>");
19 //결과를 엑셀파일로 응답합니다.
20 Response.ContentType = "application/vnd.ms-excel";
21 Response.AddHeader("콘텐츠 처리", "첨부 파일; 파일 이름=DataList.xls;filetype=excel");
22 Response.ContentEncoding = Encoding.GetEncoding("utf-8");
23 응답.쓰기(sb.ToString());
24 응답.플러시();
25 응답.끝();
26}
27 // 확장 셀을 추가합니다.
28 개인 문자열 GetExCells(int num)
29 {
30 StringBuilder sb = new StringBuilder(200);
31 for (int i = 0; i < num; i++)
32 sb.Append("<TD></TD>");
33 return sb.ToString();
34}
35 // 확장 행을 추가합니다.
36 개인 문자열 GetExRows(int rowNum, int colNum)
37 {
38 StringBuilder sb = new StringBuilder(200);
39 for (int i = 0; i < rowNum; i++)
40 sb.Append(string.Format("<TR>{0}</TR>", GetExCells(colNum)));
41 sb.ToString()을 반환합니다.
42 }
c) 일반적인 인터페이스 방법: 주로 Office에서 제공하는 인터페이스 구성 요소 Microsoft.Office.Interop.Excel을 호출하여 Excel 파일을 생성합니다. 그 특징은 내용 셀의 불완전한 적용 범위 문제를 제거할 수 있다는 것입니다. 비정상적인 열기 프롬프트 형식입니다. 그러나 OleDB를 통해 파일을 운영하는 경우 상대적으로 엄격한 방식으로 작성해야 합니다. 그렇지 않으면 작업 중 형식 이상이 문제가 됩니다. 표준 작성 방법은 다음과 같습니다.
1개의 개인 무효 Test4()
2 {
3 문자열 filePath = @"C:Test.xls";
4 List<DataContent> arrDatas = new List<DataContent>() {
5 새로운 DataContent() { Address="aaa", Name="aaa", Phone="aaa" },
6 새로운 DataContent() { Address="bbb", Phone="bbb", Name="bbb" },
7 새로운 DataContent() { Name="ccc", Phone="ccc", Address="ccc"}
8};
9
10 개체 objOpt = System.Reflection.Missing.Value;
11 엑셀.응용프로그램 objExcel = null;
12 Excel.Workbooks objBooks = null;
13 Excel.Workbook objBook = null;
14번 시도
15 {
16번 시도
17 {
18 objExcel = 새로운 Excel.Application();
19}
20 캐치 (예외예외)
스물 하나 {
22 Console.Write(ex.메시지);
스물셋 }
스물넷
25 objBooks = (Excel.Workbooks)objExcel.Workbooks;
26 objBook = (Excel.Workbook)(objBooks.Add(objOpt));
27 // 새 통합 문서의 첫 번째 워크시트 셀에 데이터를 추가합니다.
28 Excel.Sheets objSheets = (Excel.Sheets)objBook.Worksheets;
29 Excel.Worksheet objSheet = (Excel.Worksheet)(objSheets.get_Item(1));
30 objSheet.Name = "데이터목록";
31 objSheet.Cells[1, 1] = "이름";
32 objSheet.Cells[1, 2] = "주소";
33 objSheet.Cells[1, 3] = "전화";
34 Excel.Range objRange = objSheet.get_Range(objSheet.Cells[1, 1], objSheet.Cells[1, 3]);
35 //objRange.Font.Bold = true;
36 objRange.Font.Size = 18;
37 objRange.Interior.ColorIndex = 37;
38
39 for (int i = 1; i < 4; i++)
40 {
41 objRange = objSheet.get_Range(objSheet.Cells[2, i], objSheet.Cells[2 + arrDatas.Count, i]);
42 objRange.NumberFormatLocal = "@";
43 for (int j = 0; j < arrDatas.Count; j++)
44 objSheet.Cells[2 + j, i] = arrDatas[j].GetContentByIndex(i);
45 }
46 objSheet.Columns.AutoFit();
47 if (System.IO.File.Exists(파일 경로))
48 시스템.IO.파일.삭제(파일 경로);
49 // 파일을 저장합니다.
50 objBook.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookNormal, objOpt, objOpt,
51 objOpt, objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
52 objOpt, objOpt, objOpt, objOpt, objOpt);
53 objBook.Close(false, objOpt, objOpt);
54 objExcel.Quit();
55bj엑셀=null;
56 GC.수집();
57 //파일을 클라이언트에 응답합니다.
58 문자열 downloadFileName = string.Format("{0:yyyyMMdd}", DateTime.Now) + "-" +
59 this.Page.User.Identity.Name + "-DataList.xls";
60 Response.ContentType = "응용프로그램/vnd.ms-excel";
61 Response.AddHeader("Content-Disposition", "attachment; filename=" + downloadFileName + ";filetype=excel");
62 Response.ContentEncoding = Encoding.GetEncoding("utf-8");
63 응답.쓰기파일(파일경로);
64 응답.플러시();
65
66 if (System.IO.File.Exists(filePath))
67 시스템.IO.파일.삭제(파일 경로);
68 응답.끝();
69 }
70 캐치 (예외예외)
71 {
72 if (objExcel != null)
73 {
74번 시도
75 {
76 foreach(objExcel.Workbooks의 Excel.Workbook wb)
77 {
78 if (wb != null)
79 {
80번 시도
81 {
82 wb.저장됨 = true;
83}
84 캐치 { }
85}
86}
87 objExcel.Workbooks.Close();
88 objExcel.Quit();
89 2018년 11월 89일
90 GC.수집();
91 }
92 캐치 { }
93}
94}
95 }
96
-