diff --git a/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.Impl.cs b/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.Impl.cs index 96f2899d..e021acb0 100644 --- a/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.Impl.cs +++ b/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.Impl.cs @@ -153,7 +153,7 @@ private async Task GenerateSheetXmlImplByUpdateModeAsync(ZipArchiveEntry sheetZi var doc = new XmlDocument(); doc.Load(sheetStream); #if NET5_0_OR_GREATER - await sheetStream.DisposeAsync().ConfigureAwait(false); + await sheetStream.DisposeAsync().ConfigureAwait(false); #else sheetStream.Dispose(); #endif @@ -172,16 +172,33 @@ private async Task GenerateSheetXmlImplByUpdateModeAsync(ZipArchiveEntry sheetZi await WriteSheetXmlAsync(stream, doc, sheetData, mergeCells, cancellationToken).ConfigureAwait(false); } - private void GenerateSheetXmlImplByCreateMode(ZipArchiveEntry templateSheetZipEntry, Stream outputZipSheetEntryStream, Stream outputSheetStream, IDictionary inputMaps, IDictionary sharedStrings, bool mergeCells = false) + [CreateSyncVersion] + private async Task GenerateSheetXmlImplByCreateModeAsync(ZipArchiveEntry templateSheetZipEntry, Stream outputZipSheetEntryStream, IDictionary inputMaps, IDictionary sharedStrings, bool mergeCells = false) { - var doc = new XmlDocument(); - using (var newTemplateStream = templateSheetZipEntry.Open()) + Stream? newTemplateStream = null; + var doc = new XmlDocument { + XmlResolver = null + }; + + try + { +#if NET10_0_OR_GREATER + newTemplateStream = await templateSheetZipEntry.OpenAsync().ConfigureAwait(false); +#else + newTemplateStream = templateSheetZipEntry.Open(); +#endif doc.Load(newTemplateStream); } - - //outputSheetStream.Dispose(); - //sheetZipEntry.Delete(); // ZipArchiveEntry can't update directly, so need to delete then create logic + finally + { +#if NET5_0_OR_GREATER + if (newTemplateStream is not null) + await newTemplateStream.DisposeAsync().ConfigureAwait(false); +#else + newTemplateStream?.Dispose(); +#endif + } var worksheet = doc.SelectSingleNode("/x:worksheet", Ns); var sheetData = doc.SelectSingleNode("/x:worksheet/x:sheetData", Ns); @@ -192,7 +209,7 @@ private void GenerateSheetXmlImplByCreateMode(ZipArchiveEntry templateSheetZipEn GetMergeCells(doc, worksheet); UpdateDimensionAndGetRowsInfo(inputMaps, doc, rows, !mergeCells); - WriteSheetXml(outputZipSheetEntryStream, doc, sheetData, mergeCells); + await WriteSheetXmlAsync(outputZipSheetEntryStream, doc, sheetData, mergeCells).ConfigureAwait(false); } private void GetMergeCells(XmlDocument doc, XmlNode worksheet) diff --git a/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.cs index fd48d178..2f487dbd 100644 --- a/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.cs +++ b/src/MiniExcel.OpenXml/Templates/OpenXmlTemplate.cs @@ -113,10 +113,10 @@ await originalEntryStream.CopyToAsync(newEntryStream templateStream.Position = 0; //read all xlsx sheets - var templateSheets = Enumerable - .Where(templateReader.Archive.ZipFile.Entries, w => - w.FullName.StartsWith("xl/worksheets/sheet", StringComparison.OrdinalIgnoreCase) || - w.FullName.StartsWith("/xl/worksheets/sheet", StringComparison.OrdinalIgnoreCase)); + var templateSheets = templateReader.Archive.ZipFile.Entries + .Where(entry => + entry.FullName.StartsWith("xl/worksheets/sheet", StringComparison.OrdinalIgnoreCase) || + entry.FullName.StartsWith("/xl/worksheets/sheet", StringComparison.OrdinalIgnoreCase)); int sheetIdx = 0; foreach (var templateSheet in templateSheets) @@ -141,7 +141,7 @@ await originalEntryStream.CopyToAsync(newEntryStream #else using var outputZipSheetEntryStream = outputZipEntry.Open(); #endif - GenerateSheetXmlImplByCreateMode(templateSheet, outputZipSheetEntryStream, templateSheetStream, inputValues, templateSharedStrings); + await GenerateSheetXmlImplByCreateModeAsync(templateSheet, outputZipSheetEntryStream, inputValues, templateSharedStrings).ConfigureAwait(false); //doc.Save(zipStream); //don't do it because: https://user-images.githubusercontent.com/12729184/114361127-61a5d100-9ba8-11eb-9bb9-34f076ee28a2.png // disposing writer disposes streams as well. read and parse calc functions before that