diff --git a/src/MiniExcel/MiniExcel.Async.cs b/src/MiniExcel/MiniExcel.Async.cs index 96eb40c5..ad2c58f0 100644 --- a/src/MiniExcel/MiniExcel.Async.cs +++ b/src/MiniExcel/MiniExcel.Async.cs @@ -60,7 +60,7 @@ public static async Task SaveAsAsync(this Stream stream, object value, bo return await ExcelWriterFactory.GetProvider(stream, value, sheetName, excelType, configuration, printHeader).SaveAsAsync(cancellationToken); } - public static async Task MergeSameCellsAsync(string mergedFilePath, string path, ExcelType excelType = ExcelType.UNKNOWN, IConfiguration configuration = null, CancellationToken cancellationToken = default) + public static async Task MergeSameCellsAsync(string mergedFilePath, string path, ExcelType excelType = ExcelType.XLSX, IConfiguration configuration = null, CancellationToken cancellationToken = default) { await Task.Run(() => MergeSameCells(mergedFilePath, path, excelType, configuration), cancellationToken).ConfigureAwait(false); } diff --git a/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs b/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs index 3003e5ab..1db957ff 100644 --- a/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs +++ b/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs @@ -26,6 +26,7 @@ private static IDictionary GetValuesFromObject(object valueObjec var propertyValues = type .GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(property => property.CanRead && property.GetIndexParameters().Length == 0) .Select(property => new { property.Name, Value = property.GetValue(valueObject) }); var fieldValues = type diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs index 5a74595e..be0fd956 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs @@ -1607,21 +1607,50 @@ public async Task SaveAsByAsyncEnumerable() { using var path = AutoDeletingPath.Create(); -#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + await MiniExcel.SaveAsAsync(path.ToString(), GetValues()); + var results = MiniExcel.Query(path.ToString()).ToList(); + + Assert.Equal(2, results.Count); + Assert.Equal("MiniExcel", results.First().Column1); + Assert.Equal(1, results.First().Column2); + Assert.Equal("Github", results.Last().Column1); + Assert.Equal(2, results.Last().Column2); + return; + static async IAsyncEnumerable GetValues() { yield return new Demo { Column1 = "MiniExcel", Column2 = 1 }; + await Task.CompletedTask; yield return new Demo { Column1 = "Github", Column2 = 2 }; + await Task.CompletedTask; } -#pragma warning restore CS1998 + } - await MiniExcel.SaveAsAsync(path.ToString(), GetValues()); - var results = MiniExcel.Query(path.ToString()).ToList(); + [Fact] + public async Task TestIssue951() + { + var templatePath = PathHelper.GetFile("xlsx/TestTemplateEasyFill.xlsx"); + using var path = AutoDeletingPath.Create(); + + var value = new Issue951 + { + Name = "Jack", + CreateDate = new DateTime(2021, 01, 01), + VIP = true, + Points = 123 + }; - Assert.True(results.Count == 2); - Assert.True(results.First().Column1 == "MiniExcel"); - Assert.True(results.First().Column2 == 1); - Assert.True(results.Last().Column1 == "Github"); - Assert.True(results.Last().Column2 == 2); + // must not throw + await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + } + + class Issue951 + { + public string? Name { get; set; } + public DateTime CreateDate { get; set; } + public bool VIP { get; set; } + public double Points { get; set; } + + public object this[string test] => new(); } } \ No newline at end of file