From 5eac026992ab1ebb3ce7510bec16d00d9c4b8127 Mon Sep 17 00:00:00 2001 From: 0MG-DEN Date: Wed, 17 May 2023 23:36:42 +0100 Subject: [PATCH 1/3] Add option to skip null values when writing to Excel --- src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs | 16 ++++++++++------ src/MiniExcel/OpenXml/OpenXmlConfiguration.cs | 1 + 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs index f7c6a665..78599ef3 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs +++ b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs @@ -395,14 +395,19 @@ private void GenerateSheetByColumnInfo(MiniExcelStreamWriter writer, IEnumera private void WriteCell(MiniExcelStreamWriter writer, int rowIndex, int cellIndex, object value, ExcelColumnInfo p) { - var v = string.Empty; - var t = "str"; + var columname = ExcelOpenXmlUtils.ConvertXyToCell(cellIndex, rowIndex); var s = "2"; - if (value == null) + + if (!_configuration.WriteNullCells && (value is null || value is DBNull)) { - v = ""; + writer.Write($""); + return; } - else if (value is string str) + + var v = string.Empty; + var t = "str"; + + if (value is string str) { v = ExcelOpenXmlUtils.EncodeXML(str); } @@ -531,7 +536,6 @@ private void WriteCell(MiniExcelStreamWriter writer, int rowIndex, int cellIndex } } - var columname = ExcelOpenXmlUtils.ConvertXyToCell(cellIndex, rowIndex); if (v != null && (v.StartsWith(" ", StringComparison.Ordinal) || v.EndsWith(" ", StringComparison.Ordinal))) /*Prefix and suffix blank space will lost after SaveAs #294*/ writer.Write($"{v}"); else diff --git a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs index df874b87..c5777d5e 100644 --- a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs @@ -16,6 +16,7 @@ public class OpenXmlConfiguration : Configuration public bool AutoFilter { get; set; } = true; public bool EnableConvertByteArray { get; set; } = true; public bool IgnoreTemplateParameterMissing { get; set; } = true; + public bool WriteNullCells { get; set; } = true; public bool EnableSharedStringCache { get; set; } = true; public long SharedStringCacheSize { get; set; } = 5 * 1024 * 1024; } From ad2d4e5d017a37824a45215fea630f396fbbebb8 Mon Sep 17 00:00:00 2001 From: 0MG-DEN Date: Sat, 27 May 2023 19:41:13 +0100 Subject: [PATCH 2/3] Rename option to skip null values --- src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs | 2 +- src/MiniExcel/OpenXml/OpenXmlConfiguration.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs index 78599ef3..0ed7bf96 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs +++ b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs @@ -398,7 +398,7 @@ private void WriteCell(MiniExcelStreamWriter writer, int rowIndex, int cellIndex var columname = ExcelOpenXmlUtils.ConvertXyToCell(cellIndex, rowIndex); var s = "2"; - if (!_configuration.WriteNullCells && (value is null || value is DBNull)) + if (!_configuration.WriteNullValues && (value is null || value is DBNull)) { writer.Write($""); return; diff --git a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs index c5777d5e..26f29645 100644 --- a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs @@ -16,7 +16,7 @@ public class OpenXmlConfiguration : Configuration public bool AutoFilter { get; set; } = true; public bool EnableConvertByteArray { get; set; } = true; public bool IgnoreTemplateParameterMissing { get; set; } = true; - public bool WriteNullCells { get; set; } = true; + public bool WriteNullValues { get; set; } = true; public bool EnableSharedStringCache { get; set; } = true; public long SharedStringCacheSize { get; set; } = 5 * 1024 * 1024; } From d68870a2c23f2033f466dbfc43dd346fd1382af8 Mon Sep 17 00:00:00 2001 From: 0MG-DEN Date: Sat, 27 May 2023 20:39:01 +0100 Subject: [PATCH 3/3] Update README --- README.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ docs/README.md | 3 +++ 2 files changed, 66 insertions(+) diff --git a/README.md b/README.md index a0e2f0f2..988a288d 100644 --- a/README.md +++ b/README.md @@ -551,6 +551,69 @@ File content before and after merge: ![before_merge_cells](https://user-images.githubusercontent.com/38832863/219970175-913b3d04-d714-4279-a7a4-6cefb7aa6ce8.PNG) ![after_merge_cells](https://user-images.githubusercontent.com/38832863/219970176-e78c491a-2f90-45a7-a4a2-425c5708d38c.PNG) +#### 13. Skip null values + +Default behaviour: + +```csharp +DataTable dt = new DataTable(); + +/* ... */ + +DataRow dr = dt.NewRow(); + +dr["Name1"] = "Somebody once"; +dr["Name2"] = null; +dr["Name3"] = "told me."; + +dt.Rows.Add(dr); + +MiniExcel.SaveAs(@"C:\temp\Book1.xlsx", dt); +``` + +![image](https://user-images.githubusercontent.com/31481586/241419441-c4f27e8f-3f87-46db-a10f-08665864c874.png) + +```xml + + + Somebody once + + + + + + told me. + + +``` + +Result using new option: + +```csharp +OpenXmlConfiguration configuration = new OpenXmlConfiguration() +{ + WriteNullValues = false // Default value is true. +}; + +MiniExcel.SaveAs(@"C:\temp\Book1.xlsx", dt, configuration: configuration); +``` + +![image](https://user-images.githubusercontent.com/31481586/241419455-3c0aec8a-4e5f-4d83-b7ec-6572124c165d.png) + + +```xml + + + Somebody once + + + + told me. + + +``` + +Works for null and DBNull values. ### Fill Data To Excel Template diff --git a/docs/README.md b/docs/README.md index b1c6110e..58205e37 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,6 +22,9 @@ --- +### 1.30.4 +- [New] Support skipping null values when writing to Excel (via @0MG-DEN) + ### 1.30.3 - [New] support if/else statements inside cell (via @eynarhaji)