Skip to content

Commit d56526d

Browse files
Fixing issue 584
1 parent 9d59b57 commit d56526d

File tree

4 files changed

+68
-25
lines changed

4 files changed

+68
-25
lines changed

src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -195,20 +195,21 @@ private int WriteValues(MiniExcelStreamWriter writer, object values)
195195
}
196196
var maxColumnIndex = props.Count;
197197
int maxRowIndex;
198+
var maxColumnIndex = props.Count(x => x != null && !x.ExcelIgnore);
198199

199200
writer.Write(WorksheetXml.StartWorksheetWithRelationship);
200201

201202
long dimensionPlaceholderPostition = 0;
202203

203204
// We can write the dimensions directly if the row count is known
204-
if (_configuration.FastMode && !isKnownCount)
205+
if (isKnownCount)
205206
{
206-
dimensionPlaceholderPostition = WriteDimensionPlaceholder(writer);
207+
maxRowIndex = _printHeader ? count + 1 : count;
208+
writer.Write(WorksheetXml.Dimension(GetDimensionRef(maxRowIndex, maxColumnIndex)));
207209
}
208-
else if (isKnownCount)
210+
else if (_configuration.FastMode)
209211
{
210-
maxRowIndex = count + (_printHeader ? 1 : 0);
211-
writer.Write(WorksheetXml.Dimension(GetDimensionRef(maxRowIndex, props.Count)));
212+
dimensionPlaceholderPostition = WriteDimensionPlaceholder(writer);
212213
}
213214

214215
//sheet view
@@ -219,7 +220,7 @@ private int WriteValues(MiniExcelStreamWriter writer, object values)
219220
long columnWidthsPlaceholderPosition = 0;
220221
if (_configuration.EnableAutoWidth)
221222
{
222-
columnWidthsPlaceholderPosition = WriteColumnWidthPlaceholders(writer, props);
223+
columnWidthsPlaceholderPosition = WriteColumnWidthPlaceholders(writer, maxColumnIndex);
223224
widths = new ExcelWidthCollection(_configuration.MinWidth, _configuration.MaxWidth, props);
224225
}
225226
else
@@ -270,10 +271,10 @@ private int WriteValues(MiniExcelStreamWriter writer, object values)
270271
return maxRowIndex - toSubtract;
271272
}
272273

273-
private static long WriteColumnWidthPlaceholders(MiniExcelStreamWriter writer, ICollection<ExcelColumnInfo> props)
274+
private static long WriteColumnWidthPlaceholders(MiniExcelStreamWriter writer, int count)
274275
{
275276
var placeholderPosition = writer.Flush();
276-
writer.WriteWhitespace(WorksheetXml.GetColumnPlaceholderLength(props.Count));
277+
writer.WriteWhitespace(WorksheetXml.GetColumnPlaceholderLength(count));
277278
return placeholderPosition;
278279
}
279280

@@ -315,14 +316,15 @@ private void PrintHeader(MiniExcelStreamWriter writer, List<ExcelColumnInfo> pro
315316

316317
foreach (var p in props)
317318
{
318-
if (p == null)
319+
//reason : https://github.com/mini-software/MiniExcel/issues/142
320+
if (p != null)
319321
{
320-
xIndex++; //reason : https://github.com/mini-software/MiniExcel/issues/142
321-
continue;
322+
if (p.ExcelIgnore)
323+
continue;
324+
325+
var r = ExcelOpenXmlUtils.ConvertXyToCell(xIndex, yIndex);
326+
WriteCell(writer, r, columnName: p.ExcelColumnName);
322327
}
323-
324-
var r = ExcelOpenXmlUtils.ConvertXyToCell(xIndex, yIndex);
325-
WriteCell(writer, r, columnName: p.ExcelColumnName);
326328
xIndex++;
327329
}
328330

src/MiniExcel/Utils/CustomPropertyHelper.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,16 +346,20 @@ internal static ExcelColumnInfo GetColumnInfosFromDynamicConfiguration(string co
346346
var dynamicColumn = configuration.DynamicColumns
347347
.SingleOrDefault(col => string.Equals(col.Key, columnName, StringComparison.OrdinalIgnoreCase));
348348

349-
if (dynamicColumn == null || dynamicColumn.Ignore)
349+
if (dynamicColumn == null)
350350
return prop;
351351

352352
prop.Nullable = true;
353353
prop.ExcelIgnore = dynamicColumn.Ignore;
354354
prop.ExcelColumnType = dynamicColumn.Type;
355-
prop.ExcelColumnIndex = dynamicColumn.Index;
356355
prop.ExcelColumnWidth = dynamicColumn.Width;
357356
prop.CustomFormatter = dynamicColumn.CustomFormatter;
358357

358+
if (dynamicColumn.Index > -1)
359+
{
360+
prop.ExcelColumnIndex = dynamicColumn.Index;
361+
}
362+
359363
if (dynamicColumn.Format != null)
360364
{
361365
prop.ExcelFormat = dynamicColumn.Format;

src/MiniExcel/WriteAdapter/DataReaderWriteAdapter.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,17 @@ public IEnumerable<IEnumerable<CellWriteInfo>> GetRows(List<ExcelColumnInfo> pro
6464

6565
private IEnumerable<CellWriteInfo> GetRowValues(List<ExcelColumnInfo> props)
6666
{
67-
for (int i = 0, column = 1; i < _reader.FieldCount; i++, column++)
67+
var column = 1;
68+
for (int i = 0; i < _reader.FieldCount; i++)
6869
{
69-
if (_configuration.DynamicColumnFirst)
70+
var prop = props[i];
71+
if (prop != null && !prop.ExcelIgnore)
7072
{
71-
var columnIndex = _reader.GetOrdinal(props[i].Key.ToString());
72-
yield return new CellWriteInfo(_reader.GetValue(columnIndex), column, props[i]);
73-
}
74-
else
75-
{
76-
yield return new CellWriteInfo(_reader.GetValue(i), column, props[i]);
73+
var columnIndex = _configuration.DynamicColumnFirst
74+
? _reader.GetOrdinal(prop.Key.ToString()) : i;
75+
76+
yield return new CellWriteInfo(_reader.GetValue(columnIndex), column, prop);
77+
column++;
7778
}
7879
}
7980
}

tests/MiniExcelTests/MiniExcelIssueTests.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3659,7 +3659,43 @@ public void Issue527()
36593659
Assert.Equal("General User", rows[1].B);
36603660
Assert.Equal("General Administrator", rows[2].B);
36613661
}
3662-
3662+
3663+
[Fact]
3664+
public void TestIssue584()
3665+
{
3666+
var excelconfig = new OpenXmlConfiguration
3667+
{
3668+
FastMode = true,
3669+
DynamicColumns =
3670+
[
3671+
new DynamicExcelColumn("Id") { Ignore = true }
3672+
]
3673+
};
3674+
3675+
using var conn = Db.GetConnection();
3676+
conn.Open();
3677+
3678+
using var cmd = conn.CreateCommand();
3679+
cmd.CommandText =
3680+
"""
3681+
WITH test('Id', 'Name') AS (
3682+
VALUES
3683+
(1, 'test1'),
3684+
(2, 'test2'),
3685+
(3, 'test3')
3686+
)
3687+
SELECT * FROM test;
3688+
""";
3689+
using var reader = cmd.ExecuteReader();
3690+
3691+
using var path = AutoDeletingPath.Create();
3692+
MiniExcel.SaveAs(path.FilePath, reader, configuration: excelconfig, overwriteFile: true);
3693+
3694+
var rows = MiniExcel.Query(path.FilePath).ToList();
3695+
Assert.All(rows, x => Assert.Single(x));
3696+
Assert.Equal("Name", rows[0].A);
3697+
}
3698+
36633699
private class Issue585VO1
36643700
{
36653701
public string Col1 { get; set; }

0 commit comments

Comments
 (0)