Skip to content

Commit d3f014c

Browse files
authored
95 nullreferenceexception with rows fit (#254)
* Fixed a performance issue caused by a large number of merged ranges. (#246 Three lists generation on one sheet hangs) * fix issue #95 (nullreferenceexception with RowsFit|ColsFit tag when empty data source)
1 parent 6be5de6 commit d3f014c

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

ClosedXML.Report/Options/ColsFitTag.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,28 @@ public override void Execute(ProcessingContext context)
2727
// worksheet column
2828
else if (cellRow == 1)
2929
{
30-
ws.Column(cellClmn).AdjustToContents(ws.FirstRowUsed().RowNumber(), ws.LastRowUsed().RowNumber());
30+
var firstRowUsed = ws.FirstRowUsed();
31+
if (firstRowUsed != null)
32+
ws.Column(cellClmn).AdjustToContents(firstRowUsed.RowNumber(), ws.LastRowUsed().RowNumber());
3133
}
3234
// whole range
3335
else if (IsSpecialRangeCell(xlCell))
3436
{
35-
ws.Columns(xlRange.FirstColumnUsed().ColumnNumber(), xlRange.LastColumnUsed().ColumnNumber())
36-
.AdjustToContents(xlRange.FirstRowUsed().RowNumber()-1, xlRange.LastRowUsed().RowNumber());
37+
var firstUsed = xlRange.FirstCellUsed();
38+
var lastUsed = xlRange.LastCellUsed();
39+
40+
if (firstUsed != null && lastUsed != null)
41+
{
42+
ws.Columns(firstUsed.WorksheetColumn().ColumnNumber(), lastUsed.WorksheetColumn().ColumnNumber())
43+
.AdjustToContents(firstUsed.WorksheetRow().RowNumber() - 1, lastUsed.WorksheetRow().RowNumber());
44+
}
3745
}
3846
// range column
3947
else if (IsSpecialRangeRow(xlCell))
4048
{
41-
ws.Column(cellClmn).AdjustToContents(xlRange.FirstRowUsed().RowNumber(), xlRange.LastRowUsed().RowNumber());
49+
var firstRowUsed = xlRange.FirstRowUsed();
50+
if (firstRowUsed != null)
51+
ws.Column(cellClmn).AdjustToContents(firstRowUsed.RowNumber(), xlRange.LastRowUsed().RowNumber());
4252
}
4353
// only one cell
4454
else

ClosedXML.Report/Options/RowsFitTag.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ public class RowsFitTag : OptionTag
44
{
55
public override void Execute(ProcessingContext context)
66
{
7-
var xlCell = Cell.GetXlCell(context.Range);
7+
var xlRange = context.Range;
8+
var xlCell = Cell.GetXlCell(xlRange);
89
var cellAddr = xlCell.Address.ToStringRelative(false);
910
var cellRow = xlCell.WorksheetRow().RowNumber();
1011
var cellClmn = xlCell.WorksheetColumn().ColumnNumber();
@@ -26,18 +27,28 @@ public override void Execute(ProcessingContext context)
2627
// worksheet row
2728
else if (cellClmn == 1)
2829
{
29-
ws.Rows(cellRow, cellRow).AdjustToContents(ws.FirstColumnUsed().ColumnNumber(), ws.LastColumnUsed().ColumnNumber());
30+
var firstColumnUsed = ws.FirstColumnUsed();
31+
if (firstColumnUsed != null)
32+
ws.Rows(cellRow, cellRow).AdjustToContents(firstColumnUsed.ColumnNumber(), ws.LastColumnUsed().ColumnNumber());
3033
}
3134
// whole range
3235
else if (IsSpecialRangeCell(xlCell))
3336
{
34-
ws.Rows(context.Range.FirstRowUsed().RowNumber(), context.Range.LastRowUsed().RowNumber())
35-
.AdjustToContents(context.Range.FirstColumnUsed().ColumnNumber(), context.Range.LastColumnUsed().ColumnNumber());
37+
var firstUsed = xlRange.FirstCellUsed();
38+
var lastUsed = xlRange.LastCellUsed();
39+
40+
if (firstUsed != null && lastUsed != null)
41+
{
42+
ws.Rows(firstUsed.WorksheetRow().RowNumber(), lastUsed.WorksheetRow().RowNumber())
43+
.AdjustToContents(firstUsed.WorksheetColumn().ColumnNumber(), lastUsed.WorksheetColumn().ColumnNumber());
44+
}
3645
}
3746
// range row
38-
if (cellClmn == context.Range.RangeAddress.FirstAddress.ColumnNumber)
47+
if (cellClmn == xlRange.RangeAddress.FirstAddress.ColumnNumber)
3948
{
40-
ws.Rows(cellRow, cellRow).AdjustToContents(context.Range.FirstColumnUsed().ColumnNumber(), context.Range.LastColumnUsed().ColumnNumber());
49+
var firstColumnUsed = xlRange.FirstColumnUsed();
50+
if (firstColumnUsed != null)
51+
ws.Rows(cellRow, cellRow).AdjustToContents(firstColumnUsed.ColumnNumber(), xlRange.LastColumnUsed().ColumnNumber());
4152
}
4253
// only one cell
4354
else

0 commit comments

Comments
 (0)