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,39 @@
using ClosedXML_Examples;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class AutoFilterTests
{
[Test]
public void CustomAutoFilter()
{
TestHelper.RunTestExample<CustomAutoFilter>(@"AutoFilter\CustomAutoFilter.xlsx");
}
[Test]
public void DynamicAutoFilter()
{
TestHelper.RunTestExample<DynamicAutoFilter>(@"AutoFilter\DynamicAutoFilter.xlsx");
}
[Test]
public void RegularAutoFilter()
{
TestHelper.RunTestExample<RegularAutoFilter>(@"AutoFilter\RegularAutoFilter.xlsx");
}
[Test]
public void TopBottomAutoFilter()
{
TestHelper.RunTestExample<TopBottomAutoFilter>(@"AutoFilter\TopBottomAutoFilter.xlsx");
}
[Test]
public void DateTimeGroupAutoFilter()
{
TestHelper.RunTestExample<DateTimeGroupAutoFilter>(@"AutoFilter\DateTimeGroupAutoFilter.xlsx");
}
}
}
+40
View File
@@ -0,0 +1,40 @@
using ClosedXML_Examples;
using ClosedXML_Examples.Columns;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class ColumnsTests
{
[Test]
public void ColumnCells()
{
TestHelper.RunTestExample<ColumnCells>(@"Columns\ColumnCells.xlsx");
}
[Test]
public void ColumnCollections()
{
TestHelper.RunTestExample<ColumnCollection>(@"Columns\ColumnCollection.xlsx");
}
[Test]
public void ColumnSettings()
{
TestHelper.RunTestExample<ColumnSettings>(@"Columns\ColumnSettings.xlsx");
}
[Test]
public void DeletingColumns()
{
TestHelper.RunTestExample<DeletingColumns>(@"Columns\DeletingColumns.xlsx");
}
//[Test] // Not working yet
public void InsertColumns()
{
TestHelper.RunTestExample<InsertColumns>(@"Columns\InsertColumns.xlsx");
}
}
}
+15
View File
@@ -0,0 +1,15 @@
using ClosedXML_Examples;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class CommentsTests
{
[Test]
public void AddingComments()
{
TestHelper.RunTestExample<AddingComments>(@"Comments\AddingComments.xlsx");
}
}
}
@@ -0,0 +1,141 @@
using ClosedXML_Examples;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class ConditionalFormattingTests
{
[Test]
public void CFColorScaleLowHigh()
{
TestHelper.RunTestExample<CFColorScaleLowHigh>(@"ConditionalFormatting\CFColorScaleLowHigh.xlsx");
}
[Test]
public void CFColorScaleLowMidHigh()
{
TestHelper.RunTestExample<CFColorScaleLowMidHigh>(@"ConditionalFormatting\CFColorScaleLowMidHigh.xlsx");
}
[Test]
public void CFColorScaleMinimumMaximum()
{
TestHelper.RunTestExample<CFColorScaleMinimumMaximum>(@"ConditionalFormatting\CFColorScaleMinimumMaximum.xlsx");
}
[Test]
public void CFContains()
{
TestHelper.RunTestExample<CFContains>(@"ConditionalFormatting\CFContains.xlsx");
}
[Test]
public void CFDataBar()
{
TestHelper.RunTestExample<CFDataBar>(@"ConditionalFormatting\CFDataBar.xlsx");
}
[Test]
public void CFDataBarNegative()
{
TestHelper.RunTestExample<CFDataBarNegative>(@"ConditionalFormatting\CFDataBarNegative.xlsx");
}
[Test]
public void CFEndsWith()
{
TestHelper.RunTestExample<CFEndsWith>(@"ConditionalFormatting\CFEndsWith.xlsx");
}
[Test]
public void CFEqualsNumber()
{
TestHelper.RunTestExample<CFEqualsNumber>(@"ConditionalFormatting\CFEqualsNumber.xlsx");
}
[Test]
public void CFEqualsString()
{
TestHelper.RunTestExample<CFEqualsString>(@"ConditionalFormatting\CFEqualsString.xlsx");
}
[Test]
public void CFIconSet()
{
TestHelper.RunTestExample<CFIconSet>(@"ConditionalFormatting\CFIconSet.xlsx");
}
[Test]
public void CFIsBlank()
{
TestHelper.RunTestExample<CFIsBlank>(@"ConditionalFormatting\CFIsBlank.xlsx");
}
[Test]
public void CFIsError()
{
TestHelper.RunTestExample<CFIsError>(@"ConditionalFormatting\CFIsError.xlsx");
}
[Test]
public void CFNotBlank()
{
TestHelper.RunTestExample<CFNotBlank>(@"ConditionalFormatting\CFNotBlank.xlsx");
}
[Test]
public void CFNotContains()
{
TestHelper.RunTestExample<CFNotContains>(@"ConditionalFormatting\CFNotContains.xlsx");
}
[Test]
public void CFNotEqualsNumber()
{
TestHelper.RunTestExample<CFNotEqualsNumber>(@"ConditionalFormatting\CFNotEqualsNumber.xlsx");
}
[Test]
public void CFNotEqualsString()
{
TestHelper.RunTestExample<CFNotEqualsString>(@"ConditionalFormatting\CFNotEqualsString.xlsx");
}
[Test]
public void CFNotError()
{
TestHelper.RunTestExample<CFNotError>(@"ConditionalFormatting\CFNotError.xlsx");
}
[Test]
public void CFStartsWith()
{
TestHelper.RunTestExample<CFStartsWith>(@"ConditionalFormatting\CFStartsWith.xlsx");
}
[Test]
public void CFMultipleConditions()
{
TestHelper.RunTestExample<CFMultipleConditions>(@"ConditionalFormatting\CFMultipleConditions.xlsx");
}
[Test]
public void CFStopIfTrue()
{
TestHelper.RunTestExample<CFStopIfTrue>(@"ConditionalFormatting\CFStopIfTrue.xlsx");
}
[Test]
public void CFDatesOccurring()
{
TestHelper.RunTestExample<CFDatesOccurring>(@"ConditionalFormatting\CFDatesOccurring.xlsx");
}
[Test]
public void CFDataBars()
{
TestHelper.RunTestExample<CFDataBars>(@"ConditionalFormatting\CFDataBars.xlsx");
}
}
}
+21
View File
@@ -0,0 +1,21 @@
using ClosedXML_Examples.Delete;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class DeleteTests
{
[Test]
public void DeleteFewWorksheets()
{
TestHelper.RunTestExample<DeleteFewWorksheets>(@"Delete\DeleteFewWorksheets.xlsx");
}
[Test]
public void RemoveRows()
{
TestHelper.RunTestExample<DeleteRows>(@"Delete\RemoveRows.xlsx");
}
}
}
@@ -0,0 +1,21 @@
using ClosedXML_Examples;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class ImageHandlingTests
{
[Test]
public void ImageAnchors()
{
TestHelper.RunTestExample<ImageAnchors>(@"ImageHandling\ImageAnchors.xlsx");
}
[Test]
public void ImageFormats()
{
TestHelper.RunTestExample<ImageFormats>(@"ImageHandling\ImageFormats.xlsx");
}
}
}
+15
View File
@@ -0,0 +1,15 @@
using ClosedXML_Examples;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class LoadingTests
{
[Test]
public void ChangingBasicTable()
{
TestHelper.RunTestExample<ChangingBasicTable>(@"Loading\ChangingBasicTable.xlsx");
}
}
}
+209
View File
@@ -0,0 +1,209 @@
using ClosedXML_Examples;
using ClosedXML_Examples.Misc;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class MiscTests
{
[Test]
public void AddingDataSet()
{
TestHelper.RunTestExample<AddingDataSet>(@"Misc\AddingDataSet.xlsx");
}
[Test]
public void AddingDataTableAsWorksheet()
{
TestHelper.RunTestExample<AddingDataTableAsWorksheet>(@"Misc\AddingDataTableAsWorksheet.xlsx");
}
[Test]
public void AdjustToContents()
{
TestHelper.RunTestExample<AdjustToContents>(@"Misc\AdjustToContents.xlsx");
}
[Test]
public void AdjustToContentsWithAutoFilter()
{
TestHelper.RunTestExample<AdjustToContentsWithAutoFilter>(@"Misc\AdjustToContentsWithAutoFilter.xlsx");
}
[Test]
public void AutoFilter()
{
TestHelper.RunTestExample<AutoFilter>(@"Misc\AutoFilter.xlsx");
}
[Test]
public void BasicTable()
{
TestHelper.RunTestExample<BasicTable>(@"Misc\BasicTable.xlsx");
}
[Test]
public void BlankCells()
{
TestHelper.RunTestExample<BlankCells>(@"Misc\BlankCells.xlsx");
}
[Test]
public void CellValues()
{
TestHelper.RunTestExample<CellValues>(@"Misc\CellValues.xlsx");
}
[Test]
public void Collections()
{
TestHelper.RunTestExample<Collections>(@"Misc\Collections.xlsx");
}
[Test]
public void CopyingRowsAndColumns()
{
TestHelper.RunTestExample<CopyingRowsAndColumns>(@"Misc\CopyingRowsAndColumns.xlsx");
}
[Test]
public void CopyingWorksheets()
{
TestHelper.RunTestExample<CopyingWorksheets>(@"Misc\CopyingWorksheets.xlsx");
}
[Test]
public void DataTypes()
{
TestHelper.RunTestExample<DataTypes>(@"Misc\DataTypes.xlsx");
}
[Test]
public void DataTypesUnderDifferentCulture()
{
TestHelper.RunTestExample<DataTypesUnderDifferentCulture>(@"Misc\DataTypesUnderDifferentCulture.xlsx");
}
[Test]
public void DataValidation()
{
TestHelper.RunTestExample<DataValidation>(@"Misc\DataValidation.xlsx");
}
[Test]
public void Formulas()
{
TestHelper.RunTestExample<Formulas>(@"Misc\Formulas.xlsx");
}
[Test]
public void FormulasWithEvaluation()
{
TestHelper.RunTestExample<FormulasWithEvaluation>(@"Misc\FormulasWithEvaluation.xlsx", true);
}
[Test]
public void FreezePanes()
{
TestHelper.RunTestExample<FreezePanes>(@"Misc\FreezePanes.xlsx");
}
[Test]
public void HideSheets()
{
TestHelper.RunTestExample<HideSheets>(@"Misc\HideSheets.xlsx");
}
[Test]
public void HideUnhide()
{
TestHelper.RunTestExample<HideUnhide>(@"Misc\HideUnhide.xlsx");
}
[Test]
public void Hyperlinks()
{
TestHelper.RunTestExample<Hyperlinks>(@"Misc\Hyperlinks.xlsx");
}
[Test]
public void InsertingData()
{
TestHelper.RunTestExample<InsertingData>(@"Misc\InsertingData.xlsx");
}
[Test]
public void LambdaExpressions()
{
TestHelper.RunTestExample<LambdaExpressions>(@"Misc\LambdaExpressions.xlsx");
}
[Test]
public void MergeCells()
{
TestHelper.RunTestExample<MergeCells>(@"Misc\MergeCells.xlsx");
}
[Test]
public void MergeMoves()
{
TestHelper.RunTestExample<MergeMoves>(@"Misc\MergeMoves.xlsx");
}
[Test]
public void Outline()
{
TestHelper.RunTestExample<Outline>(@"Misc\Outline.xlsx");
}
[Test]
public void RightToLeft()
{
TestHelper.RunTestExample<RightToLeft>(@"Misc\RightToLeft.xlsx");
}
[Test]
public void SheetProtection()
{
TestHelper.RunTestExample<SheetProtection>(@"Misc\SheetProtection.xlsx");
}
[Test]
public void SheetViews()
{
TestHelper.RunTestExample<SheetViews>(@"Misc\SheetViews.xlsx");
}
[Test]
public void ShiftingFormulas()
{
TestHelper.RunTestExample<ShiftingFormulas>(@"Misc\ShiftingFormulas.xlsx");
}
[Test]
public void ShowCase()
{
TestHelper.RunTestExample<ShowCase>(@"Misc\ShowCase.xlsx");
}
[Test]
public void TabColors()
{
TestHelper.RunTestExample<TabColors>(@"Misc\TabColors.xlsx");
}
[Test]
public void WorkbookProperties()
{
TestHelper.RunTestExample<WorkbookProperties>(@"Misc\WorkbookProperties.xlsx");
}
[Test]
public void WorkbookProtection()
{
TestHelper.RunTestExample<WorkbookProtection>(@"Misc\WorkbookProtection.xlsx");
}
}
}
@@ -0,0 +1,45 @@
using ClosedXML_Examples.PageSetup;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class PageSetupTests
{
[Test]
public void HeaderFooters()
{
TestHelper.RunTestExample<HeaderFooters>(@"PageSetup\HeaderFooters.xlsx");
}
[Test]
public void Margins()
{
TestHelper.RunTestExample<Margins>(@"PageSetup\Margins.xlsx");
}
[Test]
public void Page()
{
TestHelper.RunTestExample<Page>(@"PageSetup\Page.xlsx");
}
[Test]
public void SheetTab()
{
TestHelper.RunTestExample<SheetTab>(@"PageSetup\SheetTab.xlsx");
}
[Test]
public void Sheets()
{
TestHelper.RunTestExample<Sheets>(@"PageSetup\Sheets.xlsx");
}
[Test]
public void TwoPages()
{
TestHelper.RunTestExample<TwoPages>(@"PageSetup\TwoPages.xlsx");
}
}
}
@@ -0,0 +1,15 @@
using ClosedXML_Examples;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class PivotTableTests
{
[Test]
public void PivotTables()
{
TestHelper.RunTestExample<PivotTables>(@"PivotTables\PivotTables.xlsx");
}
}
}
+113
View File
@@ -0,0 +1,113 @@
using ClosedXML_Examples;
using ClosedXML_Examples.Misc;
using ClosedXML_Examples.Ranges;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class RangesTests
{
[Test]
public void ClearingRanges()
{
TestHelper.RunTestExample<ClearingRanges>(@"Ranges\ClearingRanges.xlsx");
}
[Test]
public void CopyingRanges()
{
TestHelper.RunTestExample<CopyingRanges>(@"Ranges\CopyingRanges.xlsx");
}
[Test]
public void CurrentRowColumn()
{
TestHelper.RunTestExample<CurrentRowColumn>(@"Ranges\CurrentRowColumn.xlsx");
}
[Test]
public void DefiningRanges()
{
TestHelper.RunTestExample<DefiningRanges>(@"Ranges\DefiningRanges.xlsx");
}
[Test]
public void DeletingRanges()
{
TestHelper.RunTestExample<DeletingRanges>(@"Ranges\DeletingRanges.xlsx");
}
[Test]
public void InsertingDeletingColumns()
{
TestHelper.RunTestExample<InsertingDeletingColumns>(@"Ranges\InsertingDeletingColumns.xlsx");
}
[Test]
public void InsertingDeletingRows()
{
TestHelper.RunTestExample<InsertingDeletingRows>(@"Ranges\InsertingDeletingRows.xlsx");
}
[Test]
public void MultipleRanges()
{
TestHelper.RunTestExample<MultipleRanges>(@"Ranges\MultipleRanges.xlsx");
}
[Test]
public void NamedRanges()
{
TestHelper.RunTestExample<NamedRanges>(@"Ranges\NamedRanges.xlsx");
}
[Test]
public void SelectingRanges()
{
TestHelper.RunTestExample<SelectingRanges>(@"Ranges\SelectingRanges.xlsx");
}
[Test]
public void ShiftingRanges()
{
TestHelper.RunTestExample<ShiftingRanges>(@"Ranges\ShiftingRanges.xlsx");
}
[Test]
public void SortExample()
{
TestHelper.RunTestExample<SortExample>(@"Ranges\SortExample.xlsx");
}
[Test]
public void Sorting()
{
TestHelper.RunTestExample<Sorting>(@"Ranges\Sorting.xlsx");
}
[Test]
public void TransposeRanges()
{
TestHelper.RunTestExample<TransposeRanges>(@"Ranges\TransposeRanges.xlsx");
}
[Test]
public void TransposeRangesPlus()
{
TestHelper.RunTestExample<TransposeRangesPlus>(@"Ranges\TransposeRangesPlus.xlsx");
}
[Test]
public void AddingRowToTables()
{
TestHelper.RunTestExample<AddingRowToTables>(@"Ranges\AddingRowToTables.xlsx");
}
[Test]
public void WalkingRanges()
{
TestHelper.RunTestExample<WalkingRanges>(@"Ranges\WalkingRanges.xlsx");
}
}
}
+34
View File
@@ -0,0 +1,34 @@
using ClosedXML_Examples;
using ClosedXML_Examples.Rows;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class RowsTests
{
[Test]
public void RowCells()
{
TestHelper.RunTestExample<RowCells>(@"Rows\RowCells.xlsx");
}
[Test]
public void RowCollection()
{
TestHelper.RunTestExample<RowCollection>(@"Rows\RowCollection.xlsx");
}
[Test]
public void RowSettings()
{
TestHelper.RunTestExample<RowSettings>(@"Rows\RowSettings.xlsx");
}
//[Test] // Not working yet
public void InsertRows()
{
TestHelper.RunTestExample<InsertRows>(@"Rows\InsertRows.xlsx");
}
}
}
+87
View File
@@ -0,0 +1,87 @@
using ClosedXML_Examples.Styles;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class StylesTests
{
[Test]
public void DefaultStyles()
{
TestHelper.RunTestExample<DefaultStyles>(@"Styles\DefaultStyles.xlsx");
}
[Test]
public void PurpleWorksheet()
{
TestHelper.RunTestExample<PurpleWorksheet>(@"Styles\PurpleWorksheet.xlsx");
}
[Test]
public void StyleAlignment()
{
TestHelper.RunTestExample<StyleAlignment>(@"Styles\StyleAlignment.xlsx");
}
[Test]
public void StyleBorder()
{
TestHelper.RunTestExample<StyleBorder>(@"Styles\StyleBorder.xlsx");
}
[Test]
public void StyleFill()
{
TestHelper.RunTestExample<StyleFill>(@"Styles\StyleFill.xlsx");
}
[Test]
public void StyleFont()
{
TestHelper.RunTestExample<StyleFont>(@"Styles\StyleFont.xlsx");
}
[Test]
public void StyleNumberFormat()
{
TestHelper.RunTestExample<StyleNumberFormat>(@"Styles\StyleNumberFormat.xlsx");
}
[Test]
public void StyleIncludeQuotePrefix()
{
TestHelper.RunTestExample<StyleIncludeQuotePrefix>(@"Styles\StyleIncludeQuotePrefix.xlsx");
}
[Test]
public void StyleRowsColumns()
{
TestHelper.RunTestExample<StyleRowsColumns>(@"Styles\StyleRowsColumns.xlsx");
}
[Test]
public void StyleWorksheet()
{
TestHelper.RunTestExample<StyleWorksheet>(@"Styles\StyleWorksheet.xlsx");
}
[Test]
public void UsingColors()
{
TestHelper.RunTestExample<UsingColors>(@"Styles\UsingColors.xlsx");
}
[Test]
public void UsingPhonetics()
{
TestHelper.RunTestExample<UsingPhonetics>(@"Styles\UsingPhonetics.xlsx");
}
[Test]
public void UsingRichText()
{
TestHelper.RunTestExample<UsingRichText>(@"Styles\UsingRichText.xlsx");
}
}
}
+27
View File
@@ -0,0 +1,27 @@
using ClosedXML_Examples.Tables;
using NUnit.Framework;
namespace ClosedXML_Tests.Examples
{
[TestFixture]
public class TablesTests
{
[Test]
public void InsertingTables()
{
TestHelper.RunTestExample<InsertingTables>(@"Tables\InsertingTables.xlsx");
}
[Test]
public void ResizingTables()
{
TestHelper.RunTestExample<ResizingTables>(@"Tables\ResizingTables.xlsx");
}
[Test]
public void UsingTables()
{
TestHelper.RunTestExample<UsingTables>(@"Tables\UsingTables.xlsx");
}
}
}