WebApi ControllerBase 的扩展
1 public class BaseController : ControllerBase 2 { 3 public static string TIME_FORMAT_FULL = "yyyy-MM-dd HH:mm:ss"; 4 5 /// <summary> 6 /// 返回成功封装 7 /// </summary> 8 /// <param name="data"></param> 9 /// <param name="timeFormatStr"></param> 10 /// <returns></returns> 11 protected IActionResult SUCCESS(object data, string timeFormatStr = "yyyy-MM-dd HH:mm:ss") 12 { 13 string jsonStr = GetJsonStr(GetApiResult(data != null ? ResultCode.SUCCESS : ResultCode.NO_DATA, data), timeFormatStr); 14 return Content(jsonStr, "application/json"); 15 } 16 17 /// <summary> 18 /// json输出带时间格式的 19 /// </summary> 20 /// <param name="apiResult"></param> 21 /// <returns></returns> 22 protected IActionResult ToResponse(ApiResult apiResult) 23 { 24 string jsonStr = GetJsonStr(apiResult, TIME_FORMAT_FULL); 25 26 return Content(jsonStr, "application/json"); 27 } 28 29 protected IActionResult ToResponse(long rows, string timeFormatStr = "yyyy-MM-dd HH:mm:ss") 30 { 31 string jsonStr = GetJsonStr(ToJson(rows), timeFormatStr); 32 33 return Content(jsonStr, "application/json"); 34 } 35 36 protected IActionResult ToResponse(ResultCode resultCode, string msg = "") 37 { 38 return ToResponse(new ApiResult((int)resultCode, msg)); 39 } 40 41 /// <summary> 42 /// 导出Excel 43 /// </summary> 44 /// <param name="path">完整文件路径</param> 45 /// <param name="fileName">带扩展文件名</param> 46 /// <returns></returns> 47 protected IActionResult ExportExcel(string path, string fileName) 48 { 49 //var webHostEnvironment = App.WebHostEnvironment; 50 if (!Path.Exists(path)) 51 { 52 throw new CustomException.CustomException(fileName + "文件不存在"); 53 } 54 var stream = System.IO.File.OpenRead(path); //创建文件流 55 56 Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); 57 return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", HttpUtility.UrlEncode(fileName)); 58 } 59 60 #region 方法 61 62 /// <summary> 63 /// 响应返回结果 64 /// </summary> 65 /// <param name="rows">受影响行数</param> 66 /// <param name="data"></param> 67 /// <returns></returns> 68 protected ApiResult ToJson(long rows, object data = null) 69 { 70 return rows > 0 ? ApiResult.Success("success", data) : GetApiResult(ResultCode.FAIL); 71 } 72 73 /// <summary> 74 /// 全局Code使用 75 /// </summary> 76 /// <param name="resultCode"></param> 77 /// <param name="data"></param> 78 /// <returns></returns> 79 protected ApiResult GetApiResult(ResultCode resultCode, object data = null) 80 { 81 var msg = resultCode.GetDescription(); 82 83 return new ApiResult((int)resultCode, msg, data); 84 } 85 86 /// <summary> 87 /// </summary> 88 /// <param name="apiResult"></param> 89 /// <param name="timeFormatStr"></param> 90 /// <returns></returns> 91 private static string GetJsonStr(ApiResult apiResult, string timeFormatStr) 92 { 93 if (string.IsNullOrEmpty(timeFormatStr)) 94 { 95 timeFormatStr = TIME_FORMAT_FULL; 96 } 97 var serializerSettings = new JsonSerializerSettings 98 { 99 // 设置为驼峰命名 100 ContractResolver = new CamelCasePropertyNamesContractResolver(), 101 DateFormatString = timeFormatStr 102 }; 103 104 return JsonConvert.SerializeObject(apiResult, Formatting.Indented, serializerSettings); 105 } 106 107 #endregion 方法 108 109 /// <summary> 110 /// 导出Excel 111 /// </summary> 112 /// <typeparam name="T"></typeparam> 113 /// <param name="list"></param> 114 /// <param name="sheetName"></param> 115 /// <param name="fileName"></param> 116 protected string ExportExcel<T>(List<T> list, string sheetName, string fileName) 117 { 118 return ExportExcelMini(list, sheetName, fileName).Item1; 119 } 120 121 /// <summary> 122 /// </summary> 123 /// <typeparam name="T"></typeparam> 124 /// <param name="list"></param> 125 /// <param name="sheetName"></param> 126 /// <param name="fileName"></param> 127 /// <returns></returns> 128 protected (string, string) ExportExcelMini<T>(List<T> list, string sheetName, string fileName) 129 { 130 IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); 131 string sFileName = $"{fileName}{DateTime.Now:MM-dd-HHmmss}.xlsx"; 132 string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "export", sFileName); 133 134 Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); 135 136 MiniExcel.SaveAs(fullPath, list, sheetName: sheetName); 137 return (sFileName, fullPath); 138 } 139 140 /// <summary> 141 /// 导出多个工作表(Sheet) 142 /// </summary> 143 /// <param name="sheets"></param> 144 /// <param name="fileName"></param> 145 /// <returns></returns> 146 protected (string, string) ExportExcelMini(Dictionary<string, object> sheets, string fileName) 147 { 148 IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); 149 string sFileName = $"{fileName}{DateTime.Now:MM-dd-HHmmss}.xlsx"; 150 string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "export", sFileName); 151 152 Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); 153 154 MiniExcel.SaveAs(fullPath, sheets); 155 return (sFileName, fullPath); 156 } 157 158 /// <summary> 159 /// 下载导入模板 160 /// </summary> 161 /// <typeparam name="T">数据类型</typeparam> 162 /// <param name="list">空数据类型集合</param> 163 /// <param name="fileName">下载文件名</param> 164 /// <returns></returns> 165 protected (string, string) DownloadImportTemplate<T>(List<T> list, string fileName) 166 { 167 IWebHostEnvironment webHostEnvironment = App.App.WebHostEnvironment; 168 string sFileName = $"{fileName}.xlsx"; 169 string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "ImportTemplate", sFileName); 170 171 //不存在模板创建模板 172 if (!Directory.Exists(fullPath)) 173 { 174 Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); 175 MiniExcel.SaveAs(fullPath, list, overwriteFile: true); 176 } 177 return (sFileName, fullPath); 178 } 179 180 /// <summary> 181 /// 下载指定文件模板 182 /// </summary> 183 /// <param name="fileName">下载文件名</param> 184 /// <returns></returns> 185 protected (string, string) DownloadImportTemplate(string fileName) 186 { 187 IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); 188 string sFileName = $"{fileName}.xlsx"; 189 string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "ImportTemplate", sFileName); 190 191 return (sFileName, fullPath); 192 } 193 }
1 public class ApiResult 2 { 3 public int Code { get; set; } 4 public string Msg { get; set; } 5 /// <summary> 6 /// 如果data值为null,则忽略序列化将不会返回data字段 7 /// </summary> 8 [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 9 public object Data { get; set; } 10 11 /// <summary> 12 /// 初始化一个新创建的APIResult对象,使其表示一个空消息 13 /// </summary> 14 public ApiResult() 15 { 16 } 17 18 /// <summary> 19 /// 初始化一个新创建的 ApiResult 对象 20 /// </summary> 21 /// <param name="code"></param> 22 /// <param name="msg"></param> 23 public ApiResult(int code, string msg) 24 { 25 Code = code; 26 Msg = msg; 27 } 28 29 /// <summary> 30 /// 初始化一个新创建的 ApiResult 对象 31 /// </summary> 32 /// <param name="code"></param> 33 /// <param name="msg"></param> 34 public ApiResult(int code, string msg, object data) 35 { 36 Code = code; 37 Msg = msg; 38 if (data != null) 39 { 40 Data = data; 41 } 42 } 43 44 /// <summary> 45 /// 返回成功消息 46 /// </summary> 47 /// <returns></returns> 48 public ApiResult Success() 49 { 50 Code = (int)ResultCode.SUCCESS; 51 Msg = "success"; 52 return this; 53 } 54 55 ///// <summary> 56 ///// 返回成功消息 57 ///// </summary> 58 ///// <param name = "data" > 数据对象 </ param > 59 ///// < returns > 成功消息 </ returns > 60 //public static ApiResult Success(object data) { return new ApiResult(HttpStatus.SUCCESS, "success", data); } 61 62 /// <summary> 63 /// 返回成功消息 64 /// </summary> 65 /// <param name="msg">返回内容</param> 66 /// <returns>成功消息</returns> 67 public static ApiResult Success(string msg) { return new ApiResult(HttpStatus.SUCCESS, msg, null); } 68 69 /// <summary> 70 /// 返回成功消息 71 /// </summary> 72 /// <param name="msg">返回内容</param> 73 /// <param name="data">数据对象</param> 74 /// <returns>成功消息</returns> 75 public static ApiResult Success(string msg, object data) { return new ApiResult(HttpStatus.SUCCESS, msg, data); } 76 77 /// <summary> 78 /// 访问被拒 79 /// </summary> 80 /// <returns></returns> 81 public ApiResult On401() 82 { 83 Code = (int)ResultCode.DENY; 84 Msg = "access denyed"; 85 return this; 86 } 87 public ApiResult Error(ResultCode resultCode, string msg = "") 88 { 89 Code = (int)resultCode; 90 Msg = msg; 91 return this; 92 } 93 94 /// <summary> 95 /// 返回失败消息 96 /// </summary> 97 /// <param name="code"></param> 98 /// <param name="msg"></param> 99 /// <returns></returns> 100 public static ApiResult Error(int code, string msg) { return new ApiResult(code, msg); } 101 102 /// <summary> 103 /// 返回失败消息 104 /// </summary> 105 /// <param name="msg"></param> 106 /// <returns></returns> 107 public static ApiResult Error(string msg) { return new ApiResult((int)ResultCode.CUSTOM_ERROR, msg); } 108 109 public override string ToString() 110 { 111 return $"msg={Msg},data={Data}"; 112 } 113 } 114 115 public class ApiResult<T> : ApiResult 116 { 117 public T Result { get; set; } 118 }
ControllerBase 导出Excel 需要导入MiniExcelLibs
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构