diff --git a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj
index 788695a..e61a62f 100644
--- a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj
+++ b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj
@@ -231,6 +231,7 @@
+
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs
index 71815b3..f20106a 100644
--- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs
@@ -146,5 +146,28 @@
IXLCells InsertCellsBelow(int numberOfRows);
IXLCells InsertCellsAfter(int numberOfColumns);
IXLCells InsertCellsBefore(int numberOfColumns);
+
+ ///
+ /// Creates a named range out of this cell.
+ /// If the named range exists, it will add this range to that named range.
+ /// The default scope for the named range is Workbook.
+ ///
+ /// Name of the range.
+ IXLCell AddToNamed(String rangeName);
+
+ ///
+ /// Creates a named range out of this cell.
+ /// If the named range exists, it will add this range to that named range.
+ /// Name of the range.
+ /// The scope for the named range.
+ IXLCell AddToNamed(String rangeName, XLScope scope);
+
+ ///
+ /// Creates a named range out of this cell.
+ /// If the named range exists, it will add this range to that named range.
+ /// Name of the range.
+ /// The scope for the named range.
+ /// The comments for the named range.
+ IXLCell AddToNamed(String rangeName, XLScope scope, String comment);
}
}
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs
index cc4ed87..fb027fc 100644
--- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs
@@ -288,7 +288,9 @@
maxRows = lastCellUsed.Address.RowNumber;
maxColumns = lastCellUsed.Address.ColumnNumber;
//if (asRange is XLRow)
+ //{
// worksheet.Range(Address.RowNumber, Address.ColumnNumber, , maxColumns).Clear();
+ //}
}
else
{
@@ -1127,6 +1129,7 @@
// FormulaA1 = GetFormula(formulaR1C1, FormulaConversionType.R1C1toA1, rowsToShift, columnsToShift);
//}
+
internal void ShiftFormulaRows(XLRange shiftedRange, int rowsShifted)
{
if (!StringExtensions.IsNullOrWhiteSpace(FormulaA1))
@@ -1491,5 +1494,22 @@
{
return this.AsRange().InsertColumnsBefore(numberOfColumns).Cells();
}
+
+
+ public IXLCell AddToNamed(String rangeName)
+ {
+ this.AsRange().AddToNamed(rangeName);
+ return this;
+ }
+ public IXLCell AddToNamed(String rangeName, XLScope scope)
+ {
+ this.AsRange().AddToNamed(rangeName, scope);
+ return this;
+ }
+ public IXLCell AddToNamed(String rangeName, XLScope scope, String comment)
+ {
+ this.AsRange().AddToNamed(rangeName, scope, comment);
+ return this;
+ }
}
}
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs
index 15b4865..8166472 100644
--- a/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs
@@ -16,6 +16,7 @@
ShowErrorMessage = true;
ShowInputMessage = true;
InCellDropdown = true;
+ Operator = XLOperator.Between;
this.worksheet = worksheet;
}
public IXLRanges Ranges { get; set; }
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs
index b251ff1..c3b3b7a 100644
--- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs
@@ -799,7 +799,7 @@
}
public IXLRange AddToNamed(String rangeName, XLScope scope)
{
- return AddToNamed(rangeName, XLScope.Workbook, null);
+ return AddToNamed(rangeName, scope, null);
}
public IXLRange AddToNamed(String rangeName, XLScope scope, String comment)
{
@@ -955,6 +955,7 @@
}
else
{
+ List dvEmpty = new List();
foreach (var dv in Worksheet.DataValidations)
{
foreach (var dvRange in dv.Ranges)
@@ -967,10 +968,14 @@
if (!this.Contains(c.Address.ToString()))
dv.Ranges.Add(c.AsRange());
}
+ if (dv.Ranges.Count() == 0)
+ dvEmpty.Add(dv);
}
}
}
+ dvEmpty.ForEach(dv => (Worksheet.DataValidations as XLDataValidations).Delete(dv));
+
var newRanges = new XLRanges(Worksheet.Internals.Workbook, Style);
newRanges.Add(this.AsRange());
var dataValidation = new XLDataValidation(newRanges, Worksheet);
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWSContentManager.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWSContentManager.cs
new file mode 100644
index 0000000..5b75803
--- /dev/null
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWSContentManager.cs
@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Spreadsheet;
+
+namespace ClosedXML.Excel
+{
+ internal class XLWSContentManager
+ {
+ public enum XLWSContents
+ {
+ SheetProperties = 1,
+ SheetDimension = 2,
+ SheetViews = 3,
+ SheetFormatProperties = 4,
+ Columns = 5,
+ SheetData = 6,
+ SheetCalculationProperties = 7,
+ SheetProtection = 8,
+ ProtectedRanges = 9,
+ Scenarios = 10,
+ AutoFilter = 11,
+ SortState = 12,
+ DataConsolidate = 13,
+ CustomSheetViews = 14,
+ MergeCells = 15,
+ PhoneticProperties = 16,
+ ConditionalFormatting = 17,
+ DataValidations = 18,
+ Hyperlinks = 19,
+ PrintOptions = 20,
+ PageMargins = 21,
+ PageSetup = 22,
+ HeaderFooter = 23,
+ RowBreaks = 24,
+ ColumnBreaks = 25,
+ CustomProperties = 26,
+ CellWatches = 27,
+ IgnoredErrors = 28,
+ SmartTags = 29,
+ Drawing = 30,
+ LegacyDrawing = 31,
+ LegacyDrawingHeaderFooter = 32,
+ DrawingHeaderFooter = 33,
+ Picture = 34,
+ OleObjects = 35,
+ Controls = 36,
+ AlternateContent = 37,
+ WebPublishItems = 38,
+ TableParts = 39,
+ WorksheetExtensionList = 40
+ }
+ private Dictionary contents = new Dictionary();
+
+ public XLWSContentManager(Worksheet opWorksheet)
+ {
+ contents.Add(XLWSContents.SheetProperties, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SheetDimension, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SheetViews, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SheetFormatProperties, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.Columns, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SheetData, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SheetCalculationProperties, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SheetProtection, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.ProtectedRanges, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.Scenarios, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.AutoFilter, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SortState, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.DataConsolidate, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.CustomSheetViews, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.MergeCells, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.PhoneticProperties, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.ConditionalFormatting, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.DataValidations, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.Hyperlinks, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.PrintOptions, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.PageMargins, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.PageSetup, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.HeaderFooter, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.RowBreaks, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.ColumnBreaks, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.CustomProperties, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.CellWatches, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.IgnoredErrors, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.SmartTags, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.Drawing, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.LegacyDrawing, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.LegacyDrawingHeaderFooter, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.DrawingHeaderFooter, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.Picture, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.OleObjects, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.Controls, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.AlternateContent, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.WebPublishItems, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.TableParts, opWorksheet.Elements().FirstOrDefault());
+ contents.Add(XLWSContents.WorksheetExtensionList, opWorksheet.Elements().FirstOrDefault());
+ }
+
+ public void SetElement(XLWSContents content, OpenXmlElement element)
+ {
+ contents[content] = element;
+ }
+
+ public OpenXmlElement GetPreviousElementFor(XLWSContents content)
+ {
+ var max = contents.Where(kp => (Int32)kp.Key < (Int32)content && kp.Value != null).Max(kp => kp.Key);
+ return contents[max];
+ }
+ }
+}
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs
index 6f06459..3c1b64c 100644
--- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs
@@ -309,24 +309,39 @@
else
xlCell.Style.NumberFormat.NumberFormatId = Int32.Parse(numberFormatId);
- if (val >= 0 && val <= DateTimeExtensions.MaxOADate)
- {
- String format = xlCell.Style.NumberFormat.Format.EndsWith(";@") ? xlCell.Style.NumberFormat.Format.Substring(0, xlCell.Style.NumberFormat.Format.Length - 2) : xlCell.Style.NumberFormat.Format;
- Double dTest;
- if (!Double.TryParse(val.ToString(format), out dTest))
+ if (!StringExtensions.IsNullOrWhiteSpace(xlCell.Style.NumberFormat.Format))
+ xlCell.DataType = GetDataTypeFromFormat(xlCell.Style.NumberFormat.Format);
+ else
+ if ((numberFormatId >= 14 && numberFormatId <= 22) || (numberFormatId >= 45 && numberFormatId <= 47))
xlCell.DataType = XLCellValues.DateTime;
+ else if (numberFormatId == 0 || numberFormatId == 49)
+ xlCell.DataType = XLCellValues.Text;
+ else
+ xlCell.DataType = XLCellValues.Number;
+
- ////String format = xlCell.Style.NumberFormat.Format.EndsWith(";@") ? xlCell.Style.NumberFormat.Format.Substring(0, xlCell.Style.NumberFormat.Format.Length - 2) : xlCell.Style.NumberFormat.Format;
-
- ////Double dTest;
- ////if (!Double.TryParse(val.ToString(format) , out dTest))
- ////DateTime dTest;
- ////if (DateTime.TryParseExact(DateTime.FromOADate(val).ToString(format), format, CultureInfo.InvariantCulture, DateTimeStyles.None , out dTest))
- ////if (DateTime.TryParse(val.ToString(format), out dTest))
- //if ((numberFormatId >= 14 && numberFormatId <= 22) || (numberFormatId >= 165 && numberFormatId <= 180))
- // xlCell.DataType = XLCellValues.DateTime;
- }
+ //if (val >= 0 && val <= DateTimeExtensions.MaxOADate)
+ //{
+ // xlCell.DataType = GetDataTypeFromFormat(xlCell.Style.NumberFormat.Format);
+ // //String format = xlCell.Style.NumberFormat.Format.EndsWith(";@") ? xlCell.Style.NumberFormat.Format.Substring(0, xlCell.Style.NumberFormat.Format.Length - 2) : xlCell.Style.NumberFormat.Format;
+
+ // //Double dTest;
+ // //if (!Double.TryParse(val.ToString(format), out dTest))
+ // // xlCell.DataType = XLCellValues.DateTime;
+
+ // //String format = xlCell.Style.NumberFormat.Format.EndsWith(";@") ? xlCell.Style.NumberFormat.Format.Substring(0, xlCell.Style.NumberFormat.Format.Length - 2) : xlCell.Style.NumberFormat.Format;
+ // //format = FixFormatForDates(format);
+ // ////Double dTest;
+ // ////if (!Double.TryParse(val.ToString(format) , out dTest))
+ // //DateTime dTest;
+ // //if (DateTime.TryParseExact(DateTime.FromOADate(val).ToString(format), format, CultureInfo.InvariantCulture, DateTimeStyles.None , out dTest))
+ // // xlCell.DataType = XLCellValues.DateTime;
+
+ // ////if (DateTime.TryParse(val.ToString(format), out dTest))
+ // //if ((numberFormatId >= 14 && numberFormatId <= 22) || (numberFormatId >= 165 && numberFormatId <= 180))
+ // // xlCell.DataType = XLCellValues.DateTime;
+ //}
}
}
#endregion
@@ -443,6 +458,23 @@
}
}
+ private XLCellValues GetDataTypeFromFormat(String format)
+ {
+ var length = format.Length;
+ String f = format.ToLower();
+ for (Int32 i = 0; i < length; i++)
+ {
+ Char c = f[i];
+ if (c == '"')
+ i = f.IndexOf('"', i + 1);
+ else if (c == '0' || c == '#' || c == '?')
+ return XLCellValues.Number;
+ else if (c == 'y' || c == 'm' || c == 'd' || c == 'h' || c == 's')
+ return XLCellValues.DateTime;
+ }
+ return XLCellValues.Text;
+ }
+
private void LoadDataValidations(WorksheetPart worksheetPart, XLWorksheet ws)
{
var dataValidationList = worksheetPart.Worksheet.Descendants();
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs
index 793a197..44ddc38 100644
--- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs
@@ -738,7 +738,7 @@
if (!StringExtensions.IsNullOrWhiteSpace(nr.Comment)) definedName.Comment = nr.Comment;
definedNames.Append(definedName);
}
-
+
var titles = String.Empty;
var definedNameTextRow = String.Empty;
var definedNameTextColumn = String.Empty;
@@ -1510,6 +1510,7 @@
#region GenerateWorksheetPartContent
private void GenerateWorksheetPartContent(WorksheetPart worksheetPart, XLWorksheet xlWorksheet)
{
+
#region Worksheet
if (worksheetPart.Worksheet == null)
worksheetPart.Worksheet = new Worksheet();
@@ -1520,10 +1521,14 @@
worksheetPart.Worksheet.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
#endregion
+ var cm = new XLWSContentManager(worksheetPart.Worksheet);
+
#region SheetProperties
if (worksheetPart.Worksheet.SheetProperties == null)
worksheetPart.Worksheet.SheetProperties = new SheetProperties() { CodeName = xlWorksheet.Name.RemoveSpecialCharacters() };
+ cm.SetElement(XLWSContentManager.XLWSContents.SheetProperties, worksheetPart.Worksheet.SheetProperties);
+
if (worksheetPart.Worksheet.SheetProperties.OutlineProperties == null)
worksheetPart.Worksheet.SheetProperties.OutlineProperties = new OutlineProperties();
@@ -1566,9 +1571,13 @@
if (worksheetPart.Worksheet.SheetDimension == null)
worksheetPart.Worksheet.SheetDimension = new SheetDimension() { Reference = sheetDimensionReference };
+ cm.SetElement(XLWSContentManager.XLWSContents.SheetDimension, worksheetPart.Worksheet.SheetDimension);
+
if (worksheetPart.Worksheet.SheetViews == null)
worksheetPart.Worksheet.SheetViews = new SheetViews();
+ cm.SetElement(XLWSContentManager.XLWSContents.SheetViews, worksheetPart.Worksheet.SheetViews);
+
var sheetView = worksheetPart.Worksheet.SheetViews.FirstOrDefault();
if (worksheetPart.Worksheet.SheetViews.Count() == 0)
{
@@ -1628,6 +1637,8 @@
if (worksheetPart.Worksheet.SheetFormatProperties == null)
worksheetPart.Worksheet.SheetFormatProperties = new SheetFormatProperties();
+ cm.SetElement(XLWSContentManager.XLWSContents.SheetFormatProperties, worksheetPart.Worksheet.SheetFormatProperties);
+
worksheetPart.Worksheet.SheetFormatProperties.DefaultRowHeight = xlWorksheet.RowHeight;
worksheetPart.Worksheet.SheetFormatProperties.DefaultColumnWidth = xlWorksheet.ColumnWidth;
//worksheetPart.Worksheet.SheetFormatProperties.CustomHeight = true;
@@ -1654,9 +1665,13 @@
var worksheetColumnWidth = GetColumnWidth(xlWorksheet.ColumnWidth);
if (worksheetPart.Worksheet.Elements().Count() == 0)
- worksheetPart.Worksheet.InsertAfter(new Columns(), worksheetPart.Worksheet.SheetFormatProperties);
+ {
+ var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.Columns);
+ worksheetPart.Worksheet.InsertAfter(new Columns(), previousElement);
+ }
columns = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.Columns, columns);
Dictionary sheetColumnsByMin = columns.Elements().ToDictionary(c => c.Min.Value, c => c);
//Dictionary sheetColumnsByMax = columns.Elements().ToDictionary(c => c.Max.Value, c => c);
@@ -1761,15 +1776,12 @@
SheetData sheetData;
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (columns != null)
- previousElement = columns;
- else
- previousElement = worksheetPart.Worksheet.SheetFormatProperties;
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.SheetData);
worksheetPart.Worksheet.InsertAfter(new SheetData(), previousElement);
}
sheetData = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.SheetData, sheetData);
var cellsByRow = new Dictionary>();
foreach (var c in xlWorksheet.Internals.CellsCollection.Values)
@@ -1969,32 +1981,18 @@
}
#endregion
- var autoFilter = worksheetPart.Worksheet.Elements().FirstOrDefault();
-
- CustomSheetViews customSheetViews = worksheetPart.Worksheet.Elements().FirstOrDefault();
-
#region MergeCells
MergeCells mergeCells = null;
if (xlWorksheet.Internals.MergedRanges.Count() > 0)
{
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (customSheetViews != null)
- previousElement = customSheetViews;
- else if (autoFilter != null)
- previousElement = autoFilter;
- else if (sheetData != null)
- previousElement = sheetData;
- else if (columns != null)
- previousElement = columns;
- else
- previousElement = worksheetPart.Worksheet.SheetFormatProperties;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.MergeCells);
worksheetPart.Worksheet.InsertAfter(new MergeCells(), previousElement);
}
mergeCells = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.MergeCells, mergeCells);
mergeCells.RemoveAllChildren();
foreach (var merged in xlWorksheet.Internals.MergedRanges.Select(m => m.RangeAddress.FirstAddress.ToString() + ":" + m.RangeAddress.LastAddress.ToString()))
@@ -2011,10 +2009,6 @@
}
#endregion
- var phoneticProperties = worksheetPart.Worksheet.Elements().FirstOrDefault();
-
- var conditionalFormatting = worksheetPart.Worksheet.Elements().LastOrDefault();
-
#region DataValidations
DataValidations dataValidations = null;
@@ -2027,28 +2021,12 @@
worksheetPart.Worksheet.Elements().FirstOrDefault();
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (conditionalFormatting != null)
- previousElement = conditionalFormatting;
- else if (phoneticProperties != null)
- previousElement = phoneticProperties;
- else if (mergeCells != null)
- previousElement = mergeCells;
- else if (customSheetViews != null)
- previousElement = customSheetViews;
- else if (autoFilter != null)
- previousElement = autoFilter;
- else if (sheetData != null)
- previousElement = sheetData;
- else if (columns != null)
- previousElement = columns;
- else
- previousElement = worksheetPart.Worksheet.SheetFormatProperties;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.DataValidations);
worksheetPart.Worksheet.InsertAfter(new DataValidations(), previousElement);
}
dataValidations = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, dataValidations);
dataValidations.RemoveAllChildren();
foreach (var dv in xlWorksheet.DataValidations)
{
@@ -2100,30 +2078,12 @@
worksheetPart.Worksheet.Elements().FirstOrDefault();
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (dataValidations != null)
- previousElement = dataValidations;
- else if (conditionalFormatting != null)
- previousElement = conditionalFormatting;
- else if (phoneticProperties != null)
- previousElement = phoneticProperties;
- else if (mergeCells != null)
- previousElement = mergeCells;
- else if (customSheetViews != null)
- previousElement = customSheetViews;
- else if (autoFilter != null)
- previousElement = autoFilter;
- else if (sheetData != null)
- previousElement = sheetData;
- else if (columns != null)
- previousElement = columns;
- else
- previousElement = worksheetPart.Worksheet.SheetFormatProperties;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.Hyperlinks);
worksheetPart.Worksheet.InsertAfter(new Hyperlinks(), previousElement);
}
hyperlinks = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.Hyperlinks, hyperlinks);
hyperlinks.RemoveAllChildren();
foreach (var hl in xlWorksheet.Hyperlinks)
{
@@ -2154,32 +2114,12 @@
PrintOptions printOptions = null;
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (hyperlinks != null)
- previousElement = hyperlinks;
- else if (dataValidations != null)
- previousElement = dataValidations;
- else if (conditionalFormatting != null)
- previousElement = conditionalFormatting;
- else if (phoneticProperties != null)
- previousElement = phoneticProperties;
- else if (mergeCells != null)
- previousElement = mergeCells;
- else if (customSheetViews != null)
- previousElement = customSheetViews;
- else if (autoFilter != null)
- previousElement = autoFilter;
- else if (sheetData != null)
- previousElement = sheetData;
- else if (columns != null)
- previousElement = columns;
- else
- previousElement = worksheetPart.Worksheet.SheetFormatProperties;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PrintOptions);
worksheetPart.Worksheet.InsertAfter(new PrintOptions(), previousElement);
}
printOptions = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.PrintOptions, printOptions);
printOptions.HorizontalCentered = xlWorksheet.PageSetup.CenterHorizontally;
printOptions.VerticalCentered = xlWorksheet.PageSetup.CenterVertically;
@@ -2190,34 +2130,12 @@
#region PageMargins
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (printOptions != null)
- previousElement = printOptions;
- else if (hyperlinks != null)
- previousElement = hyperlinks;
- else if (dataValidations != null)
- previousElement = dataValidations;
- else if (conditionalFormatting != null)
- previousElement = conditionalFormatting;
- else if (phoneticProperties != null)
- previousElement = phoneticProperties;
- else if (mergeCells != null)
- previousElement = mergeCells;
- else if (customSheetViews != null)
- previousElement = customSheetViews;
- else if (autoFilter != null)
- previousElement = autoFilter;
- else if (sheetData != null)
- previousElement = sheetData;
- else if (columns != null)
- previousElement = columns;
- else
- previousElement = worksheetPart.Worksheet.SheetFormatProperties;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PageMargins);
worksheetPart.Worksheet.InsertAfter(new PageMargins(), previousElement);
}
PageMargins pageMargins = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.PageMargins, pageMargins);
pageMargins.Left = xlWorksheet.PageSetup.Margins.Left;
pageMargins.Right = xlWorksheet.PageSetup.Margins.Right;
pageMargins.Top = xlWorksheet.PageSetup.Margins.Top;
@@ -2229,10 +2147,12 @@
#region PageSetup
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- worksheetPart.Worksheet.InsertAfter(new PageSetup(), pageMargins);
+ var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PageSetup);
+ worksheetPart.Worksheet.InsertAfter(new PageSetup(), previousElement);
}
PageSetup pageSetup = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.PageSetup, pageSetup);
pageSetup.Orientation = pageOrientationValues.Single(p => p.Key == xlWorksheet.PageSetup.PageOrientation).Value;
pageSetup.PaperSize = (UInt32)xlWorksheet.PageSetup.PaperSize;
@@ -2287,9 +2207,13 @@
#region HeaderFooter
if (worksheetPart.Worksheet.Elements().Count() == 0)
- worksheetPart.Worksheet.InsertAfter(new HeaderFooter(), pageSetup);
+ {
+ var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.HeaderFooter);
+ worksheetPart.Worksheet.InsertAfter(new HeaderFooter(), previousElement);
+ }
HeaderFooter headerFooter = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.HeaderFooter, headerFooter);
headerFooter.RemoveAllChildren();
headerFooter.ScaleWithDoc = xlWorksheet.PageSetup.ScaleHFWithDocument;
@@ -2319,17 +2243,12 @@
#region RowBreaks
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (worksheetPart.Worksheet.Elements().Count() > 0)
- previousElement = headerFooter;
- else
- previousElement = pageSetup;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.RowBreaks);
worksheetPart.Worksheet.InsertAfter(new RowBreaks(), previousElement);
}
RowBreaks rowBreaks = worksheetPart.Worksheet.Elements().First();
-
+
var rowBreakCount = xlWorksheet.PageSetup.RowBreaks.Count;
if (rowBreakCount > 0)
{
@@ -2340,11 +2259,12 @@
Break break1 = new Break() { Id = (UInt32)rb, Max = (UInt32)xlWorksheet.RangeAddress.LastAddress.RowNumber, ManualPageBreak = true };
rowBreaks.Append(break1);
}
-
+ cm.SetElement(XLWSContentManager.XLWSContents.RowBreaks, rowBreaks);
}
else
{
worksheetPart.Worksheet.RemoveAllChildren();
+ cm.SetElement(XLWSContentManager.XLWSContents.RowBreaks, null);
}
#endregion
@@ -2352,14 +2272,7 @@
if (worksheetPart.Worksheet.Elements().Count() == 0)
{
- OpenXmlElement previousElement;
- if (worksheetPart.Worksheet.Elements().Count() > 0)
- previousElement = rowBreaks;
- else if (worksheetPart.Worksheet.Elements().Count() > 0)
- previousElement = headerFooter;
- else
- previousElement = pageSetup;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.ColumnBreaks);
worksheetPart.Worksheet.InsertAfter(new ColumnBreaks(), previousElement);
}
@@ -2375,51 +2288,24 @@
Break break1 = new Break() { Id = (UInt32)cb, Max = (UInt32)xlWorksheet.RangeAddress.LastAddress.ColumnNumber, ManualPageBreak = true };
columnBreaks.Append(break1);
}
+ cm.SetElement(XLWSContentManager.XLWSContents.ColumnBreaks, columnBreaks);
}
else
{
worksheetPart.Worksheet.RemoveAllChildren();
+ cm.SetElement(XLWSContentManager.XLWSContents.ColumnBreaks, null);
}
#endregion
- #region Drawings & OleObjects
- Drawing drawing = worksheetPart.Worksheet.Elements().FirstOrDefault();
- LegacyDrawing legacyDrawing = worksheetPart.Worksheet.Elements().FirstOrDefault();
- LegacyDrawingHeaderFooter legacyDrawingHF = worksheetPart.Worksheet.Elements().FirstOrDefault();
- OleObjects oleObjects = worksheetPart.Worksheet.Elements().FirstOrDefault();
- #endregion
-
- #region Controls
- Controls controls = worksheetPart.Worksheet.Elements().FirstOrDefault();
- #endregion
-
#region Tables
worksheetPart.Worksheet.RemoveAllChildren();
{
- OpenXmlElement previousElement;
- if (controls != null)
- previousElement = controls;
- else if (oleObjects != null)
- previousElement = oleObjects;
- else if (legacyDrawingHF != null)
- previousElement = legacyDrawingHF;
- else if (legacyDrawing != null)
- previousElement = legacyDrawing;
- else if (drawing != null)
- previousElement = drawing;
- else if (worksheetPart.Worksheet.Elements().Count() > 0)
- previousElement = columnBreaks;
- else if (worksheetPart.Worksheet.Elements().Count() > 0)
- previousElement = rowBreaks;
- else if (worksheetPart.Worksheet.Elements().Count() > 0)
- previousElement = headerFooter;
- else
- previousElement = pageSetup;
-
+ OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.TableParts);
worksheetPart.Worksheet.InsertAfter(new TableParts(), previousElement);
}
TableParts tableParts = worksheetPart.Worksheet.Elements().First();
+ cm.SetElement(XLWSContentManager.XLWSContents.TableParts, tableParts);
tableParts.Count = (UInt32)xlWorksheet.Tables.Count();
foreach (var table in xlWorksheet.Tables)
diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs
index 6fc060d..0acd229 100644
--- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs
+++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using System.Text.RegularExpressions;
namespace ClosedXML.Excel
@@ -628,5 +629,7 @@
return this;
}
+
+
}
}
diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/InsertingTables.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/InsertingTables.cs
index 63ec472..963664e 100644
--- a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/InsertingTables.cs
+++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/InsertingTables.cs
@@ -54,11 +54,6 @@
where p.Age >= 21
select p;
- //var person = new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." };
- //foreach (var p in person.GetType().GetProperties())
- //{
- // var ats = p.GetCustomAttributes(true);
- //}
ws.Cell(7, 6).Value = "From Query";
ws.Range(7, 6, 7, 8).Merge().AddToNamed("Titles");
diff --git a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj
index 26ae34c..521e332 100644
--- a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj
+++ b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj
@@ -454,6 +454,9 @@
Excel\XLWorksheets.cs
+
+ Excel\XLWSContentManager.cs
+
Extensions.cs
diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs b/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs
index b8f84fd..16dbd02 100644
--- a/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs
+++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs
@@ -13,59 +13,52 @@
class Program
{
- static void xMain(string[] args)
+ static void Main(string[] args)
{
- var fileName = "Issue_6313";
+ //var fileName = "DifferentKinds";
//var fileName = "Blank";
- //var fileName = "Sandbox";
- var wb = new XLWorkbook(String.Format(@"c:\Excel Files\ForTesting\{0}.xlsx", fileName));
-
- IXLWorksheet sheet = wb.Worksheets.Add("Query Results");
-
- // Add the table to the Excel sheet
- var table = sheet.Cell(1, 1).InsertTable(new List());
- // run autofit on all the columns
- sheet.Columns().AdjustToContents();
- // Freeze the top row and the first five columns
- sheet.SheetView.Freeze(1, 5);
- // Mark the first row as BOLD
- table.HeadersRow().Style.Font.Bold = true;
-
+ var fileName = "Sandbox";
+ //var wb = new XLWorkbook(String.Format(@"c:\Excel Files\ForTesting\{0}.xlsx", fileName));
//var wb = new XLWorkbook();
- //var ws = wb.Worksheets.Add("Shifting Formulas");
- //ws.Cell("B2").Value = 5;
- //ws.Cell("B3").Value = 6;
- //ws.Cell("C2").Value = 1;
- //ws.Cell("C3").Value = 2;
- //ws.Cell("A4").Value = "Sum:";
- //ws.Range("B4:C4").FormulaR1C1 = "Sum(R[-2]C:R[-1]C)";
- //ws.Cell("E2").Value = "Avg:";
-
- //ws.Cell("F2").FormulaA1 = "Average(B2:C3)";
- //ws.Ranges("A4,E2").Style
- // .Font.SetBold()
- // .Fill.SetBackgroundColor(XLColor.CyanProcess);
- //var ws2 = wb.Worksheets.Add("WS2");
- //ws2.Cell(1, 1).FormulaA1 = "='Shifting Formulas'!B2";
- //ws2.Cell(1, 2).Value = ws2.Cell(1, 1).Value;
- //ws2.Cell(2, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C$3)";
- //ws2.Cell(3, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C3)";
- //ws2.Cell(4, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:C3)";
- //ws2.Cell(5, 1).FormulaA1 = "Average('Shifting Formulas'!$B2:C3)";
- //ws2.Cell(6, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C3)";
- //ws2.Cell(7, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C$3)";
- //ws2.Cell(8, 1).FormulaA1 = "Average('Shifting Formulas'!B2:$C$3)";
- //ws2.Cell(9, 1).FormulaA1 = "Average('Shifting Formulas'!B$2:$C$3)";
- //var dataGrid = ws.Range("B2:D3");
- //ws.Row(1).InsertRowsAbove(1);
- //var newRow = dataGrid.LastRow().InsertRowsAbove(1).First();
- //newRow.Value = 1;
- //dataGrid.LastColumn().FormulaR1C1 = String.Format("SUM(RC[-{0}]:RC[-1])", dataGrid.ColumnCount() - 1);
- //ws.Cell(1, 1).InsertCellsBelow(1);
- //ws.Column(1).InsertColumnsBefore(1);
- //ws.Row(4).Delete();
+ var wb = new XLWorkbook();
+ var ws = wb.Worksheets.Add("Shifting Formulas");
+ ws.Cell("B2").Value = 5;
+ ws.Cell("B3").Value = 6;
+ ws.Cell("C2").Value = 1;
+ ws.Cell("C3").Value = 2;
+ ws.Cell("A4").Value = "Sum:";
+ ws.Range("B4:C4").FormulaR1C1 = "Sum(R[-2]C:R[-1]C)";
+ ws.Range("B4:C4").AddToNamed("WorkbookB4C4");
+ ws.Range("B4:C4").AddToNamed("WorksheetB4C4", XLScope.Worksheet);
+ ws.Cell("E2").Value = "Avg:";
+
+ ws.Cell("F2").FormulaA1 = "Average(B2:C3)";
+ ws.Ranges("A4,E2").Style
+ .Font.SetBold()
+ .Fill.SetBackgroundColor(XLColor.CyanProcess);
+
+ var ws2 = wb.Worksheets.Add("WS2");
+ ws2.Cell(1, 1).FormulaA1 = "='Shifting Formulas'!B2";
+ ws2.Cell(1, 2).Value = ws2.Cell(1, 1).Value;
+ ws2.Cell(2, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C$3)";
+ ws2.Cell(3, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C3)";
+ ws2.Cell(4, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:C3)";
+ ws2.Cell(5, 1).FormulaA1 = "Average('Shifting Formulas'!$B2:C3)";
+ ws2.Cell(6, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C3)";
+ ws2.Cell(7, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C$3)";
+ ws2.Cell(8, 1).FormulaA1 = "Average('Shifting Formulas'!B2:$C$3)";
+ ws2.Cell(9, 1).FormulaA1 = "Average('Shifting Formulas'!B$2:$C$3)";
+
+ var dataGrid = ws.Range("B2:D3");
+ ws.Row(1).InsertRowsAbove(1);
+ var newRow = dataGrid.LastRow().InsertRowsAbove(1).First();
+ newRow.Value = 1;
+ dataGrid.LastColumn().FormulaR1C1 = String.Format("SUM(RC[-{0}]:RC[-1])", dataGrid.ColumnCount() - 1);
+ ws.Cell(1, 1).InsertCellsBelow(1);
+ ws.Column(1).InsertColumnsBefore(1);
+ ws.Row(4).Delete();
wb.SaveAs(String.Format(@"c:\Excel Files\ForTesting\{0}_Saved.xlsx", fileName));
}
@@ -130,7 +123,7 @@
wb.Save();
}
- static void Main(string[] args)
+ static void xMain(string[] args)
{
FillStyles();
List runningSave = new List();