From cd1166cc105b63eca358fb43c632d139afa3df7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Szybiak?= Date: Sat, 20 Jan 2024 10:33:00 +0100 Subject: [PATCH] Using DynamicConfiguration when writing data using DataTable (#561) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Paweł Szybiak --- .../OpenXml/ExcelOpenXmlSheetWriter.cs | 23 ++++++-- tests/MiniExcelTests/MiniExcelOpenXmlTests.cs | 55 ++++++++++++++++++- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs index dec50820..2bf23f17 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs +++ b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs @@ -8,7 +8,6 @@ using System.IO; using System.IO.Compression; using System.Linq; -using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -560,18 +559,30 @@ private void GenerateSheetByDataTable(MiniExcelStreamWriter writer, DataTable va // dimension var maxRowIndex = value.Rows.Count + (_printHeader && value.Rows.Count > 0 ? 1 : 0); var maxColumnIndex = value.Columns.Count; - writer.Write($@""); + writer.Write($@""); + var props = new List(); + for (var i = 0; i < value.Columns.Count; i++) + { + var columnName = value.Columns[i].Caption ?? value.Columns[i].ColumnName; + var prop = GetColumnInfosFromDynamicConfiguration(columnName); + props.Add(prop); + } + + WriteColumnsWidths(writer, props); + + writer.Write(""); if (_printHeader) { writer.Write($""); var xIndex = xy.Item1; - foreach (DataColumn c in value.Columns) + foreach (var p in props) { var r = ExcelOpenXmlUtils.ConvertXyToCell(xIndex, yIndex); - WriteC(writer, r, columnName: c.Caption ?? c.ColumnName); + WriteC(writer, r, columnName: p.ExcelColumnName); xIndex++; } + writer.Write($""); yIndex++; } @@ -613,7 +624,7 @@ private void GenerateSheetByIDataReader(MiniExcelStreamWriter writer, IDataReade for (var i = 0; i < reader.FieldCount; i++) { var columnName = reader.GetName(i); - var prop = GetColumnInfosForIDataReader(columnName); + var prop = GetColumnInfosFromDynamicConfiguration(columnName); props.Add(prop); } @@ -662,7 +673,7 @@ private void GenerateSheetByIDataReader(MiniExcelStreamWriter writer, IDataReade } } - private ExcelColumnInfo GetColumnInfosForIDataReader(string columnName) + private ExcelColumnInfo GetColumnInfosFromDynamicConfiguration(string columnName) { var prop = new ExcelColumnInfo { diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs index a2822a35..25e82983 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs @@ -1242,7 +1242,60 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataReader() Assert.Contains("Its value", rows[0]); Assert.Contains("Name of something", rows[1]); Assert.Contains("Its value", rows[1]); - + + Assert.Equal("MiniExcel", rows[0]["Name of something"]); + Assert.Equal(1D, rows[0]["Its value"]); + Assert.Equal("Github", rows[1]["Name of something"]); + Assert.Equal(2D, rows[1]["Its value"]); + } + } + + [Fact] + public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTable() + { + var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); + var table = new DataTable(); + { + table.Columns.Add("Column1", typeof(string)); + table.Columns.Add("Column2", typeof(int)); + table.Rows.Add("MiniExcel", 1); + table.Rows.Add("Github", 2); + } + + var configuration = new OpenXmlConfiguration + { + DynamicColumns = new[] + { + new DynamicExcelColumn("Column1") + { + Name = "Name of something", + Index = 0, + Width = 150 + }, + new DynamicExcelColumn("Column2") + { + Name = "Its value", + Index = 1, + Width = 150 + } + } + }; + + MiniExcel.SaveAs(path, table, configuration: configuration); + + using (var stream = File.OpenRead(path)) + { + var rows = stream.Query(useHeaderRow: true) + .Select(x => (IDictionary)x) + .Select(x => (IDictionary)x) + .ToList(); + + Assert.Contains("Name of something", rows[0]); + Assert.Contains("Its value", rows[0]); + Assert.Contains("Name of something", rows[1]); + Assert.Contains("Its value", rows[1]); + + Assert.Equal("MiniExcel", rows[0]["Name of something"]); Assert.Equal(1D, rows[0]["Its value"]); Assert.Equal("Github", rows[1]["Name of something"]);