From d485f0fda1bd1ab730c9ad33fbc219eeb3b0ef7a Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 13 Nov 2023 22:40:12 +0100 Subject: [PATCH] Ods: Fix small issues --- Elwig/Helpers/Export/Ods.cs | 9 ++++----- Elwig/Models/Dtos/DataTable.cs | 25 ++++++++++++++++--------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Elwig/Helpers/Export/Ods.cs b/Elwig/Helpers/Export/Ods.cs index 85fc64a..cc30d36 100644 --- a/Elwig/Helpers/Export/Ods.cs +++ b/Elwig/Helpers/Export/Ods.cs @@ -161,13 +161,12 @@ namespace Elwig.Helpers.Export { public async Task AddTable(DataTable table) { if (Content == null) await AddHeader(); if (Content == null) return; - var totalSpan = table.ColumnSpans.Sum(s => s.Item2); + var totalSpan = table.ColumnSpans.Sum(); _tables.Add(table.FullName); + await Content.WriteAsync($" \r\n"); await Content.WriteAsync( - $" \r\n" + - $" \r\n" + $" \r\n" + FormatCell(table.FullName, colSpan: totalSpan, style: "header") + $" \r\n" + @@ -175,7 +174,7 @@ namespace Elwig.Helpers.Export { $" \r\n" + $" \r\n" + $" \r\n"); - foreach (var (name, span) in table.ColumnSpans) { + foreach (var (name, span) in table.ColumnNames.Zip(table.ColumnSpans)) { await Content.WriteAsync(FormatCell(name, colSpan: span, style: "th")); } await Content.WriteAsync(" \r\n"); @@ -219,7 +218,7 @@ namespace Elwig.Helpers.Export { c = $"{data}"; } - return c = $" {c}\r\n" + (colSpan > 1 ? $" \r\n" : ""); + return $" {c}\r\n" + (colSpan > 1 ? $" \r\n" : ""); } } } diff --git a/Elwig/Models/Dtos/DataTable.cs b/Elwig/Models/Dtos/DataTable.cs index 9a95fd1..876abd5 100644 --- a/Elwig/Models/Dtos/DataTable.cs +++ b/Elwig/Models/Dtos/DataTable.cs @@ -10,18 +10,14 @@ namespace Elwig.Models.Dtos { public string FullName { get; set; } public IEnumerable Rows { get; private set; } public int RowNum => Rows.Count(); + public int ColNum => ColumnNames.Count(); + public IEnumerable<(string, Type?)> ColumnDefs => _map.Select(m => (m.Item1, m.Item2?.PropertyType ?? m.Item3?.FieldType)); public IEnumerable ColumnNames => ColumnDefs.Select(m => m.Item1); public IEnumerable ColumnTypes => ColumnDefs.Select(m => m.Item2); - public IEnumerable<(string, int)> ColumnSpans => ColumnDefs.Select(c => { - var type = c.Item2; - var elType = type?.GetElementType(); - return (c.Item1, - type != null && type.IsValueType && type.Name.StartsWith("ValueTuple") ? type.GetFields().Length : - type != null && elType != null && type.IsArray && elType.IsValueType && elType.Name.StartsWith("ValueTuple") ? elType.GetFields().Length : 1 - ); - }).ToList(); - public int ColNum => ColumnNames.Count(); + public IEnumerable ColumnFlatTypes { get; private set; } + public IEnumerable ColumnSpans { get; private set; } + private readonly PropertyInfo[] _properties; private readonly FieldInfo[] _fields; private readonly (string, PropertyInfo?, FieldInfo?)[] _map; @@ -34,6 +30,17 @@ namespace Elwig.Models.Dtos { Name = name; FullName = fullName; Rows = rows; + ColumnFlatTypes = ColumnTypes.SelectMany(type => { + var elType = type?.GetElementType(); + return type != null && type.IsValueType && type.Name.StartsWith("ValueTuple") ? type.GetFields().Select(f => f.FieldType) : + type != null && elType != null && type.IsArray && elType.IsValueType && elType.Name.StartsWith("ValueTuple") ? elType.GetFields().Select(f => f.FieldType) : + new Type?[] { type }; + }).ToList(); + ColumnSpans = ColumnTypes.Select(type => { + var elType = type?.GetElementType(); + return type != null && type.IsValueType && type.Name.StartsWith("ValueTuple") ? type.GetFields().Length : + type != null && elType != null && type.IsArray && elType.IsValueType && elType.Name.StartsWith("ValueTuple") ? elType.GetFields().Length : 1; + }).ToList(); } public DataTable(string name, IEnumerable rows, IEnumerable<(string, string)>? colNames = null) :