MdpExcelTemplateService.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using MiniExcelLibs;
  2. using Admin.NET.Plugin.AiDOP.Entity.DataPlatform;
  3. namespace Admin.NET.Plugin.AiDOP.DataPlatform.FileImport;
  4. public sealed class MdpExcelTemplateService : ITransient
  5. {
  6. public async Task<IActionResult> BuildAsync(MdpEntity entity, IReadOnlyList<MdpFieldMapping> mappings)
  7. {
  8. var cols = mappings
  9. .Where(m => !m.TargetField.Equals("tenant_id", StringComparison.OrdinalIgnoreCase)
  10. && !m.SourceField.StartsWith("CONST:", StringComparison.OrdinalIgnoreCase)
  11. && !m.SourceField.StartsWith("TO_JSON", StringComparison.OrdinalIgnoreCase)
  12. && !m.SourceField.StartsWith("COALESCE", StringComparison.OrdinalIgnoreCase))
  13. .OrderBy(m => m.SortOrder)
  14. .ToList();
  15. if (cols.Count == 0 && !string.IsNullOrWhiteSpace(entity.BizKeyExpr))
  16. {
  17. var i = 0;
  18. cols = entity.BizKeyExpr.Split(',', StringSplitOptions.TrimEntries)
  19. .Select(name => new MdpFieldMapping { SourceField = name, TargetField = name, IsRequired = 1, SortOrder = ++i * 10 })
  20. .ToList();
  21. }
  22. var headers = new Dictionary<string, object?>();
  23. foreach (var c in cols)
  24. {
  25. var title = c.IsRequired == 1 ? $"{c.SourceField} ★" : c.SourceField;
  26. headers[title] = null;
  27. }
  28. var memory = new MemoryStream();
  29. await memory.SaveAsAsync(new[] { headers }, sheetName: ReadSheet(entity));
  30. memory.Seek(0, SeekOrigin.Begin);
  31. return new FileStreamResult(memory, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  32. {
  33. FileDownloadName = $"{entity.EntityCode}-template.xlsx"
  34. };
  35. }
  36. public static string ReadSheet(MdpEntity entity)
  37. {
  38. if (string.IsNullOrWhiteSpace(entity.FileConfigJson))
  39. return "数据";
  40. try
  41. {
  42. using var doc = System.Text.Json.JsonDocument.Parse(entity.FileConfigJson);
  43. if (doc.RootElement.TryGetProperty("sheetName", out var s))
  44. return s.GetString() ?? "数据";
  45. }
  46. catch { /* ignore */ }
  47. return "数据";
  48. }
  49. }