From aba022c831012413d2d626c3fd2e8e03179b3a26 Mon Sep 17 00:00:00 2001 From: AshWang-whm <714898018@qq.com> Date: Wed, 7 Jan 2026 11:28:20 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=AF=BC=E5=87=BATest,=202.8+=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomTemplateExportTest.cs | 154 ++++++++++++++++++ .../ExportTemplates/CustomExportTemplate.xlsx | Bin 0 -> 10002 bytes 2 files changed, 154 insertions(+) create mode 100644 src/Magicodes.ExporterAndImporter.Tests/CustomTemplateExportTest.cs create mode 100644 src/Magicodes.ExporterAndImporter.Tests/TestFiles/ExportTemplates/CustomExportTemplate.xlsx diff --git a/src/Magicodes.ExporterAndImporter.Tests/CustomTemplateExportTest.cs b/src/Magicodes.ExporterAndImporter.Tests/CustomTemplateExportTest.cs new file mode 100644 index 00000000..f12f93cf --- /dev/null +++ b/src/Magicodes.ExporterAndImporter.Tests/CustomTemplateExportTest.cs @@ -0,0 +1,154 @@ +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; +using Magicodes.ExporterAndImporter.Tests; +using Shouldly; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Xunit; + +namespace Magicodes.IE.Tests +{ + public class CustomTemplateExportTest:TestBase + { + + [Fact(DisplayName = "自定义模板导出测试")] + public async Task TemplateExport() + { + var json = $"{{\r\n \"CustomerEmail\":[\r\n \"sales@testdata.com\"\r\n ],\r\n \"CustomerName\":\"\",\r\n \"CustomerEmailString\":\"sales@testdata.com\",\r\n \"CsEmail\":[\r\n \"my@testdata.com\"\r\n ],\r\n \"CsEmailString\":\"my@testdata.com\",\r\n \"CsDisplayEmailString\":\"my@testdata.com\",\r\n \"CcEmail\":[\r\n \r\n ],\r\n \"CcEmailString\":null,\r\n \"GroupOrgKey\":\"ORG11111112222222\",\r\n \"GroupKey\":\"1111111\\u00262222222\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"AmtSummary\":42475.811400,\r\n \"TaxSummary\":5521.89,\r\n \"AmtTaxSummary\":47997.701400,\r\n \"CartonSummary\":16,\r\n \"WeightSummary\":85.600,\r\n \"CbmSummary\":0.18747826,\r\n \"Data\":[\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"1\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168939/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":2638,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":1284.917040,\r\n \"TAX_AMOUNT\":167.04,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"1284.917040\",\r\n \"AMT_TAX\":1451.957040,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":2.550,\r\n \"CBM\":0.00449868,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref\",\r\n \"GOES_ORDER_AND_LINE\":\"order ref line\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"2\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168861/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":6697,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":3261.974760,\r\n \"TAX_AMOUNT\":424.06,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"3261.974760\",\r\n \"AMT_TAX\":3686.034760,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":6.420,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-2\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4M_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"3\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168860/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":5152,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2509.436160,\r\n \"TAX_AMOUNT\":326.23,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2509.436160\",\r\n \"AMT_TAX\":2835.666160,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":5.040,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-3\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4N_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"4\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168859/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":5153,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2509.923240,\r\n \"TAX_AMOUNT\":326.29,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2509.923240\",\r\n \"AMT_TAX\":2836.213240,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":5.040,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-4\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4P_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"5\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168858/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":6697,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":3261.974760,\r\n \"TAX_AMOUNT\":424.06,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"3261.974760\",\r\n \"AMT_TAX\":3686.034760,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":6.435,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-5\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4R_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"6\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168857/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":5152,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2509.436160,\r\n \"TAX_AMOUNT\":326.23,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2509.436160\",\r\n \"AMT_TAX\":2835.666160,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":5.020,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-6\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4T_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"7\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168855/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":5153,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2509.923240,\r\n \"TAX_AMOUNT\":326.29,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2509.923240\",\r\n \"AMT_TAX\":2836.213240,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":5.120,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-7\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4U_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"8\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168844/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":1582,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":770.560560,\r\n \"TAX_AMOUNT\":100.17,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"770.560560\",\r\n \"AMT_TAX\":870.730560,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":5.635,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-8\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4V_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"9\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168843/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":5201,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2533.303080,\r\n \"TAX_AMOUNT\":329.33,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2533.303080\",\r\n \"AMT_TAX\":2862.633080,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":5.125,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329726522-9\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4W_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"10\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168841/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":3152,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":1535.276160,\r\n \"TAX_AMOUNT\":199.59,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"1535.276160\",\r\n \"AMT_TAX\":1734.866160,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":8.580,\r\n \"CBM\":0.02361419,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref0\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F4X_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"11\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168840/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":4682,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2280.508560,\r\n \"TAX_AMOUNT\":296.47,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2280.508560\",\r\n \"AMT_TAX\":2576.978560,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":4.600,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref1\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F50_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"12\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168839/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":2626,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":1279.072080,\r\n \"TAX_AMOUNT\":166.28,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"1279.072080\",\r\n \"AMT_TAX\":1445.352080,\r\n \"CartonCount\":0,\r\n \"SOL_GW\":0,\r\n \"CBM\":0,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref2\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F51_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"13\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168838/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":2942,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":1432.989360,\r\n \"TAX_AMOUNT\":186.29,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"1432.989360\",\r\n \"AMT_TAX\":1619.279360,\r\n \"CartonCount\":0,\r\n \"SOL_GW\":0,\r\n \"CBM\":0,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref3\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F52_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"14\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168837/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":2731,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":1330.215480,\r\n \"TAX_AMOUNT\":172.93,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"1330.215480\",\r\n \"AMT_TAX\":1503.145480,\r\n \"CartonCount\":0,\r\n \"SOL_GW\":0,\r\n \"CBM\":0,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref4\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F53_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"15\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168836/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":5202,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2533.790160,\r\n \"TAX_AMOUNT\":329.39,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2533.790160\",\r\n \"AMT_TAX\":2863.180160,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":5.075,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref5\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F54_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"16\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168834/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":2942,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":1432.989360,\r\n \"TAX_AMOUNT\":186.29,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"1432.989360\",\r\n \"AMT_TAX\":1619.279360,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":7.205,\r\n \"CBM\":0.02361419,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref6\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F55_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"17\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168833/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":1472,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":716.981760,\r\n \"TAX_AMOUNT\":93.21,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"716.981760\",\r\n \"AMT_TAX\":810.191760,\r\n \"CartonCount\":0,\r\n \"SOL_GW\":0,\r\n \"CBM\":0,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref7\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F56_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"18\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168831/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":4681,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2280.021480,\r\n \"TAX_AMOUNT\":296.40,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2280.021480\",\r\n \"AMT_TAX\":2576.421480,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":4.680,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref8\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F57_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"19\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800168830/457\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":4727,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2302.427160,\r\n \"TAX_AMOUNT\":299.32,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2302.427160\",\r\n \"AMT_TAX\":2601.747160,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":4.710,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"order ref9\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F58_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"20\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800170912/18722\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":4417,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2151.432360,\r\n \"TAX_AMOUNT\":279.69,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2151.432360\",\r\n \"AMT_TAX\":2431.122360,\r\n \"CartonCount\":1,\r\n \"SOL_GW\":4.365,\r\n \"CBM\":0.01044240,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329727617-1\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F59_0001\"\r\n }},\r\n {{\r\n \"ORDER_NUMBER\":\"order number\",\r\n \"LINE_NUMBER\":\"21\",\r\n \"ORG_CODE\":\"ORG\",\r\n \"SOLD_TO_NUMBER\":\"1111111\",\r\n \"SOLD_TO_CUSTOMER\":\"customer name\",\r\n \"SET_NAME\":\"1\",\r\n \"ORDERED_DATE\":\"12/29/2025 12:00:00 AM\",\r\n \"ORDERED_DATE_Str\":\"2025-Dec-29\",\r\n \"CUST_PO_NUMBER\":\"6800170911/18722\",\r\n \"ITEM\":\"itemname2\",\r\n \"ORDERED_ITEM\":\"itemname\",\r\n \"QTY\":4206,\r\n \"PRICE\":\"0.487080\",\r\n \"AMT_Decimal\":2048.658480,\r\n \"TAX_AMOUNT\":266.33,\r\n \"CURRENCY_CODE\":\"CNY\",\r\n \"AMT\":\"2048.658480\",\r\n \"AMT_TAX\":2314.988480,\r\n \"CartonCount\":0,\r\n \"SOL_GW\":0,\r\n \"CBM\":0,\r\n \"BILL_TO_CUSTOMER\":\"customer\",\r\n \"BILL_TO_NUMBER\":\"2222222\",\r\n \"SHIP_TO_CUSTOMER\":\"ship to customer\",\r\n \"CS\":\"my@testdata.com\",\r\n \"WEB_ORDER_REF\":\"AD-329727617-2\",\r\n \"GOES_ORDER_AND_LINE\":\"NT8F5A_0001\"\r\n }}\r\n ]\r\n}}"; + + var obj = JsonSerializer.Deserialize(json); + + var exporter = new ExcelExporter(); + var temp = Path.Combine(".","TestFiles", "ExportTemplates", "CustomExportTemplate.xlsx"); + var file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), $"{Guid.NewGuid()}.xlsx"); + await exporter.ExportByTemplate(file, obj, temp); + // 2.8+版本生成的excel有大量重复的模板内容:{{Table>>}} ... , 文件超过30M,2.7+版本生成的文件只有不到10kb + var file_size = (new FileInfo(file)).Length; + + file_size.ShouldBeLessThan(10*1024); + } + } + + [Exporter(AutoFitAllColumn = true)] + public class CustomerGroupDataVO + { + + [ExporterHeader(IsIgnore = true)] + public List CustomerEmail { get; set; } = new List(); + + [ExporterHeader(IsIgnore = true)] + public string? CustomerName { get; set; } + + [ExporterHeader(IsIgnore = true)] + public string? CustomerEmailString => string.Join(",", CustomerEmail); + + [ExporterHeader(IsIgnore = true)] + public List CsEmail { get; set; } = new List(); + + [ExporterHeader(IsIgnore = true)] + public string? CsEmailString => string.Join(",", CsEmail); + + [ExporterHeader(IsIgnore = true)] + public string? CsDisplayEmailString { get; set; } + + [ExporterHeader(IsIgnore = true)] + public List CcEmail { get; set; } = new List(); + + [ExporterHeader(IsIgnore = true)] + public string? CcEmailString => string.Join(",", CcEmail); + + [ExporterHeader(IsIgnore = true)] + public string? GroupOrgKey => ORG_CODE + SOLD_TO_NUMBER + BILL_TO_NUMBER; + + [ExporterHeader(IsIgnore = true)] + public string? GroupKey => SOLD_TO_NUMBER + "&" + BILL_TO_NUMBER; + + public string? ORG_CODE { get; set; } + public string? SOLD_TO_NUMBER { get; set; } + public string? SOLD_TO_CUSTOMER { get; set; } + public string? BILL_TO_NUMBER { get; set; } + public string? BILL_TO_CUSTOMER { get; set; } + + public decimal? AmtSummary => Data.Sum(a => a.AMT_Decimal); + + public decimal? TaxSummary => Data.Sum(a => a.TAX_AMOUNT); + + public decimal? AmtTaxSummary => Data.Sum(a => a.AMT_TAX); + + public int? CartonSummary => Data.Sum(a => a.CartonCount); + + public decimal? WeightSummary => Data.Sum(a => a.SOL_GW); + + public decimal? CbmSummary => Data.Sum(a => a.CBM); + + public List Data { get; set; } = new List(); + + } + + [Exporter(AutoFitAllColumn = true)] + public class InventoryCustomerDataVO + { + public string? ORDER_NUMBER { get; set; } + + public string? LINE_NUMBER { get; set; } + public string? ORG_CODE { get; set; } + public string? SOLD_TO_NUMBER { get; set; } + public string? SOLD_TO_CUSTOMER { get; set; } + + public string? SET_NAME { get; set; } + + [ExporterHeader(IsIgnore = true)] + public string? ORDERED_DATE { get; set; } + + public string? ORDERED_DATE_Str => DateTime.TryParse(ORDERED_DATE, out var val) ? val.ToString("yyyy-MMM-dd") : null; + + public string? CUST_PO_NUMBER { get; set; } + + public string? ITEM { get; set; } + + public string? ORDERED_ITEM { get; set; } + + + public decimal? QTY { get; set; } + + public string? PRICE { get; set; } + + [ExporterHeader(IsIgnore = true)] + public decimal? AMT_Decimal => decimal.TryParse(AMT, out var amt) ? amt : 0; + + public decimal? TAX_AMOUNT { get; set; } + + + public string? CURRENCY_CODE { get; set; } + + public string? AMT { get; set; } + + + public decimal? AMT_TAX => AMT_Decimal + TAX_AMOUNT; + + [ExporterHeader(DisplayName = "No.of Cartons")] + public int CartonCount { get; set; } + + [ExporterHeader(DisplayName = "Weight(kg)")] + public decimal? SOL_GW { get; set; } + + public decimal? CBM { get; set; } + + public string? BILL_TO_CUSTOMER { get; set; } + + public string? BILL_TO_NUMBER { get; set; } + + public string? SHIP_TO_CUSTOMER { get; set; } + + public string? CS { get; set; } + + public string? WEB_ORDER_REF { get; set; } + + public string? GOES_ORDER_AND_LINE { get; set; } + } +} diff --git a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/ExportTemplates/CustomExportTemplate.xlsx b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/ExportTemplates/CustomExportTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6aecff35fbb38ddd98c18cc5225310ae18a34383 GIT binary patch literal 10002 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

5o=^+Me|ppb(sCS9p#% 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 S0027d#|Ts7sbAFr!2bc!UjcCd literal 0 HcmV?d00001