CommonUtil.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // 麻省理工学院许可证
  2. //
  3. // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司 联系电话/微信:18020030720 QQ:515096995
  4. //
  5. // 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
  6. //
  7. // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
  8. // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
  9. using System.Xml;
  10. using System.Xml.Linq;
  11. using System.Xml.Serialization;
  12. namespace Admin.NET.Core;
  13. /// <summary>
  14. /// 通用工具类
  15. /// </summary>
  16. public static class CommonUtil
  17. {
  18. /// <summary>
  19. /// 生成百分数
  20. /// </summary>
  21. /// <param name="PassCount"></param>
  22. /// <param name="allCount"></param>
  23. /// <returns></returns>
  24. public static string ExecPercent(decimal PassCount, decimal allCount)
  25. {
  26. string res = "";
  27. if (allCount > 0)
  28. {
  29. var value = (double)Math.Round(PassCount / allCount * 100, 1);
  30. if (value < 0)
  31. res = Math.Round(value + 5 / Math.Pow(10, 0 + 1), 0, MidpointRounding.AwayFromZero).ToString();
  32. else
  33. res = Math.Round(value, 0, MidpointRounding.AwayFromZero).ToString();
  34. }
  35. if (res == "") res = "0";
  36. return res + "%";
  37. }
  38. /// <summary>
  39. /// 获取服务地址
  40. /// </summary>
  41. /// <returns></returns>
  42. public static string GetLocalhost()
  43. {
  44. string result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}";
  45. // 代理模式:获取真正的本机地址
  46. // X-Original-Host=原始请求
  47. // X-Forwarded-Server=从哪里转发过来
  48. if (App.HttpContext.Request.Headers.ContainsKey("Origin")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com
  49. result = $"{App.HttpContext.Request.Headers["Origin"]}";
  50. else if (App.HttpContext.Request.Headers.ContainsKey("X-Original")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com
  51. result = $"{App.HttpContext.Request.Headers["X-Original"]}";
  52. else if (App.HttpContext.Request.Headers.ContainsKey("X-Original-Host"))
  53. result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Headers["X-Original-Host"]}";
  54. return result;
  55. }
  56. /// <summary>
  57. /// 对象序列化XML
  58. /// </summary>
  59. /// <typeparam name="T"></typeparam>
  60. /// <param name="obj"></param>
  61. /// <returns></returns>
  62. public static string SerializeObjectToXml<T>(T obj)
  63. {
  64. if (obj == null) return string.Empty;
  65. var xs = new XmlSerializer(obj.GetType());
  66. var stream = new MemoryStream();
  67. var setting = new XmlWriterSettings
  68. {
  69. Encoding = new UTF8Encoding(false), // 不包含BOM
  70. Indent = true // 设置格式化缩进
  71. };
  72. using (var writer = XmlWriter.Create(stream, setting))
  73. {
  74. var ns = new XmlSerializerNamespaces();
  75. ns.Add("", ""); // 去除默认命名空间
  76. xs.Serialize(writer, obj, ns);
  77. }
  78. return Encoding.UTF8.GetString(stream.ToArray());
  79. }
  80. /// <summary>
  81. /// 字符串转XML格式
  82. /// </summary>
  83. /// <param name="xmlStr"></param>
  84. /// <returns></returns>
  85. public static XElement SerializeStringToXml(string xmlStr)
  86. {
  87. try
  88. {
  89. return XElement.Parse(xmlStr);
  90. }
  91. catch
  92. {
  93. return null;
  94. }
  95. }
  96. /// <summary>
  97. /// 导出模板Excel
  98. /// </summary>
  99. /// <param name="fileName"></param>
  100. /// <param name="fileDto"></param>
  101. /// <returns></returns>
  102. public static async Task<IActionResult> ExportExcelTemplate(string fileName, dynamic fileDto)
  103. {
  104. fileName = $"{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
  105. IImporter importer = new ExcelImporter();
  106. MethodInfo generateTemplateMethod = importer.GetType().GetMethod("GenerateTemplate");
  107. MethodInfo closedGenerateTemplateMethod = generateTemplateMethod.MakeGenericMethod(fileDto.GetType());
  108. var res = await (Task<dynamic>)closedGenerateTemplateMethod.Invoke(importer, new object[] { Path.Combine(App.WebHostEnvironment.WebRootPath, fileName) });
  109. return new FileStreamResult(new FileStream(res.FileName, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
  110. }
  111. /// <summary>
  112. /// 导入数据Excel
  113. /// </summary>
  114. /// <param name="file"></param>
  115. /// <param name="dataDto"></param>
  116. /// <returns></returns>
  117. public static async Task<dynamic> ImportExcelData([Required] IFormFile file, dynamic dataDto)
  118. {
  119. var newFile = await App.GetRequiredService<SysFileService>().UploadFile(file, "");
  120. var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, newFile.FilePath, newFile.Id.ToString(), newFile.Suffix);
  121. IImporter importer = new ExcelImporter();
  122. MethodInfo importMethod = importer.GetType().GetMethod("Import");
  123. MethodInfo closedImportMethod = importMethod.MakeGenericMethod(dataDto.GetType());
  124. var res = await (Task<dynamic>)closedImportMethod.Invoke(importer, new object[] { filePath });
  125. if (res == null || res.Exception != null)
  126. throw Oops.Oh("导入异常:" + res.Exception);
  127. return res.Data;
  128. }
  129. }