English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、Asp.net MVCでExcelの生成およびダウンロードを実現する具体的なコードを共有し、皆様の参考にしました。詳細は以下の通りです
プロジェクトの要件に応じて、特定条件のExcelファイルを出力する必要がありました。色々試行錯誤を重ねてようやく実現しました。
今、コードを貼り付けて共有します
(プロジェクト内の一部のサブジェクトのコードを共有します)
このプロジェクトではAsp.Net MVCを使用しています4.0モード。
每个ActionResult必然会返回一个View或Json等(View或Json中的参数都是object类型的)
したがって、操作の「成功または失敗」の状態やメッセージの返却を統一定義し、jquery $.get() 、$.post()を使用する際の統一性を有利にするための公共クラスが必要です。
以下はStatusMessageDataクラスです。(もちろん、Excelを出力するだけならこのクラスは定義しなくても良いです。)
/// <summary> /// StatusMessageデータの補助的な転送 /// </summary> [Serializable] public sealed class StatusMessageData { private StatusMessageType messageType; /// <summary> /// ヒントメッセージカテゴリ /// </summary> public StatusMessageType MessageType { get { return messageType; } set { messageType = value; } }); private string messageContent = string.Empty; /// <summary> /// 情報内容 /// </summary> public string MessageContent { get { return messageContent; } set { messageContent = value; } }); private object data; /// <summary> /// データ /// </summary> public object Data { get { return data; } set { data = value; } }); /// <summary> /// コンストラクタ /// </summary> /// <param name="messageType">メッセージタイプ</param> /// <param name="messageContent">メッセージ内容</param> public StatusMessageData(StatusMessageType messageType, string messageContent, object data) { this.messageType = messageType; this.messageContent = messageContent; this.data = data; }); public StatusMessageData(StatusMessageType messageType, string messageContent) { this.messageType = messageType; this.messageContent = messageContent; }); public StatusMessageData() { }); }); /// <summary> /// ヒントメッセージカテゴリ /// </summary> public enum StatusMessageType { /// <summary> /// 成功 /// </summary> Success = 1, /// <summary> /// エラー /// </summary> Error = -1, /// <summary> /// ヒント情報 /// </summary> Hint = 0, /// <summary> /// ログインを促す /// </summary> Login = 5, /// <summary> /// リダイレクトを促す /// </summary> Redirect = 6, });
Controller内でExportExcel ActionResultを定義
[HttpPost] public ActionResult ExportExcel(SearchModel model) { StatusMessageData result = new StatusMessageData(); if (model.Data == null || model.Data.Count <= 0) { result.MessageType = StatusMessageType.Error; result.MessageContent = "ダウンロードするデータがありません"; return Json(result); }); string fileglobal = ""; //Excelテーブルを構成 StringBuilder sb = new StringBuilder(400); sb.Append("<table cellspacing='0' rules='all' border='1>"); sb.Append("<thead>"; sb.Append("<tr>"; sb.Append("<th>列一</th>"; sb.Append("<th>列二</th>"; sb.Append("<th>列三</th>"; sb.Append("<th>列四</th>"; sb.Append("</tr>"; sb.Append("</thead>"; sb.Append("<tbody>"; try { foreach (var item in model.Data) { sb.Append("<tr>"; sb.Append("<td>"; sb.Append(item.column1; sb.Append("</td>"; sb.Append("<td>"; sb.Append(item.column2; sb.Append("</td>"; sb.Append("<td>"; sb.Append(item.column3; sb.Append("</td>"; sb.Append("<td>"; sb.Append(item.column4; sb.Append("</td>"; sb.Append("</tr>"; }); }); sb.Append("</tbody>"; sb.Append("</table>"; //UTF8ファイルに形式書き込み byte[] contentBytes = Encoding.UTF8.GetBytes(sb.ToString()); string rootDirServerPath = "生成されたファイルを指定されたディレクトリ名に保存する"; //私たちのプロジェクトではExcelファイルのダウンロードに並行処理がほとんどないため、ファイル名を年月日时分秒で命名することで同じファイル名が生成される問題を避けることができます。 string fileSaveName = "ダウンロードのファイル名_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; string rootDirServerPhysicPath = Server.MapPath("~" + rootDirServerPath); if (!Directory.Exists(rootDirServerPhysicPath)) { Directory.CreateDirectory(rootDirServerPhysicPath); }); string[] strFiles = Directory.GetFiles(rootDirServerPhysicPath); if (strFiles.Length > 0) { foreach (string strFile in strFiles) { System.IO.File.Delete(strFile); }); }); //ファイルを指定されたディレクトリに保存する方法について説明します。 string userFailedSummaryFileSavePath = rootDirServerPhysicPath + "/" + fileSaveName; if (System.IO.File.Exists(userFailedSummaryFileSavePath)) { System.IO.File.Delete(userFailedSummaryFileSavePath); }); System.IO.File.WriteAllBytes(userFailedSummaryFileSavePath, contentBytes); //ファイルをダウンロードするための完全なパスを構築します。 fileglobal = rootDirServerPath + "/" + fileSaveName; }); catch (Exception ex) { result.MessageType = StatusMessageType.Error; result.MessageContent = ex.Message.ToString(); return Json(result); }); result.MessageType = StatusMessageType.Success; result.MessageContent = "ダウンロード中、少々お待ちください..."; result.Data = fileglobal; return Json(result); });
Excelの生成操作が完了した後、ページで非同期呼び出しを行います。
$("#export-excel").click(function (e) { e.preventDefault(); $.post("Controller/ExportExcel.aspx", $("#Form1").serialize(), function (data) { art.dialog.tips(data.MessageContent, 1.5, data.MessageType, function () { if (data.MessageType == 1) { window.open(data.Data); } else { //エラー操作 }); }); }); });
これが私たちのプロジェクトでExcelの生成からダウンロードまでの全操作です。
考慮した事項が少なく、簡潔に記述しています。
皆様に良いアイデアがあれば、コメントを残してください。私は学び、実践し、共有するために必ず取り入れるでしょう。
ありがとうございます。
これで本文のすべてが終わり、皆様の学習に役立つことを願っています。皆様のサポートと応援を引き続きお願いします。
声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、自己でアップロードされたものであり、本サイトは所有権を有しておらず、人工的な編集は行われていません。著作権侵害が疑われる内容を見つけた場合は、メールを送信して:notice#oldtoolbag.com(メール送信時、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害疑いのコンテンツを削除します。