Initial commit of the ClosedXML library

Establishes the foundational structure, core Excel functionality, and tooling.

- Implements base components for cells, ranges, columns, and rows.
- Integrates a custom calculation engine with a wide range of Excel functions.
- Adds comprehensive support for styling, conditional formatting, data validation, comments, pictures, and charts.
- Configures build setup, project metadata (NuGet), and developer guidelines.
- Includes editor and Git attributes for consistent code style and line endings.
This commit is contained in:
Thom Lamb
2026-06-23 11:02:53 -05:00
parent 28bc05cf54
commit 2cd6df6481
1092 changed files with 97270 additions and 408 deletions
@@ -0,0 +1,191 @@
using ClosedXML.Excel;
using NUnit.Framework;
namespace ClosedXML_Tests
{
[TestFixture]
public class XLAddressTests
{
[Test]
public void ToStringTest()
{
var ws = new XLWorkbook().Worksheets.Add("Sheet1");
IXLAddress address = ws.Cell(1, 1).Address;
Assert.AreEqual("A1", address.ToString());
Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1));
Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1));
Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default));
Assert.AreEqual("Sheet1!A1", address.ToString(XLReferenceStyle.Default, true));
Assert.AreEqual("A1", address.ToStringRelative());
Assert.AreEqual("Sheet1!A1", address.ToStringRelative(true));
Assert.AreEqual("$A$1", address.ToStringFixed());
Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1));
Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1));
Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default));
Assert.AreEqual("Sheet1!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true));
Assert.AreEqual("Sheet1!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true));
Assert.AreEqual("Sheet1!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true));
}
[Test]
public void ToStringTestWithSpace()
{
IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1");
IXLAddress address = ws.Cell(1, 1).Address;
Assert.AreEqual("A1", address.ToString());
Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1));
Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1));
Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default));
Assert.AreEqual("'Sheet 1'!A1", address.ToString(XLReferenceStyle.Default, true));
Assert.AreEqual("A1", address.ToStringRelative());
Assert.AreEqual("'Sheet 1'!A1", address.ToStringRelative(true));
Assert.AreEqual("$A$1", address.ToStringFixed());
Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1));
Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1));
Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default));
Assert.AreEqual("'Sheet 1'!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true));
Assert.AreEqual("'Sheet 1'!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true));
Assert.AreEqual("'Sheet 1'!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true));
}
[Test]
public void InvalidAddressToStringTest()
{
var address = ProduceInvalidAddress();
Assert.AreEqual("#REF!", address.ToString());
Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.A1));
Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.R1C1));
Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.Default));
Assert.AreEqual("'Sheet 1'!#REF!", address.ToString(XLReferenceStyle.Default, true));
}
[Test]
public void InvalidAddressToStringFixedTest()
{
var address = ProduceInvalidAddress();
Assert.AreEqual("#REF!", address.ToStringFixed());
Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.A1));
Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.R1C1));
Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.Default));
Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.A1, true));
Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.R1C1, true));
Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.Default, true));
}
[Test]
public void InvalidAddressToStringRelativeTest()
{
var address = ProduceInvalidAddress();
Assert.AreEqual("#REF!", address.ToStringRelative());
Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringRelative(true));
}
[Test]
public void AddressOnDeletedWorksheetToStringTest()
{
var address = ProduceAddressOnDeletedWorksheet();
Assert.AreEqual("A1", address.ToString());
Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1));
Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1));
Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default));
Assert.AreEqual("#REF!A1", address.ToString(XLReferenceStyle.Default, true));
}
[Test]
public void AddressOnDeletedWorksheetToStringFixedTest()
{
var address = ProduceAddressOnDeletedWorksheet();
Assert.AreEqual("$A$1", address.ToStringFixed());
Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1));
Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1));
Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default));
Assert.AreEqual("#REF!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true));
Assert.AreEqual("#REF!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true));
Assert.AreEqual("#REF!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true));
}
[Test]
public void AddressOnDeletedWorksheetToStringRelativeTest()
{
var address = ProduceAddressOnDeletedWorksheet();
Assert.AreEqual("A1", address.ToStringRelative());
Assert.AreEqual("#REF!A1", address.ToStringRelative(true));
}
[Test]
public void InvalidAddressOnDeletedWorksheetToStringTest()
{
var address = ProduceInvalidAddressOnDeletedWorksheet();
Assert.AreEqual("#REF!", address.ToString());
Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.A1));
Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.R1C1));
Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.Default));
Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.Default, true));
}
[Test]
public void InvalidAddressOnDeletedWorksheetToStringFixedTest()
{
var address = ProduceInvalidAddressOnDeletedWorksheet();
Assert.AreEqual("#REF!", address.ToStringFixed());
Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.A1));
Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.R1C1));
Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.Default));
Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.A1, true));
Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.R1C1, true));
Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.Default, true));
}
[Test]
public void InvalidAddressOnDeletedWorksheetToStringRelativeTest()
{
var address = ProduceInvalidAddressOnDeletedWorksheet();
Assert.AreEqual("#REF!", address.ToStringRelative());
Assert.AreEqual("#REF!#REF!", address.ToStringRelative(true));
}
#region Private Methods
private IXLAddress ProduceInvalidAddress()
{
IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1");
var range = ws.Range("A1:B2");
ws.Rows(1, 5).Delete();
return range.RangeAddress.FirstAddress;
}
private IXLAddress ProduceAddressOnDeletedWorksheet()
{
IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1");
var address = ws.Cell("A1").Address;
ws.Delete();
return address;
}
private IXLAddress ProduceInvalidAddressOnDeletedWorksheet()
{
var address = ProduceInvalidAddress();
address.Worksheet.Delete();
return address;
}
#endregion Private Methods
}
}