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..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; @@ -46,22 +45,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 ArgumentException("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 +181,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