CommonUtil.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // 大名科技(天津)有限公司 版权所有
  2. //
  3. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动
  6. //
  7. // 任何基于本项目二次开发而产生的一切法律纠纷和责任,均与作者无关
  8. using System.Xml;
  9. using System.Xml.Linq;
  10. using System.Xml.Serialization;
  11. namespace Admin.NET.Core;
  12. /// <summary>
  13. /// 通用工具类
  14. /// </summary>
  15. public static class CommonUtil
  16. {
  17. /// <summary>
  18. /// 生成百分数
  19. /// </summary>
  20. /// <param name="PassCount"></param>
  21. /// <param name="allCount"></param>
  22. /// <returns></returns>
  23. public static string ExecPercent(decimal PassCount, decimal allCount)
  24. {
  25. string res = "";
  26. if (allCount > 0)
  27. {
  28. var value = (double)Math.Round(PassCount / allCount * 100, 1);
  29. if (value < 0)
  30. res = Math.Round(value + 5 / Math.Pow(10, 0 + 1), 0, MidpointRounding.AwayFromZero).ToString();
  31. else
  32. res = Math.Round(value, 0, MidpointRounding.AwayFromZero).ToString();
  33. }
  34. if (res == "") res = "0";
  35. return res + "%";
  36. }
  37. /// <summary>
  38. /// 获取服务地址
  39. /// </summary>
  40. /// <returns></returns>
  41. public static string GetLocalhost()
  42. {
  43. string result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}";
  44. // 代理模式:获取真正的本机地址
  45. // X-Original-Host=原始请求
  46. // X-Forwarded-Server=从哪里转发过来
  47. if (App.HttpContext.Request.Headers.ContainsKey("Origin")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com
  48. result = $"{App.HttpContext.Request.Headers["Origin"]}";
  49. else if (App.HttpContext.Request.Headers.ContainsKey("X-Original")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com
  50. result = $"{App.HttpContext.Request.Headers["X-Original"]}";
  51. else if (App.HttpContext.Request.Headers.ContainsKey("X-Original-Host"))
  52. result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Headers["X-Original-Host"]}";
  53. return result;
  54. }
  55. /// <summary>
  56. /// 对象序列化XML
  57. /// </summary>
  58. /// <typeparam name="T"></typeparam>
  59. /// <param name="obj"></param>
  60. /// <returns></returns>
  61. public static string SerializeObjectToXml<T>(T obj)
  62. {
  63. if (obj == null) return string.Empty;
  64. var xs = new XmlSerializer(obj.GetType());
  65. var stream = new MemoryStream();
  66. var setting = new XmlWriterSettings
  67. {
  68. Encoding = new UTF8Encoding(false), // 不包含BOM
  69. Indent = true // 设置格式化缩进
  70. };
  71. using (var writer = XmlWriter.Create(stream, setting))
  72. {
  73. var ns = new XmlSerializerNamespaces();
  74. ns.Add("", ""); // 去除默认命名空间
  75. xs.Serialize(writer, obj, ns);
  76. }
  77. return Encoding.UTF8.GetString(stream.ToArray());
  78. }
  79. /// <summary>
  80. /// 字符串转XML格式
  81. /// </summary>
  82. /// <param name="xmlStr"></param>
  83. /// <returns></returns>
  84. public static XElement SerializeStringToXml(string xmlStr)
  85. {
  86. try
  87. {
  88. return XElement.Parse(xmlStr);
  89. }
  90. catch
  91. {
  92. return null;
  93. }
  94. }
  95. /// <summary>
  96. /// 导出模板Excel
  97. /// </summary>
  98. /// <param name="fileName"></param>
  99. /// <param name="fileDto"></param>
  100. /// <returns></returns>
  101. public static async Task<IActionResult> ExportExcelTemplate(string fileName, dynamic fileDto)
  102. {
  103. fileName = $"{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
  104. IImporter importer = new ExcelImporter();
  105. MethodInfo generateTemplateMethod = importer.GetType().GetMethod("GenerateTemplate");
  106. MethodInfo closedGenerateTemplateMethod = generateTemplateMethod.MakeGenericMethod(fileDto.GetType());
  107. var res = await (Task<dynamic>)closedGenerateTemplateMethod.Invoke(importer, new object[] { Path.Combine(App.WebHostEnvironment.WebRootPath, fileName) });
  108. return new FileStreamResult(new FileStream(res.FileName, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
  109. }
  110. /// <summary>
  111. /// 导入数据Excel
  112. /// </summary>
  113. /// <param name="file"></param>
  114. /// <param name="dataDto"></param>
  115. /// <returns></returns>
  116. public static async Task<dynamic> ImportExcelData([Required] IFormFile file, dynamic dataDto)
  117. {
  118. var newFile = await App.GetRequiredService<SysFileService>().UploadFile(file, "");
  119. var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, newFile.FilePath, newFile.Id.ToString(), newFile.Suffix);
  120. IImporter importer = new ExcelImporter();
  121. MethodInfo importMethod = importer.GetType().GetMethod("Import");
  122. MethodInfo closedImportMethod = importMethod.MakeGenericMethod(dataDto.GetType());
  123. var res = await (Task<dynamic>)closedImportMethod.Invoke(importer, new object[] { filePath });
  124. if (res == null || res.Exception != null)
  125. throw Oops.Oh("导入异常:" + res.Exception);
  126. return res.Data;
  127. }
  128. }