From f9db28b945c3cda14dccbe4028814d3aead4456a Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sat, 19 Jul 2025 20:18:05 +0200 Subject: [PATCH 1/2] Making the overload for SaveAsByTemplate with a streamed template public and callable in the API --- src/MiniExcel/IExcelTemplate.cs | 5 ++++- src/MiniExcel/MiniExcel.Async.cs | 12 ++++++++++- src/MiniExcel/MiniExcel.cs | 11 ++++++++++ src/MiniExcel/MiniExcelLibs.csproj | 2 +- .../SaveByTemplate/ExcelOpenXmlTemplate.cs | 21 ++++++++++++------- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/MiniExcel/IExcelTemplate.cs b/src/MiniExcel/IExcelTemplate.cs index d4a66c55..f817c12a 100644 --- a/src/MiniExcel/IExcelTemplate.cs +++ b/src/MiniExcel/IExcelTemplate.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System.IO; +using System.Threading; using System.Threading.Tasks; namespace MiniExcelLibs @@ -7,6 +8,7 @@ internal interface IExcelTemplate { void SaveAsByTemplate(string templatePath, object value); void SaveAsByTemplate(byte[] templateBtyes, object value); + void SaveAsByTemplate(Stream templateStream, object value); void MergeSameCells(string path); void MergeSameCells(byte[] fileInBytes); } @@ -15,6 +17,7 @@ internal interface IExcelTemplateAsync : IExcelTemplate { Task SaveAsByTemplateAsync(string templatePath, object value, CancellationToken cancellationToken = default(CancellationToken)); Task SaveAsByTemplateAsync(byte[] templateBtyes, object value, CancellationToken cancellationToken = default(CancellationToken)); + Task SaveAsByTemplateAsync(Stream templateStream, object value, CancellationToken cancellationToken = default(CancellationToken)); Task MergeSameCellsAsync(string path, CancellationToken cancellationToken = default(CancellationToken)); Task MergeSameCellsAsync(byte[] fileInBytes, CancellationToken cancellationToken = default(CancellationToken)); } diff --git a/src/MiniExcel/MiniExcel.Async.cs b/src/MiniExcel/MiniExcel.Async.cs index 51ede3f3..0fff8d9c 100644 --- a/src/MiniExcel/MiniExcel.Async.cs +++ b/src/MiniExcel/MiniExcel.Async.cs @@ -117,8 +117,8 @@ await Task.Run(() => }, cancellationToken); return await tcs.Task; - } + public static async Task SaveAsByTemplateAsync(this Stream stream, string templatePath, object value, IConfiguration configuration = null, CancellationToken cancellationToken = default) { await ExcelTemplateFactory.GetProvider(stream, configuration).SaveAsByTemplateAsync(templatePath, value, cancellationToken).ConfigureAwait(false); @@ -129,11 +129,21 @@ public static async Task SaveAsByTemplateAsync(this Stream stream, byte[] templa await ExcelTemplateFactory.GetProvider(stream, configuration).SaveAsByTemplateAsync(templateBytes, value, cancellationToken).ConfigureAwait(false); } + public static async Task SaveAsByTemplateAsync(this Stream stream, Stream templateStream, object value, IConfiguration configuration = null, CancellationToken cancellationToken = default) + { + await ExcelTemplateFactory.GetProvider(stream, configuration).SaveAsByTemplateAsync(templateStream, value, cancellationToken).ConfigureAwait(false); + } + public static async Task SaveAsByTemplateAsync(string path, string templatePath, object value, IConfiguration configuration = null, CancellationToken cancellationToken = default) { await Task.Run(() => SaveAsByTemplate(path, templatePath, value, configuration), cancellationToken).ConfigureAwait(false); } + public static async Task SaveAsByTemplateAsync(string path, Stream templateStream, object value, IConfiguration configuration = null, CancellationToken cancellationToken = default) + { + await Task.Run(() => SaveAsByTemplate(path, templateStream, value, configuration), cancellationToken).ConfigureAwait(false); + } + public static async Task SaveAsByTemplateAsync(string path, byte[] templateBytes, object value, IConfiguration configuration = null, CancellationToken cancellationToken = default) { await Task.Run(() => SaveAsByTemplate(path, templateBytes, value, configuration), cancellationToken).ConfigureAwait(false); diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel/MiniExcel.cs index d92e6fb2..22f500e8 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel/MiniExcel.cs @@ -173,6 +173,12 @@ public static void SaveAsByTemplate(string path, string templatePath, object val SaveAsByTemplate(stream, templatePath, value, configuration); } + public static void SaveAsByTemplate(string path, Stream templateStream, object value, IConfiguration configuration = null) + { + using (var stream = File.Create(path)) + SaveAsByTemplate(stream, templateStream, value, configuration); + } + public static void SaveAsByTemplate(string path, byte[] templateBytes, object value, IConfiguration configuration = null) { using (var stream = File.Create(path)) @@ -184,6 +190,11 @@ public static void SaveAsByTemplate(this Stream stream, string templatePath, obj ExcelTemplateFactory.GetProvider(stream, configuration).SaveAsByTemplate(templatePath, value); } + public static void SaveAsByTemplate(this Stream stream, Stream templateStream, object value, IConfiguration configuration = null) + { + ExcelTemplateFactory.GetProvider(stream, configuration).SaveAsByTemplate(templateStream, value); + } + public static void SaveAsByTemplate(this Stream stream, byte[] templateBytes, object value, IConfiguration configuration = null) { ExcelTemplateFactory.GetProvider(stream, configuration).SaveAsByTemplate(templateBytes, value); diff --git a/src/MiniExcel/MiniExcelLibs.csproj b/src/MiniExcel/MiniExcelLibs.csproj index 04ed3e02..24bfcf5e 100644 --- a/src/MiniExcel/MiniExcelLibs.csproj +++ b/src/MiniExcel/MiniExcelLibs.csproj @@ -1,7 +1,7 @@  net45;netstandard2.0;net8.0;net9.0 - 1.41.3 + 1.41.4 8 diff --git a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs b/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs index b66838dd..fe46c5c8 100644 --- a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs +++ b/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs @@ -46,22 +46,22 @@ public ExcelOpenXmlTemplate(Stream stream, IConfiguration configuration, InputVa public void SaveAsByTemplate(string templatePath, object value) { using (var stream = FileHelper.OpenSharedRead(templatePath)) - SaveAsByTemplateImpl(stream, value); + SaveAsByTemplate(stream, value); } public void SaveAsByTemplate(byte[] templateBtyes, object value) { using (Stream stream = new MemoryStream(templateBtyes)) - SaveAsByTemplateImpl(stream, value); + SaveAsByTemplate(stream, value); } - internal void SaveAsByTemplateImpl(Stream templateStream, object value) + public void SaveAsByTemplate(Stream templateStream, object value) { - //only support xlsx - //templateStream.CopyTo(_outputFileStream); - - // foreach all templateStream and create file for _outputFileStream and not create sheet file - templateStream.Position = 0; + if (!templateStream.CanSeek) + throw new InvalidDataException("The template stream must be seekable."); + + templateStream.Seek(0, SeekOrigin.Begin); + var templateReader = new ExcelOpenXmlSheetReader(templateStream, null); var outputFileArchive = new ExcelOpenXmlZip(_outputFileStream, mode: ZipArchiveMode.Create, true, Encoding.UTF8, isUpdateMode: false); try @@ -182,5 +182,10 @@ public Task SaveAsByTemplateAsync(byte[] templateBtyes, object value, Cancellati { return Task.Run(() => SaveAsByTemplate(templateBtyes, value), cancellationToken); } + + public Task SaveAsByTemplateAsync(Stream templateStream, object value, CancellationToken cancellationToken = default) + { + return Task.Run(() => SaveAsByTemplate(templateStream, value), cancellationToken); + } } } \ No newline at end of file From 954d5951f93363e48a8aaaf04d323b65bae08398 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sat, 19 Jul 2025 21:28:41 +0200 Subject: [PATCH 2/2] Changing InvalidDataException to ArgumentException --- src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs b/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs index fe46c5c8..ce66e989 100644 --- a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs +++ b/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs @@ -2,7 +2,6 @@ using MiniExcelLibs.Zip; using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; @@ -58,7 +57,7 @@ public void SaveAsByTemplate(byte[] templateBtyes, object value) public void SaveAsByTemplate(Stream templateStream, object value) { if (!templateStream.CanSeek) - throw new InvalidDataException("The template stream must be seekable."); + throw new ArgumentException("The template stream must be seekable."); templateStream.Seek(0, SeekOrigin.Begin);