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();