From 8509f04d4daa48cf2158ab86e0c5773982da4272 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 13 Nov 2023 19:22:21 +0100 Subject: [PATCH] Ods: Add settings.xml --- Elwig/Helpers/Export/Ods.cs | 78 +++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 20 deletions(-) diff --git a/Elwig/Helpers/Export/Ods.cs b/Elwig/Helpers/Export/Ods.cs index 04d5e7c..85fc64a 100644 --- a/Elwig/Helpers/Export/Ods.cs +++ b/Elwig/Helpers/Export/Ods.cs @@ -1,4 +1,5 @@ using Elwig.Models.Dtos; +using ScottPlot; using System; using System.Collections.Generic; using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder; @@ -6,44 +7,36 @@ using System.IO; using System.IO.Compression; using System.Linq; using System.Threading.Tasks; -using System.Windows; namespace Elwig.Helpers.Export { - public class OdsFile : IDisposable, IAsyncDisposable { + public class OdsFile : IDisposable { protected readonly string FileName; protected readonly ZipArchive ZipArchive; protected StreamWriter? Content; + private readonly List _tables; public OdsFile(string filename) { FileName = filename; File.Delete(filename); - ZipArchive = ZipFile.Open(FileName, ZipArchiveMode.Create); ; - Content = null; + ZipArchive = ZipFile.Open(FileName, ZipArchiveMode.Create); + _tables = new List(); } public void Dispose() { - DisposeAsync().GetAwaiter().GetResult(); - } - - public async ValueTask DisposeAsync() { - await AddTrailer(); - Content?.Close(); - Content?.DisposeAsync(); + AddTrailer().GetAwaiter().GetResult(); ZipArchive?.Dispose(); GC.SuppressFinalize(this); } private async Task AddHeader() { var mimetype = ZipArchive.CreateEntry("mimetype", CompressionLevel.NoCompression); - using (var stream = mimetype.Open()) { - using var writer = new StreamWriter(stream, Utils.UTF8); + using (var writer = new StreamWriter(mimetype.Open(), Utils.UTF8)) { await writer.WriteAsync("application/vnd.oasis.opendocument.spreadsheet"); } var manifest = ZipArchive.CreateEntry("META-INF/manifest.xml"); - using (var stream = manifest.Open()) { - using var writer = new StreamWriter(stream, Utils.UTF8); + using (var writer = new StreamWriter(manifest.Open(), Utils.UTF8)) { await writer.WriteAsync(""" @@ -51,14 +44,14 @@ namespace Elwig.Helpers.Export { + """); } var styles = ZipArchive.CreateEntry("styles.xml"); - using (var stream = styles.Open()) { - using var writer = new StreamWriter(stream, Utils.UTF8); + using (var writer = new StreamWriter(styles.Open(), Utils.UTF8)) { await writer.WriteAsync(""" @@ -68,8 +61,7 @@ namespace Elwig.Helpers.Export { } var meta = ZipArchive.CreateEntry("meta.xml"); - using (var stream = meta.Open()) { - using var writer = new StreamWriter(stream, Utils.UTF8); + using (var writer = new StreamWriter(meta.Open(), Utils.UTF8)) { var now = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ"); await writer.WriteAsync($""" @@ -119,7 +111,51 @@ namespace Elwig.Helpers.Export { private async Task AddTrailer() { if (Content == null) await AddHeader(); if (Content == null) return; - await Content.WriteAsync(" \r\n \r\n\r\n"); + + await Content.WriteAsync(""" + + + + + """); + Content.Close(); + Content.Dispose(); + Content = null; + + var settings = ZipArchive.CreateEntry("settings.xml"); + using (var writer = new StreamWriter(settings.Open(), Utils.UTF8)) { + await writer.WriteAsync(""" + + + + + + + + + """); + + foreach (var tbl in _tables) { + await writer.WriteAsync($""" + + 2 + 3 + 3 + + + """); + } + + await writer.WriteAsync(""" + + + + + + + + """); + } } public async Task AddTable(DataTable table) { @@ -127,6 +163,8 @@ namespace Elwig.Helpers.Export { if (Content == null) return; var totalSpan = table.ColumnSpans.Sum(s => s.Item2); + _tables.Add(table.FullName); + await Content.WriteAsync( $" \r\n" + $" \r\n" +