From c0799b933df7cb3b229d27422e720fdbf256b7c4 Mon Sep 17 00:00:00 2001 From: wei Date: Mon, 10 May 2021 15:14:58 +0800 Subject: [PATCH] Support Xlsm AutoCheck #227 --- README.md | 1 + README.zh-CN.md | 3 +- README.zh-Hant.md | 3 +- docs/README.md | 4 ++ docs/README.zh-CN.md | 5 ++ docs/README.zh-Hant.md | 4 ++ samples/xlsx/TestIssue227.xlsm | Bin 0 -> 19411 bytes src/MiniExcel/MiniExcel.TypeCheker.cs | 1 + src/MiniExcel/MiniExcel.cs | 3 + src/MiniExcel/MiniExcelLibs.csproj | 2 +- tests/MiniExcelTests/MiniExcelIssueTests.cs | 73 ++++++++++++++++---- 11 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 samples/xlsx/TestIssue227.xlsm diff --git a/README.md b/README.md index 7c4cd1c5..45a75326 100644 --- a/README.md +++ b/README.md @@ -886,6 +886,7 @@ No, the image test has 1 million rows*10 columns of data, the maximum memory usa ### Limitations and caveats - Not support xls and encrypted file now +- xlsm only support Query ### Reference diff --git a/README.zh-CN.md b/README.zh-CN.md index 14b7224d..51b65925 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -881,7 +881,8 @@ A. 名称一样,系统会自动映射(注意:大小写不敏感) ### 局限与警告 -- 目前不支援 xls (97-2003) 或是加密文件。 +- 目前不支援 xls (97-2003) 或是加密文件 +- xlsm 只支持查询 diff --git a/README.zh-Hant.md b/README.zh-Hant.md index 1e40099d..3a4f4852 100644 --- a/README.zh-Hant.md +++ b/README.zh-Hant.md @@ -874,7 +874,8 @@ A. 名稱一樣,系統會自動映射(注意:大小寫不敏感) ### 侷限與警告 -- 目前不支援 xls (97-2003) 或是加密檔案。 +- 目前不支援 xls (97-2003) 或是加密檔案 +- xlsm 只支持查詢 diff --git a/docs/README.md b/docs/README.md index e2fb5f68..125fc61b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,6 +6,10 @@ --- +### 0.14.3 +- [Opt] Support Xlsm AutoCheck #227 +- [Bug] Fix SaveAsByTemplate single column demension index error #226 + ### 0.14.2 - [Bug] Fix asp.net webform gridview datasource can't use QueryAsDataTable #223 diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md index 1bbd4aaf..f80bc8e0 100644 --- a/docs/README.zh-CN.md +++ b/docs/README.zh-CN.md @@ -7,6 +7,11 @@ --- + +### 0.14.3 +- [Opt] 支持 Xlsm 自动判断 #227 +- [Bug] 修正 SaveAsByTemplate 单列 demension 索引错误 #226 + ### 0.14.2 - [Bug] 修正 asp.net webform gridview datasource 不能使用 QueryAsDataTable #223 diff --git a/docs/README.zh-Hant.md b/docs/README.zh-Hant.md index ebe2b61d..09d4916c 100644 --- a/docs/README.zh-Hant.md +++ b/docs/README.zh-Hant.md @@ -7,6 +7,10 @@ --- +### 0.14.3 +- [Opt] 支持 Xlsm 自動判斷 #227 +- [Bug] 修正 SaveAsByTemplate 單列 demension 索引錯誤 #226 + ### 0.14.2 - [Bug] 修正 asp.net webform gridview datasource 不能使用 QueryAsDataTable #223 diff --git a/samples/xlsx/TestIssue227.xlsm b/samples/xlsx/TestIssue227.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..37948167ea55d75846e0086a0ec436ca84cf600f GIT binary patch literal 19411 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 literal 0 HcmV?d00001 diff --git a/src/MiniExcel/MiniExcel.TypeCheker.cs b/src/MiniExcel/MiniExcel.TypeCheker.cs index 542824b5..aa5040d8 100644 --- a/src/MiniExcel/MiniExcel.TypeCheker.cs +++ b/src/MiniExcel/MiniExcel.TypeCheker.cs @@ -14,6 +14,7 @@ internal static ExcelType GetExcelType(string filePath, ExcelType excelType) case ".csv": return ExcelType.CSV; case ".xlsx": + case ".xlsm": return ExcelType.XLSX; //case ".xls": // return ExcelType.XLS; diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel/MiniExcel.cs index ba362b62..00f4b1c4 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel/MiniExcel.cs @@ -3,6 +3,7 @@ using MiniExcelLibs.OpenXml; using MiniExcelLibs.Utils; using MiniExcelLibs.Zip; + using System; using System.Collections.Generic; using System.Data; using System.IO; @@ -12,6 +13,8 @@ public static partial class MiniExcel { public static void SaveAs(string path, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration configuration = null) { + if (Path.GetExtension(path).ToLowerInvariant() == ".xlsm") + throw new NotSupportedException("MiniExcel SaveAs not support xlsm"); using (FileStream stream = new FileStream(path, FileMode.CreateNew)) SaveAs(stream, value, printHeader, sheetName, GetExcelType(path, excelType), configuration); } diff --git a/src/MiniExcel/MiniExcelLibs.csproj b/src/MiniExcel/MiniExcelLibs.csproj index 8811f128..3ff02dba 100644 --- a/src/MiniExcel/MiniExcelLibs.csproj +++ b/src/MiniExcel/MiniExcelLibs.csproj @@ -1,7 +1,7 @@ net45;netstandard2.0;net5.0 - 0.14.1 + 0.14.3 MiniExcel diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index 1ca9dbae..19b45991 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -25,6 +25,53 @@ public MiniExcelIssueTests(ITestOutputHelper output) this.output = output; } + /// + /// [Support Xlsm AutoCheck · Issue #227 · shps951023/MiniExcel] + /// (https://github.com/shps951023/MiniExcel/issues/227) + /// + [Fact] + public void Issue227() + { + { + var path = PathHelper.GetNewTemplateFilePath("xlsm"); + Assert.Throws(() => MiniExcel.SaveAs(path, new[] { new { V = "A1" }, new { V = "A2" } })); + } + + { + var path = PathHelper.GetSamplePath("xlsx/TestIssue227.xlsm"); + { + var rows = MiniExcel.Query(path).ToList(); + + Assert.Equal(100, rows.Count()); + + Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); + Assert.Equal("Wade", rows[0].Name); + Assert.Equal(DateTime.ParseExact("27/09/2020", "dd/MM/yyyy", CultureInfo.InvariantCulture), rows[0].BoD); + Assert.Equal(36, rows[0].Age); + Assert.False(rows[0].VIP); + Assert.Equal(decimal.Parse("5019.12"), rows[0].Points); + Assert.Equal(1, rows[0].IgnoredProperty); + } + { + using (var stream = File.OpenRead(path)) + { + var rows = stream.Query().ToList(); + + Assert.Equal(100, rows.Count()); + + Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); + Assert.Equal("Wade", rows[0].Name); + Assert.Equal(DateTime.ParseExact("27/09/2020", "dd/MM/yyyy", CultureInfo.InvariantCulture), rows[0].BoD); + Assert.Equal(36, rows[0].Age); + Assert.False(rows[0].VIP); + Assert.Equal(decimal.Parse("5019.12"), rows[0].Points); + Assert.Equal(1, rows[0].IgnoredProperty); + } + } + } + + + } /// /// https://github.com/shps951023/MiniExcel/issues/226 @@ -53,7 +100,7 @@ public void Issue223() new Dictionary(){{"A",Guid.NewGuid()},{"B","HelloWorld"}}, }; var path = PathHelper.GetNewTemplateFilePath(); - MiniExcel.SaveAs(path,value); + MiniExcel.SaveAs(path, value); var dt = MiniExcel.QueryAsDataTable(path); var columns = dt.Columns; @@ -74,7 +121,7 @@ public void Issue222() var path = PathHelper.GetSamplePath("xlsx/TestIssue222.xlsx"); var rows = MiniExcel.Query(path).ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); - Assert.Equal(new DateTime(2021,4,29), rows[1].A); + Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); } /// @@ -142,7 +189,7 @@ public void Issue211() MiniExcel.SaveAs(path, reader); - var rows = MiniExcel.Query(path,true).ToList(); + var rows = MiniExcel.Query(path, true).ToList(); Assert.Equal((double)1, rows[0].Test1); Assert.Equal((double)2, rows[0].Test2); Assert.Equal((double)3, rows[1].Test1); @@ -157,7 +204,7 @@ public void Issue211() public void Issue216() { var path = PathHelper.GetNewTemplateFilePath(); - var value = new[] { new { Test1="1",Test2=2 }, new { Test1 = "3", Test2 = 4 } }; + var value = new[] { new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; MiniExcel.SaveAs(path, value); { @@ -205,7 +252,7 @@ public void IssueI3OSKV() var value = new[] { new { Test = 123456.789 } }; MiniExcel.SaveAs(path, value); - var A2 = MiniExcel.Query(path,true).First().Test ; + var A2 = MiniExcel.Query(path, true).First().Test; Assert.Equal(123456.789, A2); File.Delete(path); @@ -223,14 +270,14 @@ public void Issue220() var path = PathHelper.GetSamplePath("xlsx/TestIssue220.xlsx"); var rows = MiniExcel.Query(path, useHeaderRow: true); var result = (from s in rows - group s by s.PRT_ID into g - select new - { - PRT_ID = g.Key, - Apr = g.Sum(_ => (double?)_.Apr), - May = g.Sum(_ => (double?)_.May), - Jun = g.Sum(_ => (double?)_.Jun), - } + group s by s.PRT_ID into g + select new + { + PRT_ID = g.Key, + Apr = g.Sum(_ => (double?)_.Apr), + May = g.Sum(_ => (double?)_.May), + Jun = g.Sum(_ => (double?)_.Jun), + } ).ToList(); Assert.Equal(91843.25, result[0].Jun); Assert.Equal(50000.99, result[1].Jun);