From cac538ee39168253dbb0e4ca2f6db8b3447be008 Mon Sep 17 00:00:00 2001 From: Aloento <11802769+Aloento@users.noreply.github.com> Date: Wed, 7 Feb 2024 19:09:38 +0100 Subject: [PATCH] [Back] SharedStringTable --- TSystems.LoveOTC/AdminHub/Order/Export.cs | 120 +++++++++++++++++----- 1 file changed, 93 insertions(+), 27 deletions(-) diff --git a/TSystems.LoveOTC/AdminHub/Order/Export.cs b/TSystems.LoveOTC/AdminHub/Order/Export.cs index 33f5a1b..ee6dbec 100644 --- a/TSystems.LoveOTC/AdminHub/Order/Export.cs +++ b/TSystems.LoveOTC/AdminHub/Order/Export.cs @@ -57,6 +57,13 @@ public async IAsyncEnumerable ExportOrder() { }; sheets.Append(sheet); + var timestamp = new Row(); + sheetData.AppendChild(timestamp); + timestamp.Append(new Cell { + DataType = CellValues.String, + CellValue = new($"This order sheet was exported on {DateTime.Now:yyyy-MM-dd HH:mm}") + }); + var headerRow = new Row(); sheetData.AppendChild(headerRow); headerRow.Append(headers.Select(x => new Cell { @@ -69,6 +76,12 @@ public async IAsyncEnumerable ExportOrder() { .Distinct() .ToArrayAsync(); + var sharedStringTablePart = workbookPart.GetPartsOfType().Any() + ? workbookPart.GetPartsOfType().First() + : workbookPart.AddNewPart(); + + sharedStringTablePart.SharedStringTable ??= new(); + foreach (var userId in userIds) { var records = this.Db.OrderCombos .Where(x => x.Order.UserId == userId) @@ -86,7 +99,6 @@ public async IAsyncEnumerable ExportOrder() { .AsAsyncEnumerable(); var prevId = 0u; - var first = true; await foreach (var record in records) { var order = record.Order; @@ -94,10 +106,19 @@ public async IAsyncEnumerable ExportOrder() { var combo = record.Combo; var currId = order.OrderId; - var data = new List(12) { - currId.ToString(), - order.CreateAt.ToString("yyyy-MM-dd HH:mm"), - combo.Product.Name + var data = new List(12) { + new Cell { + DataType = CellValues.Number, + CellValue = new((decimal)currId) + }, + new Cell { + DataType = CellValues.String, + CellValue = new(order.CreateAt.ToString("yyyy-MM-dd HH:mm")) + }, + new Cell { + DataType = CellValues.SharedString, + CellValue = new(shared(combo.Product.Name)) + } }; var types = combo.Types.Aggregate( @@ -112,24 +133,48 @@ public async IAsyncEnumerable ExportOrder() { .ToString(); data.AddRange([ - types, - record.Quantity.ToString(), - order.Status.ToString(), - order.TrackingNumber ?? "/", - user.Name + new Cell { + DataType = CellValues.String, + CellValue = new(types) + }, + new Cell { + DataType = CellValues.Number, + CellValue = new((decimal)record.Quantity) + }, + new Cell { + DataType = CellValues.SharedString, + CellValue = new(shared(order.Status.ToString())) + } ]); - if (first) { - data.AddRange([ - user.EMail, - user.Phone, - user.Address - ]); - first = false; - } else - data.AddRange([ - "-", "-", "-" - ]); + data.Add(string.IsNullOrWhiteSpace(order.TrackingNumber) + ? new Cell { + DataType = CellValues.String, + CellValue = new("/") + } + : new() { + DataType = CellValues.SharedString, + CellValue = new(shared(order.TrackingNumber)) + }); + + data.AddRange([ + new Cell { + DataType = CellValues.SharedString, + CellValue = new(shared(user.Name)) + }, + new Cell { + DataType = CellValues.SharedString, + CellValue = new(shared(user.EMail)) + }, + new Cell { + DataType = CellValues.SharedString, + CellValue = new(shared(user.Phone)) + }, + new Cell { + DataType = CellValues.SharedString, + CellValue = new(shared(user.Address)) + } + ]); if (prevId != currId) { var cmts = order.Comments @@ -147,16 +192,19 @@ public async IAsyncEnumerable ExportOrder() { }) .ToString(); - data.Add(cmts); + data.Add(new Cell { + DataType = CellValues.String, + CellValue = new(cmts) + }); } else - data.Add("-"); + data.Add(new Cell { + DataType = CellValues.String, + CellValue = new("-") + }); var row = new Row(); sheetData.AppendChild(row); - row.Append(data.Select(x => new Cell { - DataType = CellValues.String, - CellValue = new(x) - })); + row.Append(data); prevId = currId; } @@ -171,5 +219,23 @@ public async IAsyncEnumerable ExportOrder() { while ((bytesRead = await stream.ReadAsync(buffer)) > 0) yield return buffer[..bytesRead]; + + yield break; + + int shared(string text) { + var i = 0; + + foreach (var item in sharedStringTablePart!.SharedStringTable.Elements()) { + if (item.InnerText == text) + return i; + + i++; + } + + sharedStringTablePart.SharedStringTable.AppendChild(new SharedStringItem(new Text(text))); + sharedStringTablePart.SharedStringTable.Save(); + + return i; + } } }