| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- using MiniExcelLibs;
- using Admin.NET.Plugin.AiDOP.Entity.DataPlatform;
- namespace Admin.NET.Plugin.AiDOP.DataPlatform.FileImport;
- public sealed class MdpExcelTemplateService : ITransient
- {
- public async Task<IActionResult> BuildAsync(MdpEntity entity, IReadOnlyList<MdpFieldMapping> mappings)
- {
- var cols = mappings
- .Where(m => !m.TargetField.Equals("tenant_id", StringComparison.OrdinalIgnoreCase)
- && !m.SourceField.StartsWith("CONST:", StringComparison.OrdinalIgnoreCase)
- && !m.SourceField.StartsWith("TO_JSON", StringComparison.OrdinalIgnoreCase)
- && !m.SourceField.StartsWith("COALESCE", StringComparison.OrdinalIgnoreCase))
- .OrderBy(m => m.SortOrder)
- .ToList();
- if (cols.Count == 0 && !string.IsNullOrWhiteSpace(entity.BizKeyExpr))
- {
- var i = 0;
- cols = entity.BizKeyExpr.Split(',', StringSplitOptions.TrimEntries)
- .Select(name => new MdpFieldMapping { SourceField = name, TargetField = name, IsRequired = 1, SortOrder = ++i * 10 })
- .ToList();
- }
- var headers = new Dictionary<string, object?>();
- foreach (var c in cols)
- {
- var title = c.IsRequired == 1 ? $"{c.SourceField} ★" : c.SourceField;
- headers[title] = null;
- }
- var memory = new MemoryStream();
- await memory.SaveAsAsync(new[] { headers }, sheetName: ReadSheet(entity));
- memory.Seek(0, SeekOrigin.Begin);
- return new FileStreamResult(memory, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
- {
- FileDownloadName = $"{entity.EntityCode}-template.xlsx"
- };
- }
- public static string ReadSheet(MdpEntity entity)
- {
- if (string.IsNullOrWhiteSpace(entity.FileConfigJson))
- return "数据";
- try
- {
- using var doc = System.Text.Json.JsonDocument.Parse(entity.FileConfigJson);
- if (doc.RootElement.TryGetProperty("sheetName", out var s))
- return s.GetString() ?? "数据";
- }
- catch { /* ignore */ }
- return "数据";
- }
- }
|