Skip to content

Commit

Permalink
Add option to skip null values when writing to Excel (mini-software#497)
Browse files Browse the repository at this point in the history
* Add option to skip null values when writing to Excel

* Rename option to skip null values

* Update README
  • Loading branch information
0MG-DEN authored May 28, 2023
1 parent b8c3e3d commit 42eab33
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 6 deletions.
63 changes: 63 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
<x:row r="2">
<x:c r="A2" t ="str" s="2">
<x:v>Somebody once</x:v>
</x:c>
<x:c r="B2" t ="str" s="2">
<x:v></x:v>
</x:c>
<x:c r="C2" t ="str" s="2">
<x:v>told me.</x:v>
</x:c>
</x:row>
```

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
<x:row r="2">
<x:c r="A2" t ="str" s="2">
<x:v>Somebody once</x:v>
</x:c>
<x:c r="B2" s="2"></x:c>
<x:c r="C2" t ="str" s="2">
<x:v>told me.</x:v>
</x:c>
</x:row>
```

Works for null and DBNull values.

### Fill Data To Excel Template <a name="getstart3"></a>

Expand Down
3 changes: 3 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
16 changes: 10 additions & 6 deletions src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -395,14 +395,19 @@ private void GenerateSheetByColumnInfo<T>(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.WriteNullValues && (value is null || value is DBNull))
{
v = "";
writer.Write($"<x:c r=\"{columname}\" s=\"{s}\"></x:c>");
return;
}
else if (value is string str)

var v = string.Empty;
var t = "str";

if (value is string str)
{
v = ExcelOpenXmlUtils.EncodeXML(str);
}
Expand Down Expand Up @@ -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($"<x:c r=\"{columname}\" {(t == null ? "" : $"t =\"{t}\"")} s=\"{s}\" xml:space=\"preserve\"><x:v>{v}</x:v></x:c>");
else
Expand Down
1 change: 1 addition & 0 deletions src/MiniExcel/OpenXml/OpenXmlConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 WriteNullValues { get; set; } = true;
public bool EnableSharedStringCache { get; set; } = true;
public long SharedStringCacheSize { get; set; } = 5 * 1024 * 1024;
}
Expand Down

0 comments on commit 42eab33

Please sign in to comment.