diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj
index 4bc2ce0..b17bde2 100644
--- a/ClosedXML/ClosedXML.csproj
+++ b/ClosedXML/ClosedXML.csproj
@@ -65,6 +65,14 @@
+
+
+
+
+
+
+
+
@@ -73,6 +81,10 @@
+
+
+
+
@@ -83,12 +95,15 @@
+
+
+
diff --git a/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs b/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs
index 88ca907..f13ce40 100644
--- a/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs
+++ b/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs
@@ -1,25 +1,30 @@
using System;
+
namespace ClosedXML.Excel
{
- using System.Collections.Generic;
public enum XLFilterType { Regular, Custom, TopBottom, Dynamic }
+
public enum XLFilterDynamicType { AboveAverage, BelowAverage }
- public enum XLTopBottomPart { Top, Bottom}
+
+ public enum XLTopBottomPart { Top, Bottom }
+
public interface IXLBaseAutoFilter
{
Boolean Enabled { get; set; }
IXLRange Range { get; set; }
+
IXLBaseAutoFilter Set(IXLRangeBase range);
+
IXLBaseAutoFilter Clear();
IXLFilterColumn Column(String column);
+
IXLFilterColumn Column(Int32 column);
IXLBaseAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true);
+
Boolean Sorted { get; set; }
XLSortOrder SortOrder { get; set; }
Int32 SortColumn { get; set; }
-
-
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML/Excel/CalcEngine/CalcEngine.cs b/ClosedXML/Excel/CalcEngine/CalcEngine.cs
index 8cc752e..c1a1aa1 100644
--- a/ClosedXML/Excel/CalcEngine/CalcEngine.cs
+++ b/ClosedXML/Excel/CalcEngine/CalcEngine.cs
@@ -253,6 +253,18 @@
#region ** token/keyword tables
+ private static readonly IDictionary ErrorMap = new Dictionary()
+ {
+ ["#REF!"] = ErrorExpression.ExpressionErrorType.CellReference,
+ ["#VALUE!"] = ErrorExpression.ExpressionErrorType.CellValue,
+ ["#DIV/0!"] = ErrorExpression.ExpressionErrorType.DivisionByZero,
+ ["#NAME?"] = ErrorExpression.ExpressionErrorType.NameNotRecognized,
+ ["#N/A"] = ErrorExpression.ExpressionErrorType.NoValueAvailable,
+ ["#NULL!"] = ErrorExpression.ExpressionErrorType.NullValue,
+ ["#NUM!"] = ErrorExpression.ExpressionErrorType.NumberInvalid
+ };
+
+
// build/get static token table
private Dictionary
diff --git a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs
index a87bf0c..769afa2 100644
--- a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs
+++ b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs
@@ -1,6 +1,5 @@
-using System;
using ClosedXML.Excel;
-
+using System;
namespace ClosedXML_Examples
{
@@ -27,7 +26,6 @@
public class CFColorScaleLowHigh : IXLExample
{
-
public void Create(String filePath)
{
var workbook = new XLWorkbook();
@@ -221,7 +219,6 @@
}
}
-
public class CFEqualsString : IXLExample
{
public void Create(String filePath)
@@ -527,6 +524,39 @@
}
}
+ public class CFDataBarNegative : IXLExample
+ {
+ public void Create(String filePath)
+ {
+ var workbook = new XLWorkbook();
+ var ws = workbook.AddWorksheet("Sheet1");
+
+ ws.Cell(1, 1).SetValue(-1)
+ .CellBelow().SetValue(1)
+ .CellBelow().SetValue(2)
+ .CellBelow().SetValue(3);
+
+ ws.Range(ws.Cell(1, 1), ws.Cell(4, 1))
+ .AddConditionalFormat()
+ .DataBar(XLColor.Green, XLColor.Red, showBarOnly: false)
+ .LowestValue()
+ .HighestValue();
+
+ ws.Cell(1,3).SetValue(-20)
+ .CellBelow().SetValue(40)
+ .CellBelow().SetValue(-60)
+ .CellBelow().SetValue(30);
+
+ ws.Range(ws.Cell(1, 3), ws.Cell(4, 3))
+ .AddConditionalFormat()
+ .DataBar(XLColor.Green, XLColor.Red, showBarOnly: true)
+ .Minimum(XLCFContentType.Number, -100)
+ .Maximum(XLCFContentType.Number, 100);
+
+ workbook.SaveAs(filePath);
+ }
+ }
+
public class CFIconSet : IXLExample
{
public void Create(String filePath)
@@ -579,7 +609,7 @@
var workbook = new XLWorkbook();
var ws = workbook.AddWorksheet("Sheet1");
- ws.Cell(2,1).SetValue(1)
+ ws.Cell(2, 1).SetValue(1)
.CellRight().SetValue(1)
.CellRight().SetValue(2)
.CellRight().SetValue(3);
@@ -588,7 +618,6 @@
range.AddConditionalFormat().WhenEquals("1").Font.SetBold();
range.InsertRowsAbove(1);
-
workbook.SaveAs(filePath);
}
}
@@ -606,7 +635,7 @@
.CellBelow().SetValue(3)
.CellBelow().SetValue(4);
- ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red)
+ ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red, XLColor.Green)
.LowestValue()
.HighestValue();
@@ -621,7 +650,7 @@
var workbook = new XLWorkbook();
var ws = workbook.AddWorksheet("Sheet1");
- using(var range = ws.Range("A1:A10"))
+ using (var range = ws.Range("A1:A10"))
{
range.AddConditionalFormat().WhenEquals("3")
.Fill.SetBackgroundColor(XLColor.Blue);
@@ -634,4 +663,28 @@
workbook.SaveAs(filePath);
}
}
+
+ public class CFStopIfTrue : IXLExample
+ {
+ public void Create(String filePath)
+ {
+ var workbook = new XLWorkbook();
+ var ws = workbook.AddWorksheet("Sheet1");
+
+ ws.FirstCell().SetValue(6)
+ .CellBelow().SetValue(1)
+ .CellBelow().SetValue(2)
+ .CellBelow().SetValue(3);
+
+ ws.RangeUsed().AddConditionalFormat().StopIfTrue().WhenGreaterThan(5);
+
+
+ ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true)
+ .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number)
+ .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number)
+ .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number);
+
+ workbook.SaveAs(filePath);
+ }
+ }
}
diff --git a/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML_Examples/Creating/CreateFiles.cs
index 1e639dd..8f1978f 100644
--- a/ClosedXML_Examples/Creating/CreateFiles.cs
+++ b/ClosedXML_Examples/Creating/CreateFiles.cs
@@ -4,6 +4,7 @@
using ClosedXML_Examples.Ranges;
using ClosedXML_Examples.Rows;
using ClosedXML_Examples.Styles;
+using ClosedXML_Examples.Tables;
using System.IO;
namespace ClosedXML_Examples
@@ -67,6 +68,7 @@
new RowCells().Create(Path.Combine(path, "RowCells.xlsx"));
new FreezePanes().Create(Path.Combine(path, "FreezePanes.xlsx"));
new UsingTables().Create(Path.Combine(path, "UsingTables.xlsx"));
+ new ResizingTables().Create(Path.Combine(path, "ResizingTables.xlsx"));
new AddingRowToTables().Create(Path.Combine(path, "AddingRowToTables.xlsx"));
new RightToLeft().Create(Path.Combine(path, "RightToLeft.xlsx"));
new ShowCase().Create(Path.Combine(path, "ShowCase.xlsx"));
diff --git a/ClosedXML_Examples/Misc/AddingDataSet.cs b/ClosedXML_Examples/Misc/AddingDataSet.cs
index 11c4b9c..a8d1e68 100644
--- a/ClosedXML_Examples/Misc/AddingDataSet.cs
+++ b/ClosedXML_Examples/Misc/AddingDataSet.cs
@@ -1,45 +1,11 @@
+using ClosedXML.Excel;
using System;
using System.Data;
-using ClosedXML.Excel;
namespace ClosedXML_Examples.Misc
{
public class AddingDataSet : IXLExample
{
- #region Variables
-
- // Public
-
- // Private
-
-
- #endregion
-
- #region Properties
-
- // Public
-
- // Private
-
- // Override
-
-
- #endregion
-
- #region Events
-
- // Public
-
- // Private
-
- // Override
-
-
- #endregion
-
- #region Methods
-
- // Public
public void Create(String filePath)
{
var wb = new XLWorkbook();
@@ -52,7 +18,6 @@
wb.SaveAs(filePath);
}
- // Private
private DataSet GetDataSet()
{
var ds = new DataSet();
@@ -78,9 +43,5 @@
table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5));
return table;
}
- // Override
-
-
- #endregion
}
}
diff --git a/ClosedXML_Examples/Misc/AutoFilter.cs b/ClosedXML_Examples/Misc/AutoFilter.cs
index 21b8402..bb119b2 100644
--- a/ClosedXML_Examples/Misc/AutoFilter.cs
+++ b/ClosedXML_Examples/Misc/AutoFilter.cs
@@ -50,11 +50,11 @@
ws.Cell("A4").Value = "Dagny";
ws.RangeUsed().SetAutoFilter();
-
- // Your can turn off the autofilter in three ways:
- // 1) worksheet.AutoFilterRange.SetAutoFilter(false)
- // 2) worksheet.AutoFilterRange = null
- // 3) Pick any range in the worksheet and call range.SetAutoFilter(false);
+
+ // Your can turn off the autofilter by:
+ // 1) worksheet.AutoFilter.Clear()
+ // 2) worksheet.SetAutoFilter(false)
+ // 3) Pick any range in the worksheet and call the above methods on the range
wb.SaveAs(filePath);
}
diff --git a/ClosedXML_Examples/Misc/Collections.cs b/ClosedXML_Examples/Misc/Collections.cs
index 39b416d..a9b9fe5 100644
--- a/ClosedXML_Examples/Misc/Collections.cs
+++ b/ClosedXML_Examples/Misc/Collections.cs
@@ -68,7 +68,7 @@
var dataTable = GetTable();
ws.Cell(6, 1).Value = "DataTable";
ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles");
- ws.Cell(7, 1).Value = dataTable.AsEnumerable();
+ ws.Cell(7, 1).Value = dataTable;
// From a query
var list = new List();
@@ -83,8 +83,7 @@
ws.Cell(6, 6).Value = "Query";
ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles");
- ws.Cell(7, 6).Value = people.AsEnumerable(); // Very Important to call the AsEnumerable method
- // otherwise it won't be copied.
+ ws.Cell(7, 6).Value = people;
// Prepare the style for the titles
@@ -92,7 +91,7 @@
titlesStyle.Font.Bold = true;
titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
titlesStyle.Fill.BackgroundColor = XLColor.Cyan;
-
+
// Format all titles in one shot
wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle;
diff --git a/ClosedXML_Examples/Misc/CopyingWorksheets.cs b/ClosedXML_Examples/Misc/CopyingWorksheets.cs
index b0843eb..e06cd66 100644
--- a/ClosedXML_Examples/Misc/CopyingWorksheets.cs
+++ b/ClosedXML_Examples/Misc/CopyingWorksheets.cs
@@ -1,6 +1,6 @@
-using System.IO;
using ClosedXML.Excel;
-using ClosedXML_Examples.Ranges;
+using ClosedXML_Examples.Tables;
+using System.IO;
namespace ClosedXML_Examples.Misc
{
@@ -18,7 +18,7 @@
var wsSource = wb.Worksheet(1);
// Copy the worksheet to a new sheet in this workbook
wsSource.CopyTo("Copy");
-
+
// We're going to open another workbook to show that you can
// copy a sheet from one workbook to another:
new BasicTable().Create(tempFile2);
@@ -40,6 +40,5 @@
}
}
}
-
}
}
diff --git a/ClosedXML_Examples/Misc/InsertingData.cs b/ClosedXML_Examples/Misc/InsertingData.cs
index d1035d5..626a9ec 100644
--- a/ClosedXML_Examples/Misc/InsertingData.cs
+++ b/ClosedXML_Examples/Misc/InsertingData.cs
@@ -1,8 +1,8 @@
+using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
-using ClosedXML.Excel;
namespace ClosedXML_Examples.Misc
{
@@ -38,7 +38,7 @@
var dataTable = GetTable();
ws.Cell(6, 1).Value = "From DataTable";
ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles");
- ws.Cell(7, 1).InsertData(dataTable.AsEnumerable());
+ ws.Cell(7, 1).InsertData(dataTable);
// From a query
var list = new List();
@@ -53,11 +53,15 @@
ws.Cell(6, 6).Value = "From Query";
ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles");
- ws.Cell(7, 6).InsertData(people.AsEnumerable());
+ ws.Cell(7, 6).InsertData(people);
- ws.Cell("F13").Value = "Transposed";
- ws.Range(13, 6, 13, 8).Merge().AddToNamed("Titles");
- ws.Cell("F14").InsertData(people.AsEnumerable(), true);
+ ws.Cell(11, 6).Value = "From List";
+ ws.Range(11, 6, 11, 9).Merge().AddToNamed("Titles");
+ ws.Cell(12, 6).InsertData(list);
+
+ ws.Cell("A13").Value = "Transposed";
+ ws.Range(13, 1, 13, 3).Merge().AddToNamed("Titles");
+ ws.Cell("A14").InsertData(people.AsEnumerable(), true);
// Prepare the style for the titles
var titlesStyle = wb.Style;
@@ -74,17 +78,17 @@
}
}
- class Person
+ private class Person
{
public String House { get; set; }
public String Name { get; set; }
public Int32 Age { get; set; }
+ public static String ClassType { get { return nameof(Person); } }
}
// Private
private DataTable GetTable()
{
-
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
@@ -98,9 +102,9 @@
table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5));
return table;
}
+
// Override
-
- #endregion
+ #endregion Methods
}
}
diff --git a/ClosedXML_Examples/Misc/InsertingTables.cs b/ClosedXML_Examples/Misc/InsertingTables.cs
deleted file mode 100644
index 50be801..0000000
--- a/ClosedXML_Examples/Misc/InsertingTables.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using ClosedXML.Attributes;
-using ClosedXML.Excel;
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-
-namespace ClosedXML_Examples.Misc
-{
- public class InsertingTables : IXLExample
- {
- #region Methods
-
- // Public
- public void Create(String filePath)
- {
- var wb = new XLWorkbook();
- var ws = wb.Worksheets.Add("Inserting Tables");
-
- // From a list of strings
- var listOfStrings = new List();
- listOfStrings.Add("House");
- listOfStrings.Add("Car");
- ws.Cell(1, 1).Value = "From Strings";
- ws.Cell(1, 1).AsRange().AddToNamed("Titles");
- ws.Cell(2, 1).InsertTable(listOfStrings);
-
- // From a list of arrays
- var listOfArr = new List();
- listOfArr.Add(new Int32[] { 1, 2, 3 });
- listOfArr.Add(new Int32[] { 1 });
- listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 });
- ws.Cell(1, 3).Value = "From Arrays";
- ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles");
- ws.Cell(2, 3).InsertTable(listOfArr);
-
- // From a DataTable
- var dataTable = GetTable();
- ws.Cell(7, 1).Value = "From DataTable";
- ws.Range(7, 1, 7, 4).Merge().AddToNamed("Titles");
- ws.Cell(8, 1).InsertTable(dataTable.AsEnumerable());
-
- // From a query
- var list = new List();
- list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." });
- list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." });
- list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." });
- list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." });
-
- var people = from p in list
- where p.Age >= 21
- select p;
-
- ws.Cell(7, 6).Value = "From Query";
- ws.Range(7, 6, 7, 8).Merge().AddToNamed("Titles");
- ws.Cell(8, 6).InsertTable(people.AsEnumerable());
-
- // Prepare the style for the titles
- var titlesStyle = wb.Style;
- titlesStyle.Font.Bold = true;
- titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
- titlesStyle.Fill.BackgroundColor = XLColor.Cyan;
-
- // Format all titles in one shot
- wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle;
-
- ws.Columns().AdjustToContents();
-
- wb.SaveAs(filePath);
- }
-
- private class Person
- {
- [XLColumn(Header = "House Street")]
- public String House { get; set; }
-
- public String Name { get; set; }
- public Int32 Age { get; set; }
- }
-
- // Private
- private DataTable GetTable()
- {
- DataTable table = new DataTable();
- table.Columns.Add("Dosage", typeof(int));
- table.Columns.Add("Drug", typeof(string));
- table.Columns.Add("Patient", typeof(string));
- table.Columns.Add("Date", typeof(DateTime));
-
- table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1));
- table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2));
- table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3));
- table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4));
- table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5));
- return table;
- }
-
- // Override
-
- #endregion Methods
- }
-}
diff --git a/ClosedXML_Examples/PivotTables/PivotTables.cs b/ClosedXML_Examples/PivotTables/PivotTables.cs
index fa479da..a94bb10 100644
--- a/ClosedXML_Examples/PivotTables/PivotTables.cs
+++ b/ClosedXML_Examples/PivotTables/PivotTables.cs
@@ -110,6 +110,8 @@
pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum);
pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum);
+ pt.SetRowHeaderCaption("Pastry name");
+
#endregion Different kind of pivot
#region Pivot table with collapsed fields
@@ -162,6 +164,8 @@
pt.Subtotals = XLPivotSubtotals.DoNotShow;
+ pt.SetColumnHeaderCaption("Measures");
+
ptSheet.Columns().AdjustToContents();
#endregion Pivot table with subtotals disabled
diff --git a/ClosedXML_Examples/Ranges/UsingTables.cs b/ClosedXML_Examples/Ranges/UsingTables.cs
deleted file mode 100644
index e5c24b2..0000000
--- a/ClosedXML_Examples/Ranges/UsingTables.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-using System;
-using System.IO;
-using ClosedXML.Excel;
-using System.Linq;
-
-
-namespace ClosedXML_Examples.Ranges
-{
- public class UsingTables : IXLExample
- {
- #region Methods
-
- // Public
- public void Create(String filePath)
- {
- string tempFile = ExampleHelper.GetTempFilePath(filePath);
- try
- {
- new BasicTable().Create(tempFile);
- var wb = new XLWorkbook(tempFile);
- var ws = wb.Worksheet(1);
- ws.Name = "Contacts Table";
- var firstCell = ws.FirstCellUsed();
- var lastCell = ws.LastCellUsed();
- var range = ws.Range(firstCell.Address, lastCell.Address);
- range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes)
-
- // We want to use a theme for table, not the hard coded format of the BasicTable
- range.Clear(XLClearOptions.Formats);
- // Put back the date and number formats
- range.Column(4).Style.NumberFormat.NumberFormatId = 15;
- range.Column(5).Style.NumberFormat.Format = "$ #,##0";
-
- var table = range.CreateTable(); // You can also use range.AsTable() if you want to
- // manipulate the range as a table but don't want
- // to create the table in the worksheet.
-
- // Let's activate the Totals row and add the sum of Income
- table.ShowTotalsRow = true;
- table.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Sum;
- // Just for fun let's add the text "Sum Of Income" to the totals row
- table.Field(0).TotalsRowLabel = "Sum Of Income";
-
- // Copy all the headers
- Int32 columnWithHeaders = lastCell.Address.ColumnNumber + 2;
- Int32 currentRow = table.RangeAddress.FirstAddress.RowNumber;
- ws.Cell(currentRow, columnWithHeaders).Value = "Table Headers";
- foreach (var cell in table.HeadersRow().Cells())
- {
- currentRow++;
- ws.Cell(currentRow, columnWithHeaders).Value = cell.Value;
- }
-
- // Format the headers as a table with a different style and no autofilters
- var htFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithHeaders);
- var htLastCell = ws.Cell(currentRow, columnWithHeaders);
- var headersTable = ws.Range(htFirstCell, htLastCell).CreateTable("Headers");
- headersTable.Theme = XLTableTheme.TableStyleLight10;
- headersTable.ShowAutoFilter = false;
-
- // Add a custom formula to the headersTable
- headersTable.ShowTotalsRow = true;
- headersTable.Field(0).TotalsRowFormulaA1 = "CONCATENATE(\"Count: \", CountA(Headers[Table Headers]))";
-
- // Copy the names
- Int32 columnWithNames = columnWithHeaders + 2;
- currentRow = table.RangeAddress.FirstAddress.RowNumber; // reset the currentRow
- ws.Cell(currentRow, columnWithNames).Value = "Names";
- foreach (var row in table.DataRange.Rows())
- {
- currentRow++;
- var fName = row.Field("FName").GetString(); // Notice how we're calling the cell by field name
- var lName = row.Field("LName").GetString(); // Notice how we're calling the cell by field name
- var name = String.Format("{0} {1}", fName, lName);
- ws.Cell(currentRow, columnWithNames).Value = name;
- }
-
- // Format the names as a table with a different style and no autofilters
- var ntFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithNames);
- var ntLastCell = ws.Cell(currentRow, columnWithNames);
- var namesTable = ws.Range(ntFirstCell, ntLastCell).CreateTable();
- namesTable.Theme = XLTableTheme.TableStyleLight12;
- namesTable.ShowAutoFilter = false;
-
- ws.Columns().AdjustToContents();
- ws.Columns("A,G,I").Width = 3;
-
- wb.SaveAs(filePath);
- }
- finally
- {
- if (File.Exists(tempFile))
- {
- File.Delete(tempFile);
- }
- }
- }
-
- // Private
-
- // Override
-
-
- #endregion
- }
-}
diff --git a/ClosedXML_Examples/Styles/StyleFont.cs b/ClosedXML_Examples/Styles/StyleFont.cs
index 7da4adf..6fed30f 100644
--- a/ClosedXML_Examples/Styles/StyleFont.cs
+++ b/ClosedXML_Examples/Styles/StyleFont.cs
@@ -1,6 +1,5 @@
+using ClosedXML.Excel;
using System;
-using ClosedXML.Excel;
-
namespace ClosedXML_Examples.Styles
{
@@ -23,6 +22,11 @@
ws.Cell(++ro, co).Value = "FontFamilyNumbering - Script";
ws.Cell(ro, co).Style.Font.FontFamilyNumbering = XLFontFamilyNumberingValues.Script;
+ ws.Cell(++ro, co).Value = "FontCharSet - العربية التنضيد";
+ ws.Cell(ro, co).Style
+ .Font.SetFontName("Arabic Typesetting")
+ .Font.SetFontCharSet(XLFontCharSet.Arabic);
+
ws.Cell(++ro, co).Value = "FontName - Stencil";
ws.Cell(ro, co).Style.Font.FontName = "Stencil";
diff --git a/ClosedXML_Examples/Tables/InsertingTables.cs b/ClosedXML_Examples/Tables/InsertingTables.cs
new file mode 100644
index 0000000..176eed1
--- /dev/null
+++ b/ClosedXML_Examples/Tables/InsertingTables.cs
@@ -0,0 +1,111 @@
+using ClosedXML.Attributes;
+using ClosedXML.Excel;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+
+namespace ClosedXML_Examples.Tables
+{
+ public class InsertingTables : IXLExample
+ {
+ #region Methods
+
+ // Public
+ public void Create(String filePath)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.Worksheets.Add("Inserting Tables");
+
+ // From a list of strings
+ var listOfStrings = new List();
+ listOfStrings.Add("House");
+ listOfStrings.Add("Car");
+ ws.Cell(1, 1).Value = "From Strings";
+ ws.Cell(1, 1).AsRange().AddToNamed("Titles");
+ ws.Cell(2, 1).InsertTable(listOfStrings);
+
+ // From a list of arrays
+ var listOfArr = new List();
+ listOfArr.Add(new Int32[] { 1, 2, 3 });
+ listOfArr.Add(new Int32[] { 1 });
+ listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 });
+ ws.Cell(1, 3).Value = "From Arrays";
+ ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles");
+ ws.Cell(2, 3).InsertTable(listOfArr);
+
+ // From a DataTable
+ var dataTable = GetTable();
+ ws.Cell(7, 1).Value = "From DataTable";
+ ws.Range(7, 1, 7, 4).Merge().AddToNamed("Titles");
+ ws.Cell(8, 1).InsertTable(dataTable);
+
+ // From a query
+ var list = new List();
+ list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." });
+ list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." });
+ list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." });
+ list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." });
+
+ var people = from p in list
+ where p.Age >= 21
+ select p;
+
+ ws.Cell(7, 6).Value = "From Query";
+ ws.Range(7, 6, 7, 9).Merge().AddToNamed("Titles");
+ ws.Cell(8, 6).InsertTable(people);
+
+ ws.Cell(15, 6).Value = "From List";
+ ws.Range(15, 6, 15, 9).Merge().AddToNamed("Titles");
+ ws.Cell(16, 6).InsertTable(people);
+
+ // Prepare the style for the titles
+ var titlesStyle = wb.Style;
+ titlesStyle.Font.Bold = true;
+ titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
+ titlesStyle.Fill.BackgroundColor = XLColor.Cyan;
+
+ // Format all titles in one shot
+ wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle;
+
+ ws.Columns().AdjustToContents();
+
+ wb.SaveAs(filePath);
+ }
+ }
+
+ private class Person
+ {
+ [XLColumn(Header = "House Street")]
+ public String House { get; set; }
+
+ public String Name { get; set; }
+ public Int32 Age { get; set; }
+
+ [XLColumn(Header = "Class Type")]
+ public static String ClassType { get { return nameof(Person); } }
+ }
+
+ // Private
+ private DataTable GetTable()
+ {
+ DataTable table = new DataTable();
+ table.Columns.Add("Dosage", typeof(int));
+ table.Columns.Add("Drug", typeof(string));
+ table.Columns.Add("Patient", typeof(string));
+ table.Columns.Add("Date", typeof(DateTime));
+
+ table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1));
+ table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2));
+ table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3));
+ table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4));
+ table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5));
+ return table;
+ }
+
+ // Override
+
+ #endregion Methods
+ }
+}
diff --git a/ClosedXML_Examples/Tables/ResizingTables.cs b/ClosedXML_Examples/Tables/ResizingTables.cs
new file mode 100644
index 0000000..64ad34e
--- /dev/null
+++ b/ClosedXML_Examples/Tables/ResizingTables.cs
@@ -0,0 +1,47 @@
+using ClosedXML.Excel;
+using System;
+using System.Linq;
+
+// TODO: Add example to Wiki
+
+namespace ClosedXML_Examples.Tables
+{
+ public class ResizingTables : IXLExample
+ {
+ public void Create(string filePath)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws1 = wb.AddWorksheet("Sheet1");
+
+ var data1 = Enumerable.Range(1, 10)
+ .Select(i =>
+ new
+ {
+ Index = i,
+ Character = Convert.ToChar(64 + i),
+ String = new String('a', i),
+ Integer = 64 + i
+ });
+
+ var table1 = ws1.Cell("B2").InsertTable(data1, true)
+ .SetShowHeaderRow()
+ .SetShowTotalsRow();
+
+ table1.Fields.First().TotalsRowLabel = "Sum of Integer";
+ table1.Fields.Last().TotalsRowFunction = XLTotalsRowFunction.Sum;
+
+ var ws2 = ws1.CopyTo("Sheet2");
+ var table2 = ws2.Tables.First();
+ table2.Resize(table2.FirstCell(), table2.LastCell().CellLeft().CellAbove(3));
+
+ var ws3 = ws2.CopyTo("Sheet3");
+ var table3 = ws3.Tables.First();
+ table3.Resize(table3.FirstCell().CellLeft(), table3.LastCell().CellRight().CellBelow(1));
+
+ wb.Worksheets.ForEach(ws => ws.Columns().AdjustToContents());
+ wb.SaveAs(filePath);
+ }
+ }
+ }
+}
diff --git a/ClosedXML_Examples/Tables/UsingTables.cs b/ClosedXML_Examples/Tables/UsingTables.cs
new file mode 100644
index 0000000..639a0a0
--- /dev/null
+++ b/ClosedXML_Examples/Tables/UsingTables.cs
@@ -0,0 +1,105 @@
+using ClosedXML.Excel;
+using System;
+using System.IO;
+
+namespace ClosedXML_Examples.Tables
+{
+ public class UsingTables : IXLExample
+ {
+ #region Methods
+
+ // Public
+ public void Create(String filePath)
+ {
+ string tempFile = ExampleHelper.GetTempFilePath(filePath);
+ try
+ {
+ new BasicTable().Create(tempFile);
+ using (var wb = new XLWorkbook(tempFile))
+ {
+ var ws = wb.Worksheet(1);
+ ws.Name = "Contacts Table";
+ var firstCell = ws.FirstCellUsed();
+ var lastCell = ws.LastCellUsed();
+ var range = ws.Range(firstCell.Address, lastCell.Address);
+ range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes)
+
+ // We want to use a theme for table, not the hard coded format of the BasicTable
+ range.Clear(XLClearOptions.Formats);
+ // Put back the date and number formats
+ range.Column(4).Style.NumberFormat.NumberFormatId = 15;
+ range.Column(5).Style.NumberFormat.Format = "$ #,##0";
+
+ var table = range.CreateTable(); // You can also use range.AsTable() if you want to
+ // manipulate the range as a table but don't want
+ // to create the table in the worksheet.
+
+ // Let's activate the Totals row and add the sum of Income
+ table.ShowTotalsRow = true;
+ table.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Sum;
+ // Just for fun let's add the text "Sum Of Income" to the totals row
+ table.Field(0).TotalsRowLabel = "Sum Of Income";
+
+ // Copy all the headers
+ Int32 columnWithHeaders = lastCell.Address.ColumnNumber + 2;
+ Int32 currentRow = table.RangeAddress.FirstAddress.RowNumber;
+ ws.Cell(currentRow, columnWithHeaders).Value = "Table Headers";
+ foreach (var cell in table.HeadersRow().Cells())
+ {
+ currentRow++;
+ ws.Cell(currentRow, columnWithHeaders).Value = cell.Value;
+ }
+
+ // Format the headers as a table with a different style and no autofilters
+ var htFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithHeaders);
+ var htLastCell = ws.Cell(currentRow, columnWithHeaders);
+ var headersTable = ws.Range(htFirstCell, htLastCell).CreateTable("Headers");
+ headersTable.Theme = XLTableTheme.TableStyleLight10;
+ headersTable.ShowAutoFilter = false;
+
+ // Add a custom formula to the headersTable
+ headersTable.ShowTotalsRow = true;
+ headersTable.Field(0).TotalsRowFormulaA1 = "CONCATENATE(\"Count: \", CountA(Headers[Table Headers]))";
+
+ // Copy the names
+ Int32 columnWithNames = columnWithHeaders + 2;
+ currentRow = table.RangeAddress.FirstAddress.RowNumber; // reset the currentRow
+ ws.Cell(currentRow, columnWithNames).Value = "Names";
+ foreach (var row in table.DataRange.Rows())
+ {
+ currentRow++;
+ var fName = row.Field("FName").GetString(); // Notice how we're calling the cell by field name
+ var lName = row.Field("LName").GetString(); // Notice how we're calling the cell by field name
+ var name = String.Format("{0} {1}", fName, lName);
+ ws.Cell(currentRow, columnWithNames).Value = name;
+ }
+
+ // Format the names as a table with a different style and no autofilters
+ var ntFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithNames);
+ var ntLastCell = ws.Cell(currentRow, columnWithNames);
+ var namesTable = ws.Range(ntFirstCell, ntLastCell).CreateTable();
+ namesTable.Theme = XLTableTheme.TableStyleLight12;
+ namesTable.ShowAutoFilter = false;
+
+ ws.Columns().AdjustToContents();
+ ws.Columns("A,G,I").Width = 3;
+
+ wb.SaveAs(filePath);
+ }
+ }
+ finally
+ {
+ if (File.Exists(tempFile))
+ {
+ File.Delete(tempFile);
+ }
+ }
+ }
+
+ // Private
+
+ // Override
+
+ #endregion Methods
+ }
+}
diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj
index a0834a3..08ec404 100644
--- a/ClosedXML_Tests/ClosedXML_Tests.csproj
+++ b/ClosedXML_Tests/ClosedXML_Tests.csproj
@@ -76,7 +76,9 @@
+
+
@@ -85,6 +87,7 @@
+
@@ -172,7 +175,6 @@
-
@@ -222,7 +224,6 @@
-
@@ -292,6 +293,11 @@
+
+
+
+
+
diff --git a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs
index 0760da0..333c347 100644
--- a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs
+++ b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs
@@ -37,6 +37,12 @@
}
[Test]
+ public void CFDataBarNegative()
+ {
+ TestHelper.RunTestExample(@"ConditionalFormatting\CFDataBarNegative.xlsx");
+ }
+
+ [Test]
public void CFEndsWith()
{
TestHelper.RunTestExample(@"ConditionalFormatting\CFEndsWith.xlsx");
@@ -113,5 +119,11 @@
{
TestHelper.RunTestExample(@"ConditionalFormatting\CFMultipleConditions.xlsx");
}
+
+ [Test]
+ public void CFStopIfTrue()
+ {
+ TestHelper.RunTestExample(@"ConditionalFormatting\CFStopIfTrue.xlsx");
+ }
}
}
diff --git a/ClosedXML_Tests/Examples/MiscTests.cs b/ClosedXML_Tests/Examples/MiscTests.cs
index 4f14453..d74a9fc 100644
--- a/ClosedXML_Tests/Examples/MiscTests.cs
+++ b/ClosedXML_Tests/Examples/MiscTests.cs
@@ -133,11 +133,6 @@
TestHelper.RunTestExample(@"Misc\InsertingData.xlsx");
}
- [Test]
- public void InsertingTables()
- {
- TestHelper.RunTestExample(@"Misc\InsertingTables.xlsx");
- }
[Test]
public void LambdaExpressions()
@@ -204,11 +199,11 @@
{
TestHelper.RunTestExample(@"Misc\WorkbookProperties.xlsx");
}
-
+
[Test]
public void WorkbookProtection()
{
TestHelper.RunTestExample(@"Misc\WorkbookProtection.xlsx");
}
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML_Tests/Examples/RangesTests.cs b/ClosedXML_Tests/Examples/RangesTests.cs
index fe3e1e2..59cd62b 100644
--- a/ClosedXML_Tests/Examples/RangesTests.cs
+++ b/ClosedXML_Tests/Examples/RangesTests.cs
@@ -99,12 +99,6 @@
}
[Test]
- public void UsingTables()
- {
- TestHelper.RunTestExample(@"Ranges\UsingTables.xlsx");
- }
-
- [Test]
public void AddingRowToTables()
{
TestHelper.RunTestExample(@"Ranges\AddingRowToTables.xlsx");
@@ -116,4 +110,4 @@
TestHelper.RunTestExample(@"Ranges\WalkingRanges.xlsx");
}
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML_Tests/Examples/TablesTests.cs b/ClosedXML_Tests/Examples/TablesTests.cs
new file mode 100644
index 0000000..934bf65
--- /dev/null
+++ b/ClosedXML_Tests/Examples/TablesTests.cs
@@ -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(@"Tables\InsertingTables.xlsx");
+ }
+
+ [Test]
+ public void ResizingTables()
+ {
+ TestHelper.RunTestExample(@"Tables\ResizingTables.xlsx");
+ }
+
+ [Test]
+ public void UsingTables()
+ {
+ TestHelper.RunTestExample(@"Tables\UsingTables.xlsx");
+ }
+ }
+}
diff --git a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs
index c630f5a..9a4356a 100644
--- a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs
+++ b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs
@@ -1,8 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
using ClosedXML.Excel;
using NUnit.Framework;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
namespace ClosedXML_Tests
{
@@ -29,7 +30,7 @@
listOfArr.Add(6);
table.DataRange.InsertRowsBelow(listOfArr.Count - table.DataRange.RowCount());
- table.DataRange.FirstCell().InsertData(listOfArr.AsEnumerable());
+ table.DataRange.FirstCell().InsertData(listOfArr);
Assert.AreEqual("A1:A5", table.AutoFilter.Range.RangeAddress.ToStringRelative());
}
@@ -72,5 +73,57 @@
ws.AutoFilter.Clear();
Assert.That(!ws.AutoFilter.Enabled);
}
+
+ [Test]
+ public void CanClearAutoFilter2()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.Worksheets.Add("AutoFilter");
+ ws.Cell("A1").Value = "Names";
+ ws.Cell("A2").Value = "John";
+ ws.Cell("A3").Value = "Hank";
+ ws.Cell("A4").Value = "Dagny";
+
+ ws.SetAutoFilter(false);
+ Assert.That(!ws.AutoFilter.Enabled);
+
+ ws.RangeUsed().SetAutoFilter();
+ Assert.That(ws.AutoFilter.Enabled);
+
+ ws.RangeUsed().SetAutoFilter(false);
+ Assert.That(!ws.AutoFilter.Enabled);
+ }
+ }
+
+ [Test]
+ public void CanCopyAutoFilterToNewSheetOnNewWorkbook()
+ {
+ using (var ms1 = new MemoryStream())
+ using (var ms2 = new MemoryStream())
+ {
+ using (var wb1 = new XLWorkbook())
+ using (var wb2 = new XLWorkbook())
+ {
+ var ws = wb1.Worksheets.Add("AutoFilter");
+ ws.Cell("A1").Value = "Names";
+ ws.Cell("A2").Value = "John";
+ ws.Cell("A3").Value = "Hank";
+ ws.Cell("A4").Value = "Dagny";
+
+ ws.RangeUsed().SetAutoFilter();
+
+ wb1.SaveAs(ms1);
+
+ ws.CopyTo(wb2, ws.Name);
+ wb2.SaveAs(ms2);
+ }
+
+ using (var wb2 = new XLWorkbook(ms2))
+ {
+ Assert.IsTrue(wb2.Worksheets.First().AutoFilter.Enabled);
+ }
+ }
+ }
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML_Tests/Excel/CalcEngine/CalcEngineExceptionTests.cs b/ClosedXML_Tests/Excel/CalcEngine/CalcEngineExceptionTests.cs
new file mode 100644
index 0000000..b1be35f
--- /dev/null
+++ b/ClosedXML_Tests/Excel/CalcEngine/CalcEngineExceptionTests.cs
@@ -0,0 +1,29 @@
+using ClosedXML.Excel;
+using ClosedXML.Excel.CalcEngine.Exceptions;
+using NUnit.Framework;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading;
+
+namespace ClosedXML_Tests.Excel.CalcEngine
+{
+ [TestFixture]
+ public class CalcEngineExceptionTests
+ {
+ [OneTimeSetUp]
+ public void SetCultureInfo()
+ {
+ Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
+ }
+
+ [Test]
+ public void InvalidCharNumber()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("CHAR(-2)"));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("CHAR(270)"));
+ }
+ }
+}
diff --git a/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs b/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs
index 93ad203..19de6ca 100644
--- a/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs
+++ b/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs
@@ -158,6 +158,17 @@
}
#endregion IsLogical Tests
+ [Test]
+ public void IsNA()
+ {
+ object actual;
+ actual = XLWorkbook.EvaluateExpr("ISNA(#N/A)");
+ Assert.AreEqual(true, actual);
+
+ actual = XLWorkbook.EvaluateExpr("ISNA(#REF!)");
+ Assert.AreEqual(false, actual);
+ }
+
#region IsNotText Tests
[Test]
@@ -288,6 +299,30 @@
}
#endregion IsOdd Test
+ [Test]
+ public void IsRef()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet");
+ ws.Cell("A1").Value = "123";
+
+ ws.Cell("B1").FormulaA1 = "ISREF(A1)";
+ ws.Cell("B2").FormulaA1 = "ISREF(5)";
+ ws.Cell("B3").FormulaA1 = "ISREF(YEAR(TODAY()))";
+
+ bool actual;
+ actual = ws.Cell("B1").GetValue();
+ Assert.AreEqual(true, actual);
+
+ actual = ws.Cell("B2").GetValue();
+ Assert.AreEqual(false, actual);
+
+ actual = ws.Cell("B3").GetValue();
+ Assert.AreEqual(false, actual);
+ }
+ }
+
#region IsText Tests
[Test]
diff --git a/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs
index f416784..a18e509 100644
--- a/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs
+++ b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs
@@ -1,4 +1,5 @@
using ClosedXML.Excel;
+using ClosedXML.Excel.CalcEngine.Exceptions;
using NUnit.Framework;
using System;
@@ -122,11 +123,11 @@
[Test]
public void Vlookup_Exceptions()
{
- Assert.That(() => workbook.Evaluate(@"=VLOOKUP("""",Data!$B$2:$I$71,3,FALSE)"), Throws.TypeOf());
- Assert.That(() => workbook.Evaluate(@"=VLOOKUP(50,Data!$B$2:$I$71,3,FALSE)"), Throws.TypeOf());
- Assert.That(() => workbook.Evaluate(@"=VLOOKUP(20,Data!$B$2:$I$71,9,FALSE)"), Throws.TypeOf());
+ Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP("""",Data!$B$2:$I$71,3,FALSE)"));
+ Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP(50,Data!$B$2:$I$71,3,FALSE)"));
+ Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP(-1,Data!$B$2:$I$71,2,TRUE)"));
- Assert.That(() => workbook.Evaluate(@"=VLOOKUP(-1,Data!$B$2:$I$71,9,TRUE)"), Throws.TypeOf());
+ Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP(20,Data!$B$2:$I$71,9,FALSE)"));
}
}
}
diff --git a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs
index 5012bb5..c3cd7ce 100644
--- a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs
+++ b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs
@@ -1,6 +1,9 @@
using ClosedXML.Excel;
+using ClosedXML.Excel.CalcEngine.Exceptions;
using NUnit.Framework;
using System;
+using System.Globalization;
+using System.Linq;
namespace ClosedXML_Tests.Excel.CalcEngine
{
@@ -9,6 +12,100 @@
{
private readonly double tolerance = 1e-10;
+ [TestCase(4, 3, 20)]
+ [TestCase(10, 3, 220)]
+ [TestCase(0, 0, 1)]
+ public void Combina_CalculatesCorrectValues(int number, int chosen, int expectedResult)
+ {
+ var actualResult = XLWorkbook.EvaluateExpr($"COMBINA({number}, {chosen})");
+ Assert.AreEqual(expectedResult, (long)actualResult);
+ }
+
+ [Theory]
+ public void Combina_Returns1WhenChosenIs0([Range(0, 10)]int number)
+ {
+ Combina_CalculatesCorrectValues(number, 0, 1);
+ }
+
+ [TestCase(4.23, 3, 20)]
+ [TestCase(10.4, 3.14, 220)]
+ [TestCase(0, 0.4, 1)]
+ public void Combina_TruncatesNumbersCorrectly(double number, double chosen, int expectedResult)
+ {
+ var actualResult = XLWorkbook.EvaluateExpr(string.Format(
+ @"COMBINA({0}, {1})",
+ number.ToString(CultureInfo.InvariantCulture),
+ chosen.ToString(CultureInfo.InvariantCulture)));
+
+ Assert.AreEqual(expectedResult, (long)actualResult);
+ }
+
+ [TestCase(-1, 2)]
+ [TestCase(-3, -2)]
+ [TestCase(2, -2)]
+ public void Combina_ThrowsNumExceptionOnInvalidValues(int number, int chosen)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"COMBINA({0}, {1})",
+ number.ToString(CultureInfo.InvariantCulture),
+ chosen.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase(1, 0.642092616)]
+ [TestCase(2, -0.457657554)]
+ [TestCase(3, -7.015252551)]
+ [TestCase(4, 0.863691154)]
+ [TestCase(5, -0.295812916)]
+ [TestCase(6, -3.436353004)]
+ [TestCase(7, 1.147515422)]
+ [TestCase(8, -0.147065064)]
+ [TestCase(9, -2.210845411)]
+ [TestCase(10, 1.542351045)]
+ [TestCase(11, -0.004425741)]
+ [TestCase(Math.PI * 0.5, 0)]
+ [TestCase(45, 0.617369624)]
+ [TestCase(-2, 0.457657554)]
+ [TestCase(-3, 7.015252551)]
+ public void Cot(double input, double expected)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"COT({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expected, actual, tolerance * 10.0);
+ }
+
+ [Test]
+ public void Cot_Input0()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("COT(0)"));
+ }
+
+ [TestCase("FF", 16, 255)]
+ [TestCase("111", 2, 7)]
+ [TestCase("zap", 36, 45745)]
+ public void Decimal(string inputString, int radix, int expectedResult)
+ {
+ var actualResult = XLWorkbook.EvaluateExpr($"DECIMAL(\"{inputString}\", {radix})");
+ Assert.AreEqual(expectedResult, actualResult);
+ }
+
+ [Test]
+ public void Decimal_ZeroIsZeroInAnyRadix([Range(2, 36)] int radix)
+ {
+ Assert.AreEqual(0, XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})"));
+ }
+
+ [Theory]
+ public void Decimal_ReturnsErrorForRadiansGreater36([Range(37, 255)] int radix)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})"));
+ }
+
+ [Theory]
+ public void Decimal_ReturnsErrorForRadiansSmaller2([Range(-5, 1)] int radix)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})"));
+ }
+
[Test]
public void Floor()
{
@@ -119,5 +216,54 @@
actual = (double)XLWorkbook.EvaluateExpr(@"MOD(6.2, 1.1)");
Assert.AreEqual(0.7, actual, tolerance);
}
+
+ [Test]
+ public void SumProduct()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ ws.FirstCell().Value = Enumerable.Range(1, 10);
+ ws.FirstCell().CellRight().Value = Enumerable.Range(1, 10).Reverse();
+
+ Assert.AreEqual(2, ws.Evaluate("SUMPRODUCT(A2)"));
+ Assert.AreEqual(55, ws.Evaluate("SUMPRODUCT(A1:A10)"));
+ Assert.AreEqual(220, ws.Evaluate("SUMPRODUCT(A1:A10, B1:B10)"));
+
+ Assert.Throws(() => ws.Evaluate("SUMPRODUCT(A1:A10, B1:B5)"));
+ }
+ }
+
+ [TestCase(1, 0.850918128)]
+ [TestCase(2, 0.275720565)]
+ [TestCase(3, 0.09982157)]
+ [TestCase(4, 0.03664357)]
+ [TestCase(5, 0.013476506)]
+ [TestCase(6, 0.004957535)]
+ [TestCase(7, 0.001823765)]
+ [TestCase(8, 0.000670925)]
+ [TestCase(9, 0.00024682)]
+ [TestCase(10, 0.000090799859712122200000)]
+ [TestCase(11, 0.0000334034)]
+ public void CSch_CalculatesCorrectValues(double input, double expectedOutput)
+ {
+ Assert.AreEqual(expectedOutput, (double)XLWorkbook.EvaluateExpr($@"CSCH({input})"), 0.000000001);
+ }
+
+ [Test]
+ public void Csch_ReturnsDivisionByZeroErrorOnInput0()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("CSCH(0)"));
+ }
+
+ [TestCase(8.9, 8)]
+ [TestCase(-8.9, -9)]
+ public void Int(double input, double expected)
+ {
+ var actual = XLWorkbook.EvaluateExpr(string.Format(@"INT({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expected, actual);
+
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs b/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs
index efb58d3..59d0a59 100644
--- a/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs
+++ b/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs
@@ -1,5 +1,6 @@
using ClosedXML.Excel;
using ClosedXML.Excel.CalcEngine;
+using ClosedXML.Excel.CalcEngine.Exceptions;
using NUnit.Framework;
using System;
using System.Globalization;
@@ -20,13 +21,13 @@
[Test]
public void Char_Empty_Input_String()
{
- Assert.That(() => XLWorkbook.EvaluateExpr(@"Char("""")"), Throws.TypeOf());
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(@"Char("""")"));
}
[Test]
public void Char_Input_Too_Large()
{
- Assert.That(() => XLWorkbook.EvaluateExpr(@"Char(9797)"), Throws.TypeOf());
+ Assert.Throws< CellValueException>(() => XLWorkbook.EvaluateExpr(@"Char(9797)"));
}
[Test]
diff --git a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs
index 2fb6166..161f17a 100644
--- a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs
+++ b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs
@@ -59,7 +59,7 @@
IXLCell cell = ws.Cell("A1");
var doubleList = new List { 1.0 / 0.0 };
- cell.Value = doubleList.AsEnumerable();
+ cell.Value = doubleList;
Assert.AreNotEqual(XLCellValues.Number, cell.DataType);
}
@@ -70,7 +70,7 @@
IXLCell cell = ws.Cell("A1");
var doubleList = new List { 0.0 / 0.0 };
- cell.Value = doubleList.AsEnumerable();
+ cell.Value = doubleList;
Assert.AreNotEqual(XLCellValues.Number, cell.DataType);
}
@@ -235,7 +235,6 @@
Assert.IsFalse(success);
}
-
[Test]
public void TryGetValue_DateTime_BadString2()
{
@@ -426,5 +425,90 @@
Assert.AreEqual(string.Empty, cell.Value);
}
}
+
+ [Test]
+ public void CurrentRegion()
+ {
+ // Partially based on sample in https://github.com/ClosedXML/ClosedXML/issues/120
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ ws.Cell("B1").SetValue("x")
+ .CellBelow().SetValue("x")
+ .CellBelow().SetValue("x");
+
+ ws.Cell("C1").SetValue("x")
+ .CellBelow().SetValue("x")
+ .CellBelow().SetValue("x");
+
+ //Deliberately D2
+ ws.Cell("D2").SetValue("x")
+ .CellBelow().SetValue("x");
+
+ ws.Cell("G1").SetValue("x")
+ .CellBelow() // skip a cell
+ .CellBelow().SetValue("x")
+ .CellBelow().SetValue("x");
+
+ // Deliberately H2
+ ws.Cell("H2").SetValue("x")
+ .CellBelow().SetValue("x")
+ .CellBelow().SetValue("x");
+
+ // A diagonal
+ ws.Cell("E8").SetValue("x")
+ .CellBelow().CellRight().SetValue("x")
+ .CellBelow().CellRight().SetValue("x")
+ .CellBelow().CellRight().SetValue("x")
+ .CellBelow().CellRight().SetValue("x");
+
+ Assert.AreEqual("A10:A10", ws.Cell("A10").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("B5:B5", ws.Cell("B5").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("P1:P1", ws.Cell("P1").CurrentRegion.RangeAddress.ToString());
+
+ Assert.AreEqual("B1:D3", ws.Cell("D3").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("B1:D4", ws.Cell("D4").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("B1:E4", ws.Cell("E4").CurrentRegion.RangeAddress.ToString());
+
+ foreach (var c in ws.Range("B1:D3").Cells())
+ {
+ Assert.AreEqual("B1:D3", c.CurrentRegion.RangeAddress.ToString());
+ }
+
+ foreach (var c in ws.Range("A1:A3").Cells())
+ {
+ Assert.AreEqual("A1:D3", c.CurrentRegion.RangeAddress.ToString());
+ }
+
+ Assert.AreEqual("A1:D4", ws.Cell("A4").CurrentRegion.RangeAddress.ToString());
+
+ foreach (var c in ws.Range("E1:E3").Cells())
+ {
+ Assert.AreEqual("B1:E3", c.CurrentRegion.RangeAddress.ToString());
+ }
+ Assert.AreEqual("B1:E4", ws.Cell("E4").CurrentRegion.RangeAddress.ToString());
+
+ //// SECOND REGION
+ foreach (var c in ws.Range("F1:F4").Cells())
+ {
+ Assert.AreEqual("F1:H4", c.CurrentRegion.RangeAddress.ToString());
+ }
+ Assert.AreEqual("F1:H5", ws.Cell("F5").CurrentRegion.RangeAddress.ToString());
+
+ //// DIAGONAL
+ Assert.AreEqual("E8:I12", ws.Cell("E8").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("E8:I12", ws.Cell("F9").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("E8:I12", ws.Cell("G10").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("E8:I12", ws.Cell("H11").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("E8:I12", ws.Cell("I12").CurrentRegion.RangeAddress.ToString());
+
+ Assert.AreEqual("E8:I12", ws.Cell("G9").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("E8:I12", ws.Cell("F10").CurrentRegion.RangeAddress.ToString());
+
+ Assert.AreEqual("D7:I12", ws.Cell("D7").CurrentRegion.RangeAddress.ToString());
+ Assert.AreEqual("E8:J13", ws.Cell("J13").CurrentRegion.RangeAddress.ToString());
+ }
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs
index 4d0329f..686c1f4 100644
--- a/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs
+++ b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs
@@ -9,13 +9,14 @@
[Test]
public void ToStringTest()
{
- IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1");
+ 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));
@@ -39,6 +40,7 @@
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));
diff --git a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs
index a06902e..0cd0edf 100644
--- a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs
+++ b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs
@@ -260,5 +260,40 @@
Assert.Throws(() => picture.Name = "picTURE 1");
}
}
+
+ [Test]
+ public void HandleDuplicatePictureIdsAcrossWorksheets()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws1 = wb.AddWorksheet("Sheet1");
+ var ws2 = wb.AddWorksheet("Sheet2");
+
+ using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png"))
+ {
+ (ws1 as XLWorksheet).AddPicture(stream, "Picture 1", 2);
+ (ws1 as XLWorksheet).AddPicture(stream, "Picture 2", 3);
+
+ //Internal method - used for loading files
+ var pic = (ws2 as XLWorksheet).AddPicture(stream, "Picture 1", 2)
+ .WithPlacement(XLPicturePlacement.FreeFloating)
+ .MoveTo(220, 155) as XLPicture;
+
+ var id = pic.Id;
+
+ pic.Id = id;
+ Assert.AreEqual(id, pic.Id);
+
+ pic.Id = 3;
+ Assert.AreEqual(3, pic.Id);
+
+ pic.Id = id;
+
+ var pic2 = (ws2 as XLWorksheet).AddPicture(stream, "Picture 2", 3)
+ .WithPlacement(XLPicturePlacement.FreeFloating)
+ .MoveTo(440, 300) as XLPicture;
+ }
+ }
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/Misc/FormulaTests.cs b/ClosedXML_Tests/Excel/Misc/FormulaTests.cs
index 16ac2a1..3ff4c55 100644
--- a/ClosedXML_Tests/Excel/Misc/FormulaTests.cs
+++ b/ClosedXML_Tests/Excel/Misc/FormulaTests.cs
@@ -1,4 +1,5 @@
using ClosedXML.Excel;
+using ClosedXML.Excel.CalcEngine.Exceptions;
using NUnit.Framework;
using System;
using System.Linq;
@@ -173,5 +174,17 @@
actual = XLWorkbook.EvaluateExpr("+MID(\"This is a test\", 6, 2)");
Assert.AreEqual("is", actual);
}
+
+ [Test]
+ public void FormulasWithErrors()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#REF!)"));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#VALUE!)"));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#DIV/0!)"));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#NAME?)"));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#N/A)"));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#NULL!)"));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#NUM!)"));
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs b/ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs
new file mode 100644
index 0000000..95b2431
--- /dev/null
+++ b/ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs
@@ -0,0 +1,32 @@
+using ClosedXML.Excel;
+using NUnit.Framework;
+
+namespace ClosedXML_Tests.Excel.Misc
+{
+ [TestFixture]
+ public class HyperlinkTests
+ {
+ [Test]
+ public void TestHyperlinks()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws1 = wb.Worksheets.Add("Sheet1");
+ var ws2 = wb.Worksheets.Add("Sheet2");
+
+ var targetCell = ws2.Cell("A1");
+ var targetRange = ws2.Range("A1", "B1");
+
+ var linkCell1 = ws1.Cell("A1");
+ linkCell1.Value = "Link to IXLCell";
+ linkCell1.Hyperlink = new XLHyperlink(targetCell);
+ Assert.AreEqual("Sheet2!A1", linkCell1.Hyperlink.InternalAddress);
+
+ var linkRange1 = ws1.Cell("A2");
+ linkRange1.Value = "Link to IXLRangeBase";
+ linkRange1.Hyperlink = new XLHyperlink(targetRange);
+ Assert.AreEqual("Sheet2!A1:B1", linkRange1.Hyperlink.InternalAddress);
+ }
+ }
+ }
+}
diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs
index 669e811..c103c6e 100644
--- a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs
+++ b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs
@@ -13,6 +13,7 @@
IXLRangeAddress address = ws.Cell(1, 1).AsRange().RangeAddress;
Assert.AreEqual("A1:A1", address.ToString());
+ Assert.AreEqual("Sheet1!R1C1:R1C1", address.ToString(XLReferenceStyle.R1C1, true));
Assert.AreEqual("A1:A1", address.ToStringRelative());
Assert.AreEqual("Sheet1!A1:A1", address.ToStringRelative(true));
@@ -33,6 +34,7 @@
IXLRangeAddress address = ws.Cell(1, 1).AsRange().RangeAddress;
Assert.AreEqual("A1:A1", address.ToString());
+ Assert.AreEqual("'Sheet 1'!R1C1:R1C1", address.ToString(XLReferenceStyle.R1C1, true));
Assert.AreEqual("A1:A1", address.ToStringRelative());
Assert.AreEqual("'Sheet 1'!A1:A1", address.ToStringRelative(true));
diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs
index 348b213..28a7b6f 100644
--- a/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs
+++ b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs
@@ -1,7 +1,7 @@
-using System;
-using System.Linq;
using ClosedXML.Excel;
using NUnit.Framework;
+using System;
+using System.Linq;
namespace ClosedXML_Tests
{
@@ -106,7 +106,7 @@
IXLRange namedRange = wb.Range("FNameColumn");
Assert.AreEqual(3, namedRange.Cells().Count());
Assert.IsTrue(
- namedRange.CellsUsed().Select(cell => cell.GetString()).SequenceEqual(new[] {"John", "Hank", "Dagny"}));
+ namedRange.CellsUsed().Select(cell => cell.GetString()).SequenceEqual(new[] { "John", "Hank", "Dagny" }));
}
[Test]
@@ -184,7 +184,119 @@
// memoryStream.Close();
// }
-
//}
+
+ [Test]
+ public void GrowRange()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+ Assert.AreEqual("A1:B2", ws.Cell("A1").AsRange().Grow().RangeAddress.ToString());
+ Assert.AreEqual("A1:B3", ws.Cell("A2").AsRange().Grow().RangeAddress.ToString());
+ Assert.AreEqual("A1:C2", ws.Cell("B1").AsRange().Grow().RangeAddress.ToString());
+
+ Assert.AreEqual("E4:G6", ws.Cell("F5").AsRange().Grow().RangeAddress.ToString());
+ Assert.AreEqual("D3:H7", ws.Cell("F5").AsRange().Grow(2).RangeAddress.ToString());
+ Assert.AreEqual("A1:DB105", ws.Cell("F5").AsRange().Grow(100).RangeAddress.ToString());
+ }
+ }
+
+ [Test]
+ public void ShrinkRange()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+ Assert.Null(ws.Cell("A1").AsRange().Shrink());
+ Assert.Null(ws.Range("B2:C3").Shrink());
+ Assert.AreEqual("C3:C3", ws.Range("B2:D4").Shrink().RangeAddress.ToString());
+ Assert.AreEqual("K11:P16", ws.Range("A1:Z26").Shrink(10).RangeAddress.ToString());
+
+ // Grow and shrink back
+ Assert.AreEqual("Z26:Z26", ws.Cell("Z26").AsRange().Grow(10).Shrink(10).RangeAddress.ToString());
+ }
+ }
+
+ [Test]
+ public void Intersection()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ Assert.AreEqual("D9:G11", ws.Range("B9:I11").Intersection(ws.Range("D4:G16")).RangeAddress.ToString());
+ Assert.AreEqual("E9:G11", ws.Range("E9:I11").Intersection(ws.Range("D4:G16")).RangeAddress.ToString());
+ Assert.AreEqual("E9:E9", ws.Cell("E9").AsRange().Intersection(ws.Range("D4:G16")).RangeAddress.ToString());
+ Assert.AreEqual("E9:E9", ws.Range("D4:G16").Intersection(ws.Cell("E9").AsRange()).RangeAddress.ToString());
+
+ Assert.Null(ws.Cell("A1").AsRange().Intersection(ws.Cell("C3").AsRange()));
+
+ Assert.Null(ws.Range("A1:C3").Intersection(null));
+
+ var otherWs = wb.AddWorksheet("Sheet2");
+ Assert.Null(ws.Intersection(otherWs));
+ Assert.Null(ws.Cell("A1").AsRange().Intersection(otherWs.Cell("A2").AsRange()));
+ }
+ }
+
+ [Test]
+ public void Union()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ Assert.AreEqual(64, ws.Range("B9:I11").Union(ws.Range("D4:G16")).Count());
+ Assert.AreEqual(58, ws.Range("E9:I11").Union(ws.Range("D4:G16")).Count());
+ Assert.AreEqual(52, ws.Cell("E9").AsRange().Union(ws.Range("D4:G16")).Count());
+ Assert.AreEqual(52, ws.Range("D4:G16").Union(ws.Cell("E9").AsRange()).Count());
+
+ Assert.AreEqual(2, ws.Cell("A1").AsRange().Union(ws.Cell("C3").AsRange()).Count());
+
+ Assert.AreEqual(9, ws.Range("A1:C3").Union(null).Count());
+
+ var otherWs = wb.AddWorksheet("Sheet2");
+ Assert.False(ws.Union(otherWs).Any());
+ Assert.False(ws.Cell("A1").AsRange().Union(otherWs.Cell("A2").AsRange()).Any());
+ }
+ }
+
+ [Test]
+ public void Difference()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ Assert.AreEqual(12, ws.Range("B9:I11").Difference(ws.Range("D4:G16")).Count());
+ Assert.AreEqual(6, ws.Range("E9:I11").Difference(ws.Range("D4:G16")).Count());
+ Assert.AreEqual(0, ws.Cell("E9").AsRange().Difference(ws.Range("D4:G16")).Count());
+ Assert.AreEqual(51, ws.Range("D4:G16").Difference(ws.Cell("E9").AsRange()).Count());
+
+ Assert.AreEqual(1, ws.Cell("A1").AsRange().Difference(ws.Cell("C3").AsRange()).Count());
+
+ Assert.AreEqual(9, ws.Range("A1:C3").Difference(null).Count());
+
+ var otherWs = wb.AddWorksheet("Sheet2");
+ Assert.False(ws.Difference(otherWs).Any());
+ Assert.False(ws.Cell("A1").AsRange().Difference(otherWs.Cell("A2").AsRange()).Any());
+ }
+ }
+
+ [Test]
+ public void SurroundingCells()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ Assert.AreEqual(3, ws.FirstCell().AsRange().SurroundingCells().Count());
+ Assert.AreEqual(8, ws.Cell("C3").AsRange().SurroundingCells().Count());
+ Assert.AreEqual(16, ws.Range("C3:D6").AsRange().SurroundingCells().Count());
+
+ Assert.AreEqual(0, ws.Range("C3:D6").AsRange().SurroundingCells(c => !c.IsEmpty()).Count());
+ }
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs b/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs
index 326340b..87ab21a 100644
--- a/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs
+++ b/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs
@@ -2,7 +2,6 @@
using NUnit.Framework;
using System;
using System.Data;
-using System.Linq;
namespace ClosedXML_Tests.Excel
{
@@ -24,7 +23,7 @@
}
ws.Column(1).Style.NumberFormat.Format = "yy-MM-dd";
- ws.Cell("A1").InsertData(table.AsEnumerable());
+ ws.Cell("A1").InsertData(table);
Assert.AreEqual("yy-MM-dd", ws.Cell("A5").Style.DateFormat.Format);
ws.Row(1).Style.NumberFormat.Format = "yy-MM-dd";
diff --git a/ClosedXML_Tests/Excel/Tables/TablesTests.cs b/ClosedXML_Tests/Excel/Tables/TablesTests.cs
index 1a35952..9d30ab8 100644
--- a/ClosedXML_Tests/Excel/Tables/TablesTests.cs
+++ b/ClosedXML_Tests/Excel/Tables/TablesTests.cs
@@ -52,6 +52,20 @@
}
[Test]
+ public void PreventAddingOfEmptyDataTable()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ var dt = new DataTable();
+ var table = ws.FirstCell().InsertTable(dt);
+
+ Assert.AreEqual(null, table);
+ }
+ }
+
+ [Test]
public void CanSaveTableCreatedFromSingleRow()
{
using (var wb = new XLWorkbook())
@@ -133,7 +147,7 @@
DataRow dr = dt.NewRow();
dr[columnName] = "some text";
dt.Rows.Add(dr);
- ws.Cell(1, 1).InsertTable(dt.AsEnumerable());
+ ws.Cell(1, 1).InsertTable(dt);
IXLTable table1 = ws.Table(0);
string fieldName1 = table1.Field(0).Name;
@@ -451,5 +465,201 @@
Assert.AreEqual(2, table.Fields.Last().Index);
}
}
+
+ [Test]
+ public void OverlappingTablesThrowsException()
+ {
+ var dt = new DataTable("sheet1");
+ dt.Columns.Add("col1", typeof(string));
+ dt.Columns.Add("col2", typeof(double));
+
+ using (var wb = new XLWorkbook())
+ {
+ IXLWorksheet ws = wb.AddWorksheet("Sheet1");
+ ws.FirstCell().InsertTable(dt, true);
+ Assert.Throws(() => ws.FirstCell().CellRight().InsertTable(dt, true));
+ }
+ }
+
+ [Test]
+ public void OverwritingTableTotalsRow()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ var data1 = Enumerable.Range(1, 10)
+ .Select(i =>
+ new
+ {
+ Index = i,
+ Character = Convert.ToChar(64 + i),
+ String = new String('a', i)
+ });
+
+ var table = ws.FirstCell().InsertTable(data1, true)
+ .SetShowHeaderRow()
+ .SetShowTotalsRow();
+ table.Fields.First().TotalsRowFunction = XLTotalsRowFunction.Sum;
+
+ var data2 = Enumerable.Range(1, 20)
+ .Select(i =>
+ new
+ {
+ Index = i,
+ Character = Convert.ToChar(64 + i),
+ String = new String('b', i),
+ Int = 64 + i
+ });
+
+ ws.FirstCell().CellBelow().InsertData(data2);
+
+ table.Fields.ForEach(f => Assert.AreEqual(XLTotalsRowFunction.None, f.TotalsRowFunction));
+
+ Assert.AreEqual("11", table.Field(0).TotalsRowLabel);
+ Assert.AreEqual("K", table.Field(1).TotalsRowLabel);
+ Assert.AreEqual("bbbbbbbbbbb", table.Field(2).TotalsRowLabel);
+ }
+ }
+
+ [Test]
+ public void CanResizeTable()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ var data1 = Enumerable.Range(1, 10)
+ .Select(i =>
+ new
+ {
+ Index = i,
+ Character = Convert.ToChar(64 + i),
+ String = new String('a', i)
+ });
+
+ var table = ws.FirstCell().InsertTable(data1, true)
+ .SetShowHeaderRow()
+ .SetShowTotalsRow();
+ table.Fields.First().TotalsRowFunction = XLTotalsRowFunction.Sum;
+
+ var data2 = Enumerable.Range(1, 10)
+ .Select(i =>
+ new
+ {
+ Index = i,
+ Character = Convert.ToChar(64 + i),
+ String = new String('b', i),
+ Integer = 64 + i
+ });
+
+ ws.FirstCell().CellBelow().InsertData(data2);
+ table.Resize(table.FirstCell().Address, table.AsRange().LastCell().CellRight().Address);
+
+ Assert.AreEqual(4, table.Fields.Count());
+
+ Assert.AreEqual("Column4", table.Field(3).Name);
+
+ ws.Cell("D1").Value = "Integer";
+ Assert.AreEqual("Integer", table.Field(3).Name);
+ }
+ }
+
+ [Test]
+ public void TableAsDynamicEnumerable()
+ {
+ var l = new List()
+ {
+ new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 },
+ new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 }
+ };
+
+ using (var wb = new XLWorkbook())
+ {
+ IXLWorksheet ws = wb.AddWorksheet("Sheet1");
+ var table = ws.FirstCell().InsertTable(l);
+
+ foreach (var d in table.AsDynamicEnumerable())
+ {
+ Assert.DoesNotThrow(() =>
+ {
+ object value;
+ value = d.FirstColumn;
+ value = d.SecondColumn;
+ value = d.UnOrderedColumn;
+ value = d.SomeFieldNotProperty;
+ });
+ }
+ }
+ }
+
+ [Test]
+ public void TableAsDotNetDataTable()
+ {
+ var l = new List()
+ {
+ new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 },
+ new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 }
+ };
+
+ using (var wb = new XLWorkbook())
+ {
+ IXLWorksheet ws = wb.AddWorksheet("Sheet1");
+ var table = ws.FirstCell().InsertTable(l).AsNativeDataTable();
+
+ Assert.AreEqual(4, table.Columns.Count);
+ Assert.AreEqual("FirstColumn", table.Columns[0].ColumnName);
+ Assert.AreEqual("SecondColumn", table.Columns[1].ColumnName);
+ Assert.AreEqual("SomeFieldNotProperty", table.Columns[2].ColumnName);
+ Assert.AreEqual("UnOrderedColumn", table.Columns[3].ColumnName);
+
+ Assert.AreEqual(typeof(String), table.Columns[0].DataType);
+ Assert.AreEqual(typeof(String), table.Columns[1].DataType);
+ Assert.AreEqual(typeof(Double), table.Columns[2].DataType);
+ Assert.AreEqual(typeof(Double), table.Columns[3].DataType);
+
+ var dr = table.Rows[0];
+ Assert.AreEqual("b", dr["FirstColumn"]);
+ Assert.AreEqual("a", dr["SecondColumn"]);
+ Assert.AreEqual(4, dr["SomeFieldNotProperty"]);
+ Assert.AreEqual(999, dr["UnOrderedColumn"]);
+
+ dr = table.Rows[1];
+ Assert.AreEqual("d", dr["FirstColumn"]);
+ Assert.AreEqual("c", dr["SecondColumn"]);
+ Assert.AreEqual(5, dr["SomeFieldNotProperty"]);
+ Assert.AreEqual(777, dr["UnOrderedColumn"]);
+ }
+ }
+
+ [Test]
+ public void TestTableCellTypes()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ var data1 = Enumerable.Range(1, 10)
+ .Select(i =>
+ new
+ {
+ Index = i,
+ Character = Convert.ToChar(64 + i),
+ String = new String('a', i)
+ });
+
+ var table = ws.FirstCell().InsertTable(data1, true)
+ .SetShowHeaderRow()
+ .SetShowTotalsRow();
+ table.Fields.First().TotalsRowFunction = XLTotalsRowFunction.Sum;
+
+ Assert.AreEqual(XLTableCellType.Header, table.HeadersRow().Cell(1).TableCellType());
+ Assert.AreEqual(XLTableCellType.Data, table.HeadersRow().Cell(1).CellBelow().TableCellType());
+ Assert.AreEqual(XLTableCellType.Total, table.TotalsRow().Cell(1).TableCellType());
+ Assert.AreEqual(XLTableCellType.None, ws.Cell("Z100").TableCellType());
+ }
+ }
+
+ //TODO: Delete table (not underlying range)
}
}
diff --git a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs
index 76f612e..33fafed 100644
--- a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs
+++ b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs
@@ -161,6 +161,27 @@
}
[Test]
+ public void TryGetWorksheet()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws1 = wb.AddWorksheet("Sheet1");
+ var ws2 = wb.AddWorksheet("Sheet2");
+
+ IXLWorksheet ws;
+ Assert.IsTrue(wb.Worksheets.TryGetWorksheet("Sheet1", out ws));
+ Assert.IsTrue(wb.Worksheets.TryGetWorksheet("sheet1", out ws));
+ Assert.IsTrue(wb.Worksheets.TryGetWorksheet("sHEeT1", out ws));
+ Assert.IsFalse(wb.Worksheets.TryGetWorksheet("Sheeeet2", out ws));
+
+ Assert.IsTrue(wb.TryGetWorksheet("Sheet1", out ws));
+ Assert.IsTrue(wb.TryGetWorksheet("sheet1", out ws));
+ Assert.IsTrue(wb.TryGetWorksheet("sHEeT1", out ws));
+ Assert.IsFalse(wb.TryGetWorksheet("Sheeeet2", out ws));
+ }
+ }
+
+ [Test]
public void HideWorksheet()
{
using (var ms = new MemoryStream())
diff --git a/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx
index bac6e30..e2ac29f 100644
--- a/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx b/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx
index 3879998..5c9ae0a 100644
--- a/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBarNegative.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBarNegative.xlsx
new file mode 100644
index 0000000..fa46948
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBarNegative.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx
index 80be4ab..e57b38d 100644
--- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx
index 5f4f6ce..e233171 100644
--- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx
new file mode 100644
index 0000000..9894731
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx
index 53aa802..d2a90ba 100644
--- a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx
index 237d910..3ec78e0 100644
--- a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx
index 21ea101..3f4195a 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx
index 87f74be..d7b9afd 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx
index 5d0b538..f451273 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx
index a3c6ea5..1f99477 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx
index 222ba7b..d724e36 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx
index c8ae77a..d9d1a57 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/InsertingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/InsertingTables.xlsx
deleted file mode 100644
index 212cbfe..0000000
--- a/ClosedXML_Tests/Resource/Examples/Misc/InsertingTables.xlsx
+++ /dev/null
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx
index 9839a6f..2cbaac9 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx
index 81bc2a4..a1aa8d0 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx b/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx
index 7c0b68e..247daba 100644
--- a/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx
index c1c9431..5e18500 100644
--- a/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx
index 6cdd101..9588f7d 100644
--- a/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx
index a33e2a6..adecfee 100644
--- a/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx
index 3f1bafd..453328f 100644
--- a/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx
index 8b26d86..bd2c3d6 100644
--- a/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx
index 44fbbbe..037fc86 100644
--- a/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/UsingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/UsingTables.xlsx
deleted file mode 100644
index 288d1fe..0000000
--- a/ClosedXML_Tests/Resource/Examples/Ranges/UsingTables.xlsx
+++ /dev/null
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx
index 4a705f7..e12dfc5 100644
--- a/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx
index 0dadd37..a9c9728 100644
--- a/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx
new file mode 100644
index 0000000..89de679
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx
new file mode 100644
index 0000000..dad3954
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx
new file mode 100644
index 0000000..288d1fe
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Utils/StreamHelper.cs b/ClosedXML_Tests/Utils/StreamHelper.cs
index b68a11f..8ecb4f9 100644
--- a/ClosedXML_Tests/Utils/StreamHelper.cs
+++ b/ClosedXML_Tests/Utils/StreamHelper.cs
@@ -51,7 +51,7 @@
throw new ArgumentException("Can't write to stream", "pStream");
}
- #endregion
+ #endregion Check params
foreach (byte b in pBynaryArray)
{
@@ -86,7 +86,7 @@
throw new ArgumentException("Can't write to stream", "streamToWrite");
}
- #endregion
+ #endregion Check params
var buf = new byte[512];
long length;
@@ -135,37 +135,53 @@
throw new ArgumentException("Must be in position 0", "other");
}
- #endregion
+ #endregion Check
- var stringOne = new StreamReader(one).ReadToEnd().StripColumnWidths(stripColumnWidths);
- var stringOther = new StreamReader(other).ReadToEnd().StripColumnWidths(stripColumnWidths);
+ var stringOne = new StreamReader(one).ReadToEnd().RemoveIgnoredParts(stripColumnWidths, ignoreGuids: true);
+ var stringOther = new StreamReader(other).ReadToEnd().RemoveIgnoredParts(stripColumnWidths, ignoreGuids: true);
return stringOne == stringOther;
}
+ private static string RemoveIgnoredParts(this string s, Boolean ignoreColumnWidths, Boolean ignoreGuids)
+ {
+ if (ignoreColumnWidths)
+ s = RemoveColumnWidths(s);
+
+ if (ignoreGuids)
+ s = RemoveGuids(s);
+
+ return s;
+ }
+
private static Regex columnRegex = new Regex("", RegexOptions.Compiled);
private static Regex widthRegex = new Regex("width=\"\\d+(\\.\\d+)?\"\\s+", RegexOptions.Compiled);
- private static string StripColumnWidths(this string s, bool stripIt)
+ private static String RemoveColumnWidths(String s)
{
- if (!stripIt)
- return s;
- else
- {
- var replacements = new Dictionary();
-
- foreach (var m in columnRegex.Matches(s).OfType())
- {
- var original = m.Groups[0].Value;
- var replacement = widthRegex.Replace(original, "");
- replacements.Add(original, replacement);
- }
+ var replacements = new Dictionary();
- foreach (var r in replacements)
- {
- s = s.Replace(r.Key, r.Value);
- }
- return s;
+ foreach (var m in columnRegex.Matches(s).OfType())
+ {
+ var original = m.Groups[0].Value;
+ var replacement = widthRegex.Replace(original, "");
+ replacements.Add(original, replacement);
}
+
+ foreach (var r in replacements)
+ {
+ s = s.Replace(r.Key, r.Value);
+ }
+ return s;
+ }
+
+ private static Regex guidRegex = new Regex(@"{[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}}", RegexOptions.Compiled | RegexOptions.Multiline);
+
+ private static String RemoveGuids(String s)
+ {
+ return guidRegex.Replace(s, delegate (Match m)
+ {
+ return string.Empty;
+ });
}
}
-}
\ No newline at end of file
+}