C# を使用してアプリケーション内で Excel ドキュメントを生成し、直接ダウンロード機能を提供することは、比較的一般的なアプリケーションです。ここでは、私が遭遇したいくつかの方法を記録します。注意が必要な点がいくつかあります。
a) 最初にデータ クラスを定義します。
コード
パブリック クラス DataContent
{
パブリック文字列名 { セット;
パブリック文字列アドレス { セット;
パブリック文字列電話 { 取得;
パブリック文字列 GetContentByIndex(int インデックス)
{
文字列値 = string.Empty;
スイッチ(インデックス)
{
ケース1:
値 = 名前;
壊す;
ケース 2:
値 = アドレス。
壊す;
ケース 3:
値 = 電話。
壊す;
デフォルト:
値 = "";
壊す;
}
戻り値;
}
}
b) 最も簡単な方法: HTML 文字列をつなぎ合わせて Excel ファイルを直接生成します。利点は次のとおりです。コードは非常に便利で、オフィス インターフェイスの拡張機能なしで動作します。欠点は、対象となるセルが制限されていることです。ただし、開くときに形式が正しくないという問題が依然としてあり、通常の閲覧や編集には影響しません。ただし、コードを通じて Excel ファイルを操作する必要がある一部のアプリケーションでは、コンテンツの読み取り時などに問題が発生する可能性があります。オレDB。
1 パブリック void GetExcelDataToClient()
2 {
3 List<DataContent> arrDatas = new List<DataContent>() {
4 new DataContent() { Address="aaa", Name="aaa", Phone="aaa" },
5 new DataContent() { Address="bbb", Phone="bbb", Name="bbb" },
6 新しい DataContent() { 名前 = "ccc"、電話 = "ccc"、アドレス "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>UserId</B></TD><TD><B>Attended </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> "、data.Name、data.Address、data.Phone、GetExCells(30)));
15 // 拡張行を追加します。
16 sb.Append(GetExRows(50, 33));
17 // 最後の部分。
18 sb.Append("</TABLE></BODY></HTML>");
19 // 結果を Excel ファイルとして応答します。
20 Response.ContentType = "アプリケーション/vnd.ms-excel";
21 Response.AddHeader("Content-Disposition", "attachment; filename=DataList.xls;filetype=excel");
22 Response.ContentEncoding = Encoding.GetEncoding("utf-8");
23 Response.Write(sb.ToString());
24 応答.Flush();
25 応答.End();
26}
27 // 拡張セルを追加します。
28 プライベート文字列 GetExCells(int num)
29 {
30 StringBuilder sb = 新しい StringBuilder(200);
31 for (int i = 0; i < num; i++)
32 sb.Append("<TD></TD>");
33 戻り値 sb.ToString();
34}
35 // 拡張行を追加します。
36 プライベート文字列 GetExRows(int rowNum, intcolNum)
37 {
38 StringBuilder sb = 新しい 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 プライベート void Test4()
2 {
3 文字列ファイルパス = @"C:Test.xls";
4 List<DataContent> arrDatas = new List<DataContent>() {
5 new DataContent() { Address="aaa", Name="aaa", Phone="aaa" },
6 new DataContent() { Address="bbb", Phone="bbb", Name="bbb" },
7 新しい DataContent() { 名前 = "ccc"、電話 = "ccc"、アドレス "ccc"}
8};
9
10 オブジェクト objOpt = System.Reflection.Missing.Value;
11 Excel.Application objExcel = null;
12 Excel.Workbooks objBooks = null;
13 Excel.Workbook objBook = null;
14 試してみる
15 {
16 トライ
17 {
18 objExcel = 新しい Excel.Application();
19}
20キャッチ(例外例)
21 {
22 Console.Write(例:メッセージ);
23 }
24
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(filePath))
48 System.IO.File.Delete(ファイルパス);
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();
55 objExcel = null;
56 GC.Collect();
57 //ファイルをクライアントに応答します。
58 string 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 応答.WriteFile(ファイルパス);
64 応答.フラッシュ();
65
66 if (System.IO.File.Exists(filePath))
67 System.IO.File.Delete(ファイルパス);
68 応答.End();
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 objExcel = null;
90 GC.Collect();
91 }
92 キャッチ { }
93}
94}
95 }
96
-