Skip to content

Commit

Permalink
Implement sensible ToString override for XLCell
Browse files Browse the repository at this point in the history
  • Loading branch information
igitur committed Nov 23, 2020
1 parent 0b7a704 commit 8dcc7c1
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
7 changes: 7 additions & 0 deletions ClosedXML/Excel/Cells/IXLCell.cs
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,13 @@ public interface IXLCell

XLTableCellType TableCellType();

/// <summary>
/// Returns a string that represents the current state of the cell according to the format.
/// </summary>
/// <param name="format">A: address, F: formula, NF: number format, BG: background color, FG: foreground color, V: formatted value</param>
/// <returns></returns>
string ToString(string format);

Boolean TryGetValue<T>(out T value);

IXLColumn WorksheetColumn();
Expand Down
16 changes: 16 additions & 0 deletions ClosedXML/Excel/Cells/XLCell.cs
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,22 @@ private Object ParseCellValueFromString(String cellValue, XLDataType dataType, o
return cellValue;
}

public override string ToString() => ToString("A");

public string ToString(string format)
{
return (format.ToUpper()) switch
{
"A" => this.Address.ToString(),
"F" => HasFormula ? this.FormulaA1 : string.Empty,
"NF" => Style.NumberFormat.Format,
"FG" => Style.Font.FontColor.ToString(),
"BG" => Style.Fill.BackgroundColor.ToString(),
"V" => GetFormattedString(),
_ => throw new FormatException($"Format {format} was not recognised."),
};
}

public object Value
{
get
Expand Down
49 changes: 49 additions & 0 deletions ClosedXML_Tests/Excel/Cells/XLCellTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1127,5 +1127,54 @@ public void SetValue_IEnumerable()
Assert.AreEqual("More text", ws.Cell("A5").GetString());
Assert.IsTrue(ws.Cell("A6").IsEmpty());
}

[Test]
public void ToStringNoFormatString()
{
using var wb = new XLWorkbook();
var ws = wb.AddWorksheet("Sheet1");
var c = ws.FirstCell().CellBelow(2).CellRight(3);

Assert.AreEqual("D3", c.ToString());
}

[Test]
[TestCase("D3", "A")]
[TestCase("YEAR(DATE(2018, 1, 1))", "F")]
[TestCase("YEAR(DATE(2018, 1, 1))", "f")]
[TestCase("0000.00", "NF")]
[TestCase("0000.00", "nf")]
[TestCase("FFFF0000", "fg")]
[TestCase("Color Theme: Accent5, Tint: 0", "BG")]
[TestCase("2018.00", "v")]
public void ToStringFormatString(string expected, string format)
{
using var wb = new XLWorkbook();
var ws = wb.AddWorksheet("Sheet1");
var c = ws.FirstCell().CellBelow(2).CellRight(3);

var formula = "YEAR(DATE(2018, 1, 1))";
c.FormulaA1 = formula;

var numberFormat = "0000.00";
c.Style.NumberFormat.Format = numberFormat;

c.Style.Font.FontColor = XLColor.Red;
c.Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent5);

Assert.AreEqual(expected, c.ToString(format));

Assert.Throws<FormatException>(() => c.ToString("dummy"));
}

[Test]
public void ToStringInvalidFormat()
{
using var wb = new XLWorkbook();
var ws = wb.AddWorksheet("Sheet1");
var c = ws.FirstCell();

Assert.Throws<FormatException>(() => c.ToString("dummy"));
}
}
}

0 comments on commit 8dcc7c1

Please sign in to comment.