|  | /******************************************************************************* | 
|  | * You may amend and distribute as you like, but don't remove this header! | 
|  | * | 
|  | * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets. | 
|  | * See http://www.codeplex.com/EPPlus for details. | 
|  | * | 
|  | * Copyright (C) 2011  Jan Källman | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  |  | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | * See the GNU Lesser General Public License for more details. | 
|  | * | 
|  | * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php | 
|  | * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html | 
|  | * | 
|  | * All code and executables are provided "as is" with no warranty either express or implied. | 
|  | * The author accepts no liability for any damage or loss of business that this product may cause. | 
|  | * | 
|  | * Code change notes: | 
|  | * | 
|  | * Author							Change						Date | 
|  | * ****************************************************************************** | 
|  | * Jan Källman		                Initial Release		        2009-10-01 | 
|  | * Jan Källman		License changed GPL-->LGPL 2011-12-16 | 
|  | *******************************************************************************/ | 
|  | using System; | 
|  | using System.Collections.Generic; | 
|  | using System.Globalization; | 
|  | using System.Text; | 
|  | using System.Xml; | 
|  | using System.Drawing; | 
|  | namespace OfficeOpenXml.Style.XmlAccess | 
|  | { | 
|  | /// <summary> | 
|  | /// Xml access class xfs records. This is the top level style object. | 
|  | /// </summary> | 
|  | public sealed class ExcelXfs : StyleXmlHelper | 
|  | { | 
|  | ExcelStyles _styles; | 
|  | internal ExcelXfs(XmlNamespaceManager nameSpaceManager, ExcelStyles styles) : base(nameSpaceManager) | 
|  | { | 
|  | _styles = styles; | 
|  | isBuildIn = false; | 
|  | } | 
|  | internal ExcelXfs(XmlNamespaceManager nsm, XmlNode topNode, ExcelStyles styles) : | 
|  | base(nsm, topNode) | 
|  | { | 
|  | _styles = styles; | 
|  | _xfID = GetXmlNodeInt("@xfId"); | 
|  | if (_xfID == 0) isBuildIn = true; //Normal taggen | 
|  | _numFmtId = GetXmlNodeInt("@numFmtId"); | 
|  | _fontId = GetXmlNodeInt("@fontId"); | 
|  | _fillId = GetXmlNodeInt("@fillId"); | 
|  | _borderId = GetXmlNodeInt("@borderId"); | 
|  | _readingOrder = GetReadingOrder(GetXmlNodeString(readingOrderPath)); | 
|  | _indent = GetXmlNodeInt(indentPath); | 
|  | _shrinkToFit = GetXmlNodeString(shrinkToFitPath) == "1" ? true : false; | 
|  | _verticalAlignment = GetVerticalAlign(GetXmlNodeString(verticalAlignPath)); | 
|  | _horizontalAlignment = GetHorizontalAlign(GetXmlNodeString(horizontalAlignPath)); | 
|  | _wrapText = GetXmlNodeBool(wrapTextPath); | 
|  | _textRotation = GetXmlNodeInt(textRotationPath); | 
|  | _hidden = GetXmlNodeBool(hiddenPath); | 
|  | _locked = GetXmlNodeBool(lockedPath,true); | 
|  | } | 
|  |  | 
|  | private ExcelReadingOrder GetReadingOrder(string value) | 
|  | { | 
|  | switch(value) | 
|  | { | 
|  | case "1": | 
|  | return ExcelReadingOrder.LeftToRight; | 
|  | case "2": | 
|  | return ExcelReadingOrder.RightToLeft; | 
|  | default: | 
|  | return ExcelReadingOrder.ContextDependent; | 
|  | } | 
|  | } | 
|  |  | 
|  | private ExcelHorizontalAlignment GetHorizontalAlign(string align) | 
|  | { | 
|  | if (align == "") return ExcelHorizontalAlignment.General; | 
|  | align = align.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture) + align.Substring(1, align.Length - 1); | 
|  | try | 
|  | { | 
|  | return (ExcelHorizontalAlignment)Enum.Parse(typeof(ExcelHorizontalAlignment), align); | 
|  | } | 
|  | catch | 
|  | { | 
|  | return ExcelHorizontalAlignment.General; | 
|  | } | 
|  | } | 
|  |  | 
|  | private ExcelVerticalAlignment GetVerticalAlign(string align) | 
|  | { | 
|  | if (align == "") return ExcelVerticalAlignment.Bottom; | 
|  | align = align.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture) + align.Substring(1, align.Length - 1); | 
|  | try | 
|  | { | 
|  | return (ExcelVerticalAlignment)Enum.Parse(typeof(ExcelVerticalAlignment), align); | 
|  | } | 
|  | catch | 
|  | { | 
|  | return ExcelVerticalAlignment.Bottom; | 
|  | } | 
|  | } | 
|  | internal void Xf_ChangedEvent(object sender, EventArgs e) | 
|  | { | 
|  | //if (_cell != null) | 
|  | //{ | 
|  | //    if (!Styles.ChangedCells.ContainsKey(_cell.Id)) | 
|  | //    { | 
|  | //        //_cell.Style = ""; | 
|  | //        _cell.SetNewStyleID(int.MinValue.ToString()); | 
|  | //        Styles.ChangedCells.Add(_cell.Id, _cell); | 
|  | //    } | 
|  | //} | 
|  | } | 
|  | int _xfID; | 
|  | /// <summary> | 
|  | /// Style index | 
|  | /// </summary> | 
|  | public int XfId | 
|  | { | 
|  | get | 
|  | { | 
|  | return _xfID; | 
|  | } | 
|  | set | 
|  | { | 
|  | _xfID = value; | 
|  | } | 
|  | } | 
|  | #region Internal Properties | 
|  | int _numFmtId; | 
|  | internal int NumberFormatId | 
|  | { | 
|  | get | 
|  | { | 
|  | return _numFmtId; | 
|  | } | 
|  | set | 
|  | { | 
|  | _numFmtId = value; | 
|  | ApplyNumberFormat = (value>0); | 
|  | } | 
|  | } | 
|  | int _fontId; | 
|  | internal int FontId | 
|  | { | 
|  | get | 
|  | { | 
|  | return _fontId; | 
|  | } | 
|  | set | 
|  | { | 
|  | _fontId = value; | 
|  | } | 
|  | } | 
|  | int _fillId; | 
|  | internal int FillId | 
|  | { | 
|  | get | 
|  | { | 
|  | return _fillId; | 
|  | } | 
|  | set | 
|  | { | 
|  | _fillId = value; | 
|  | } | 
|  | } | 
|  | int _borderId; | 
|  | internal int BorderId | 
|  | { | 
|  | get | 
|  | { | 
|  | return _borderId; | 
|  | } | 
|  | set | 
|  | { | 
|  | _borderId = value; | 
|  | } | 
|  | } | 
|  | private bool isBuildIn | 
|  | { | 
|  | get; | 
|  | set; | 
|  | } | 
|  | internal bool ApplyNumberFormat | 
|  | { | 
|  | get; | 
|  | set; | 
|  | } | 
|  | internal bool ApplyFont | 
|  | { | 
|  | get; | 
|  | set; | 
|  | } | 
|  | internal bool ApplyFill | 
|  | { | 
|  | get; | 
|  | set; | 
|  | } | 
|  | internal bool ApplyBorder | 
|  | { | 
|  | get; | 
|  | set; | 
|  | } | 
|  | internal bool ApplyAlignment | 
|  | { | 
|  | get; | 
|  | set; | 
|  | } | 
|  | internal bool ApplyProtection | 
|  | { | 
|  | get; | 
|  | set; | 
|  | } | 
|  | #endregion | 
|  | #region Public Properties | 
|  | public ExcelStyles Styles { get; private set; } | 
|  | /// <summary> | 
|  | /// Numberformat properties | 
|  | /// </summary> | 
|  | public ExcelNumberFormatXml Numberformat | 
|  | { | 
|  | get | 
|  | { | 
|  | return _styles.NumberFormats[_numFmtId < 0 ? 0 : _numFmtId]; | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// Font properties | 
|  | /// </summary> | 
|  | public ExcelFontXml Font | 
|  | { | 
|  | get | 
|  | { | 
|  | return _styles.Fonts[_fontId < 0 ? 0 : _fontId]; | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// Fill properties | 
|  | /// </summary> | 
|  | public ExcelFillXml Fill | 
|  | { | 
|  | get | 
|  | { | 
|  | return _styles.Fills[_fillId < 0 ? 0 : _fillId]; | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// Border style properties | 
|  | /// </summary> | 
|  | public ExcelBorderXml Border | 
|  | { | 
|  | get | 
|  | { | 
|  | return _styles.Borders[_borderId < 0 ? 0 : _borderId]; | 
|  | } | 
|  | } | 
|  | const string horizontalAlignPath = "d:alignment/@horizontal"; | 
|  | ExcelHorizontalAlignment _horizontalAlignment = ExcelHorizontalAlignment.General; | 
|  | /// <summary> | 
|  | /// Horizontal alignment | 
|  | /// </summary> | 
|  | public ExcelHorizontalAlignment HorizontalAlignment | 
|  | { | 
|  | get | 
|  | { | 
|  | return _horizontalAlignment; | 
|  | } | 
|  | set | 
|  | { | 
|  | _horizontalAlignment = value; | 
|  | } | 
|  | } | 
|  | const string verticalAlignPath = "d:alignment/@vertical"; | 
|  | ExcelVerticalAlignment _verticalAlignment=ExcelVerticalAlignment.Bottom; | 
|  | /// <summary> | 
|  | /// Vertical alignment | 
|  | /// </summary> | 
|  | public ExcelVerticalAlignment VerticalAlignment | 
|  | { | 
|  | get | 
|  | { | 
|  | return _verticalAlignment; | 
|  | } | 
|  | set | 
|  | { | 
|  | _verticalAlignment = value; | 
|  | } | 
|  | } | 
|  | const string wrapTextPath = "d:alignment/@wrapText"; | 
|  | bool _wrapText=false; | 
|  | /// <summary> | 
|  | /// Wraped text | 
|  | /// </summary> | 
|  | public bool WrapText | 
|  | { | 
|  | get | 
|  | { | 
|  | return _wrapText; | 
|  | } | 
|  | set | 
|  | { | 
|  | _wrapText = value; | 
|  | } | 
|  | } | 
|  | string textRotationPath = "d:alignment/@textRotation"; | 
|  | int _textRotation = 0; | 
|  | /// <summary> | 
|  | /// Text rotation angle | 
|  | /// </summary> | 
|  | public int TextRotation | 
|  | { | 
|  | get | 
|  | { | 
|  | return (_textRotation == int.MinValue ? 0 : _textRotation); | 
|  | } | 
|  | set | 
|  | { | 
|  | _textRotation = value; | 
|  | } | 
|  | } | 
|  | const string lockedPath = "d:protection/@locked"; | 
|  | bool _locked = true; | 
|  | /// <summary> | 
|  | /// Locked when sheet is protected | 
|  | /// </summary> | 
|  | public bool Locked | 
|  | { | 
|  | get | 
|  | { | 
|  | return _locked; | 
|  | } | 
|  | set | 
|  | { | 
|  | _locked = value; | 
|  | } | 
|  | } | 
|  | const string hiddenPath = "d:protection/@hidden"; | 
|  | bool _hidden = false; | 
|  | /// <summary> | 
|  | /// Hide formulas when sheet is protected | 
|  | /// </summary> | 
|  | public bool Hidden | 
|  | { | 
|  | get | 
|  | { | 
|  | return _hidden; | 
|  | } | 
|  | set | 
|  | { | 
|  | _hidden = value; | 
|  | } | 
|  | } | 
|  | const string readingOrderPath = "d:alignment/@readingOrder"; | 
|  | ExcelReadingOrder _readingOrder = ExcelReadingOrder.ContextDependent; | 
|  | /// <summary> | 
|  | /// Readingorder | 
|  | /// </summary> | 
|  | public ExcelReadingOrder ReadingOrder | 
|  | { | 
|  | get | 
|  | { | 
|  | return _readingOrder; | 
|  | } | 
|  | set | 
|  | { | 
|  | _readingOrder = value; | 
|  | } | 
|  | } | 
|  | const string shrinkToFitPath = "d:alignment/@shrinkToFit"; | 
|  | bool _shrinkToFit = false; | 
|  | /// <summary> | 
|  | /// Shrink to fit | 
|  | /// </summary> | 
|  | public bool ShrinkToFit | 
|  | { | 
|  | get | 
|  | { | 
|  | return _shrinkToFit; | 
|  | } | 
|  | set | 
|  | { | 
|  | _shrinkToFit = value; | 
|  | } | 
|  | } | 
|  | const string indentPath = "d:alignment/@indent"; | 
|  | int _indent = 0; | 
|  | /// <summary> | 
|  | /// Indentation | 
|  | /// </summary> | 
|  | public int Indent | 
|  | { | 
|  | get | 
|  | { | 
|  | return (_indent == int.MinValue ? 0 : _indent); | 
|  | } | 
|  | set | 
|  | { | 
|  | _indent=value; | 
|  | } | 
|  | } | 
|  | #endregion | 
|  | internal void RegisterEvent(ExcelXfs xf) | 
|  | { | 
|  | //                RegisterEvent(xf, xf.Xf_ChangedEvent); | 
|  | } | 
|  | internal override string Id | 
|  | { | 
|  |  | 
|  | get | 
|  | { | 
|  | return XfId + "|" + NumberFormatId.ToString() + "|" + FontId.ToString() + "|" + FillId.ToString() + "|" + BorderId.ToString() + VerticalAlignment.ToString() + "|" + HorizontalAlignment.ToString() + "|" + WrapText.ToString() + "|" + ReadingOrder.ToString() + "|" + isBuildIn.ToString() + TextRotation.ToString() + Locked.ToString() + Hidden.ToString() + ShrinkToFit.ToString() + Indent.ToString(); | 
|  | //return Numberformat.Id + "|" + Font.Id + "|" + Fill.Id + "|" + Border.Id + VerticalAlignment.ToString() + "|" + HorizontalAlignment.ToString() + "|" + WrapText.ToString() + "|" + ReadingOrder.ToString(); | 
|  | } | 
|  | } | 
|  | internal ExcelXfs Copy() | 
|  | { | 
|  | return Copy(_styles); | 
|  | } | 
|  | internal ExcelXfs Copy(ExcelStyles styles) | 
|  | { | 
|  | ExcelXfs newXF = new ExcelXfs(NameSpaceManager, styles); | 
|  | newXF.NumberFormatId = _numFmtId; | 
|  | newXF.FontId = _fontId; | 
|  | newXF.FillId = _fillId; | 
|  | newXF.BorderId = _borderId; | 
|  | newXF.XfId = _xfID; | 
|  | newXF.ReadingOrder = _readingOrder; | 
|  | newXF.HorizontalAlignment = _horizontalAlignment; | 
|  | newXF.VerticalAlignment = _verticalAlignment; | 
|  | newXF.WrapText = _wrapText; | 
|  | newXF.ShrinkToFit = _shrinkToFit; | 
|  | newXF.Indent = _indent; | 
|  | newXF.TextRotation = _textRotation; | 
|  | newXF.Locked = _locked; | 
|  | newXF.Hidden = _hidden; | 
|  | return newXF; | 
|  | } | 
|  |  | 
|  | internal int GetNewID(ExcelStyleCollection<ExcelXfs> xfsCol, StyleBase styleObject, eStyleClass styleClass, eStyleProperty styleProperty, object value) | 
|  | { | 
|  | ExcelXfs newXfs = this.Copy(); | 
|  | switch(styleClass) | 
|  | { | 
|  | case eStyleClass.Numberformat: | 
|  | newXfs.NumberFormatId = GetIdNumberFormat(styleProperty, value); | 
|  | styleObject.SetIndex(newXfs.NumberFormatId); | 
|  | break; | 
|  | case eStyleClass.Font: | 
|  | { | 
|  | newXfs.FontId = GetIdFont(styleProperty, value); | 
|  | styleObject.SetIndex(newXfs.FontId); | 
|  | break; | 
|  | } | 
|  | case eStyleClass.Fill: | 
|  | case eStyleClass.FillBackgroundColor: | 
|  | case eStyleClass.FillPatternColor: | 
|  | newXfs.FillId = GetIdFill(styleClass, styleProperty, value); | 
|  | styleObject.SetIndex(newXfs.FillId); | 
|  | break; | 
|  | case eStyleClass.GradientFill: | 
|  | case eStyleClass.FillGradientColor1: | 
|  | case eStyleClass.FillGradientColor2: | 
|  | newXfs.FillId = GetIdGradientFill(styleClass, styleProperty, value); | 
|  | styleObject.SetIndex(newXfs.FillId); | 
|  | break; | 
|  | case eStyleClass.Border: | 
|  | case eStyleClass.BorderBottom: | 
|  | case eStyleClass.BorderDiagonal: | 
|  | case eStyleClass.BorderLeft: | 
|  | case eStyleClass.BorderRight: | 
|  | case eStyleClass.BorderTop: | 
|  | newXfs.BorderId = GetIdBorder(styleClass, styleProperty, value); | 
|  | styleObject.SetIndex(newXfs.BorderId); | 
|  | break; | 
|  | case eStyleClass.Style: | 
|  | switch(styleProperty) | 
|  | { | 
|  | case eStyleProperty.XfId: | 
|  | newXfs.XfId = (int)value; | 
|  | break; | 
|  | case eStyleProperty.HorizontalAlign: | 
|  | newXfs.HorizontalAlignment=(ExcelHorizontalAlignment)value; | 
|  | break; | 
|  | case eStyleProperty.VerticalAlign: | 
|  | newXfs.VerticalAlignment = (ExcelVerticalAlignment)value; | 
|  | break; | 
|  | case eStyleProperty.WrapText: | 
|  | newXfs.WrapText = (bool)value; | 
|  | break; | 
|  | case eStyleProperty.ReadingOrder: | 
|  | newXfs.ReadingOrder = (ExcelReadingOrder)value; | 
|  | break; | 
|  | case eStyleProperty.ShrinkToFit: | 
|  | newXfs.ShrinkToFit=(bool)value; | 
|  | break; | 
|  | case eStyleProperty.Indent: | 
|  | newXfs.Indent = (int)value; | 
|  | break; | 
|  | case eStyleProperty.TextRotation: | 
|  | newXfs.TextRotation = (int)value; | 
|  | break; | 
|  | case eStyleProperty.Locked: | 
|  | newXfs.Locked = (bool)value; | 
|  | break; | 
|  | case eStyleProperty.Hidden: | 
|  | newXfs.Hidden = (bool)value; | 
|  | break; | 
|  | default: | 
|  | throw (new Exception("Invalid property for class style.")); | 
|  |  | 
|  | } | 
|  | break; | 
|  | default: | 
|  | break; | 
|  | } | 
|  | int id = xfsCol.FindIndexByID(newXfs.Id); | 
|  | if (id < 0) | 
|  | { | 
|  | return xfsCol.Add(newXfs.Id, newXfs); | 
|  | } | 
|  | return id; | 
|  | } | 
|  |  | 
|  | private int GetIdBorder(eStyleClass styleClass, eStyleProperty styleProperty, object value) | 
|  | { | 
|  | ExcelBorderXml border = Border.Copy(); | 
|  |  | 
|  | switch (styleClass) | 
|  | { | 
|  | case eStyleClass.BorderBottom: | 
|  | SetBorderItem(border.Bottom, styleProperty, value); | 
|  | break; | 
|  | case eStyleClass.BorderDiagonal: | 
|  | SetBorderItem(border.Diagonal, styleProperty, value); | 
|  | break; | 
|  | case eStyleClass.BorderLeft: | 
|  | SetBorderItem(border.Left, styleProperty, value); | 
|  | break; | 
|  | case eStyleClass.BorderRight: | 
|  | SetBorderItem(border.Right, styleProperty, value); | 
|  | break; | 
|  | case eStyleClass.BorderTop: | 
|  | SetBorderItem(border.Top, styleProperty, value); | 
|  | break; | 
|  | case eStyleClass.Border: | 
|  | if (styleProperty == eStyleProperty.BorderDiagonalUp) | 
|  | { | 
|  | border.DiagonalUp = (bool)value; | 
|  | } | 
|  | else if (styleProperty == eStyleProperty.BorderDiagonalDown) | 
|  | { | 
|  | border.DiagonalDown = (bool)value; | 
|  | } | 
|  | else | 
|  | { | 
|  | throw (new Exception("Invalid property for class Border.")); | 
|  | } | 
|  | break; | 
|  | default: | 
|  | throw (new Exception("Invalid class/property for class Border.")); | 
|  | } | 
|  | int subId; | 
|  | string id = border.Id; | 
|  | subId = _styles.Borders.FindIndexByID(id); | 
|  | if (subId == int.MinValue) | 
|  | { | 
|  | return _styles.Borders.Add(id, border); | 
|  | } | 
|  | return subId; | 
|  | } | 
|  |  | 
|  | private void SetBorderItem(ExcelBorderItemXml excelBorderItem, eStyleProperty styleProperty, object value) | 
|  | { | 
|  | if(styleProperty==eStyleProperty.Style) | 
|  | { | 
|  | excelBorderItem.Style = (ExcelBorderStyle)value; | 
|  | } | 
|  | else if (styleProperty == eStyleProperty.Color || styleProperty== eStyleProperty.Tint || styleProperty==eStyleProperty.IndexedColor) | 
|  | { | 
|  | if (excelBorderItem.Style == ExcelBorderStyle.None) | 
|  | { | 
|  | throw(new Exception("Can't set bordercolor when style is not set.")); | 
|  | } | 
|  | excelBorderItem.Color.Rgb = value.ToString(); | 
|  | } | 
|  | } | 
|  |  | 
|  | private int GetIdFill(eStyleClass styleClass, eStyleProperty styleProperty, object value) | 
|  | { | 
|  | ExcelFillXml fill = Fill.Copy(); | 
|  |  | 
|  | switch (styleProperty) | 
|  | { | 
|  | case eStyleProperty.PatternType: | 
|  | if (fill is ExcelGradientFillXml) | 
|  | { | 
|  | fill = new ExcelFillXml(NameSpaceManager); | 
|  | } | 
|  | fill.PatternType = (ExcelFillStyle)value; | 
|  | break; | 
|  | case eStyleProperty.Color: | 
|  | case eStyleProperty.Tint: | 
|  | case eStyleProperty.IndexedColor: | 
|  | case eStyleProperty.AutoColor: | 
|  | if (fill is ExcelGradientFillXml) | 
|  | { | 
|  | fill = new ExcelFillXml(NameSpaceManager); | 
|  | } | 
|  | if (fill.PatternType == ExcelFillStyle.None) | 
|  | { | 
|  | throw (new ArgumentException("Can't set color when patterntype is not set.")); | 
|  | } | 
|  | ExcelColorXml destColor; | 
|  | if (styleClass==eStyleClass.FillPatternColor) | 
|  | { | 
|  | destColor = fill.PatternColor; | 
|  | } | 
|  | else | 
|  | { | 
|  | destColor = fill.BackgroundColor; | 
|  | } | 
|  |  | 
|  | if (styleProperty == eStyleProperty.Color) | 
|  | { | 
|  | destColor.Rgb = value.ToString(); | 
|  | } | 
|  | else if (styleProperty == eStyleProperty.Tint) | 
|  | { | 
|  | destColor.Tint = (decimal)value; | 
|  | } | 
|  | else if (styleProperty == eStyleProperty.IndexedColor) | 
|  | { | 
|  | destColor.Indexed = (int)value; | 
|  | } | 
|  | else | 
|  | { | 
|  | destColor.Auto = (bool)value; | 
|  | } | 
|  |  | 
|  | break; | 
|  | default: | 
|  | throw (new ArgumentException("Invalid class/property for class Fill.")); | 
|  | } | 
|  | int subId; | 
|  | string id = fill.Id; | 
|  | subId = _styles.Fills.FindIndexByID(id); | 
|  | if (subId == int.MinValue) | 
|  | { | 
|  | return _styles.Fills.Add(id, fill); | 
|  | } | 
|  | return subId; | 
|  | } | 
|  | private int GetIdGradientFill(eStyleClass styleClass, eStyleProperty styleProperty, object value) | 
|  | { | 
|  | ExcelGradientFillXml fill; | 
|  | if(Fill is ExcelGradientFillXml) | 
|  | { | 
|  | fill = (ExcelGradientFillXml)Fill.Copy(); | 
|  | } | 
|  | else | 
|  | { | 
|  | fill = new ExcelGradientFillXml(Fill.NameSpaceManager); | 
|  | fill.GradientColor1.SetColor(Color.White); | 
|  | fill.GradientColor2.SetColor(Color.FromArgb(79,129,189)); | 
|  | fill.Type=ExcelFillGradientType.Linear; | 
|  | fill.Degree=90; | 
|  | fill.Top = double.NaN; | 
|  | fill.Bottom = double.NaN; | 
|  | fill.Left = double.NaN; | 
|  | fill.Right = double.NaN; | 
|  | } | 
|  |  | 
|  | switch (styleProperty) | 
|  | { | 
|  | case eStyleProperty.GradientType: | 
|  | fill.Type = (ExcelFillGradientType)value; | 
|  | break; | 
|  | case eStyleProperty.GradientDegree: | 
|  | fill.Degree = (double)value; | 
|  | break; | 
|  | case eStyleProperty.GradientTop: | 
|  | fill.Top = (double)value; | 
|  | break; | 
|  | case eStyleProperty.GradientBottom: | 
|  | fill.Bottom = (double)value; | 
|  | break; | 
|  | case eStyleProperty.GradientLeft: | 
|  | fill.Left = (double)value; | 
|  | break; | 
|  | case eStyleProperty.GradientRight: | 
|  | fill.Right = (double)value; | 
|  | break; | 
|  | case eStyleProperty.Color: | 
|  | case eStyleProperty.Tint: | 
|  | case eStyleProperty.IndexedColor: | 
|  | case eStyleProperty.AutoColor: | 
|  | ExcelColorXml destColor; | 
|  |  | 
|  | if (styleClass == eStyleClass.FillGradientColor1) | 
|  | { | 
|  | destColor = fill.GradientColor1; | 
|  | } | 
|  | else | 
|  | { | 
|  | destColor = fill.GradientColor2; | 
|  | } | 
|  |  | 
|  | if (styleProperty == eStyleProperty.Color) | 
|  | { | 
|  | destColor.Rgb = value.ToString(); | 
|  | } | 
|  | else if (styleProperty == eStyleProperty.Tint) | 
|  | { | 
|  | destColor.Tint = (decimal)value; | 
|  | } | 
|  | else if (styleProperty == eStyleProperty.IndexedColor) | 
|  | { | 
|  | destColor.Indexed = (int)value; | 
|  | } | 
|  | else | 
|  | { | 
|  | destColor.Auto = (bool)value; | 
|  | } | 
|  | break; | 
|  | default: | 
|  | throw (new ArgumentException("Invalid class/property for class Fill.")); | 
|  | } | 
|  | int subId; | 
|  | string id = fill.Id; | 
|  | subId = _styles.Fills.FindIndexByID(id); | 
|  | if (subId == int.MinValue) | 
|  | { | 
|  | return _styles.Fills.Add(id, fill); | 
|  | } | 
|  | return subId; | 
|  | } | 
|  |  | 
|  | private int GetIdNumberFormat(eStyleProperty styleProperty, object value) | 
|  | { | 
|  | if (styleProperty == eStyleProperty.Format) | 
|  | { | 
|  | ExcelNumberFormatXml item=null; | 
|  | if (!_styles.NumberFormats.FindByID(value.ToString(), ref item)) | 
|  | { | 
|  | item = new ExcelNumberFormatXml(NameSpaceManager) { Format = value.ToString(), NumFmtId = _styles.NumberFormats.NextId++ }; | 
|  | _styles.NumberFormats.Add(value.ToString(), item); | 
|  | } | 
|  | return item.NumFmtId; | 
|  | } | 
|  | else | 
|  | { | 
|  | throw (new Exception("Invalid property for class Numberformat")); | 
|  | } | 
|  | } | 
|  | private int GetIdFont(eStyleProperty styleProperty, object value) | 
|  | { | 
|  | ExcelFontXml fnt = Font.Copy(); | 
|  |  | 
|  | switch (styleProperty) | 
|  | { | 
|  | case eStyleProperty.Name: | 
|  | fnt.Name = value.ToString(); | 
|  | break; | 
|  | case eStyleProperty.Size: | 
|  | fnt.Size = (float)value; | 
|  | break; | 
|  | case eStyleProperty.Family: | 
|  | fnt.Family = (int)value; | 
|  | break; | 
|  | case eStyleProperty.Bold: | 
|  | fnt.Bold = (bool)value; | 
|  | break; | 
|  | case eStyleProperty.Italic: | 
|  | fnt.Italic = (bool)value; | 
|  | break; | 
|  | case eStyleProperty.Strike: | 
|  | fnt.Strike = (bool)value; | 
|  | break; | 
|  | case eStyleProperty.UnderlineType: | 
|  | fnt.UnderLineType = (ExcelUnderLineType)value; | 
|  | break; | 
|  | case eStyleProperty.Color: | 
|  | fnt.Color.Rgb=value.ToString(); | 
|  | break; | 
|  | case eStyleProperty.VerticalAlign: | 
|  | fnt.VerticalAlign = ((ExcelVerticalAlignmentFont)value) == ExcelVerticalAlignmentFont.None ? "" : value.ToString().ToLower(CultureInfo.InvariantCulture); | 
|  | break; | 
|  | default: | 
|  | throw (new Exception("Invalid property for class Font")); | 
|  | } | 
|  | int subId; | 
|  | string id = fnt.Id; | 
|  | subId = _styles.Fonts.FindIndexByID(id); | 
|  | if (subId == int.MinValue) | 
|  | { | 
|  | return _styles.Fonts.Add(id,fnt); | 
|  | } | 
|  | return subId; | 
|  | } | 
|  | internal override XmlNode CreateXmlNode(XmlNode topNode) | 
|  | { | 
|  | return CreateXmlNode(topNode, false); | 
|  | } | 
|  | internal XmlNode CreateXmlNode(XmlNode topNode, bool isCellStyleXsf) | 
|  | { | 
|  | TopNode = topNode; | 
|  | var doSetXfId = (!isCellStyleXsf && _xfID > int.MinValue && _styles.CellStyleXfs.Count > 0 && _styles.CellStyleXfs[_xfID].newID > int.MinValue); | 
|  | if (_numFmtId > 0) | 
|  | { | 
|  | SetXmlNodeString("@numFmtId", _numFmtId.ToString()); | 
|  | if(doSetXfId) SetXmlNodeString("@applyNumberFormat", "1"); | 
|  | } | 
|  | if (_fontId >= 0) | 
|  | { | 
|  | SetXmlNodeString("@fontId", _styles.Fonts[_fontId].newID.ToString()); | 
|  | if (doSetXfId) SetXmlNodeString("@applyFont", "1"); | 
|  | } | 
|  | if (_fillId >= 0) | 
|  | { | 
|  | SetXmlNodeString("@fillId", _styles.Fills[_fillId].newID.ToString()); | 
|  | if (doSetXfId) SetXmlNodeString("@applyFill", "1"); | 
|  | } | 
|  | if (_borderId >= 0) | 
|  | { | 
|  | SetXmlNodeString("@borderId", _styles.Borders[_borderId].newID.ToString()); | 
|  | if (doSetXfId) SetXmlNodeString("@applyBorder", "1"); | 
|  | } | 
|  | if(_horizontalAlignment != ExcelHorizontalAlignment.General) this.SetXmlNodeString(horizontalAlignPath, SetAlignString(_horizontalAlignment)); | 
|  | if (doSetXfId) | 
|  | { | 
|  | SetXmlNodeString("@xfId", _styles.CellStyleXfs[_xfID].newID.ToString()); | 
|  | } | 
|  | if (_verticalAlignment != ExcelVerticalAlignment.Bottom) this.SetXmlNodeString(verticalAlignPath, SetAlignString(_verticalAlignment)); | 
|  | if(_wrapText) this.SetXmlNodeString(wrapTextPath, "1"); | 
|  | if(_readingOrder!=ExcelReadingOrder.ContextDependent) this.SetXmlNodeString(readingOrderPath, ((int)_readingOrder).ToString()); | 
|  | if (_shrinkToFit) this.SetXmlNodeString(shrinkToFitPath, "1"); | 
|  | if (_indent > 0) SetXmlNodeString(indentPath, _indent.ToString()); | 
|  | if (_textRotation > 0) this.SetXmlNodeString(textRotationPath, _textRotation.ToString()); | 
|  | if (!_locked) this.SetXmlNodeString(lockedPath, "0"); | 
|  | if (_hidden) this.SetXmlNodeString(hiddenPath, "1"); | 
|  | return TopNode; | 
|  | } | 
|  |  | 
|  | private string SetAlignString(Enum align) | 
|  | { | 
|  | string newName = Enum.GetName(align.GetType(), align); | 
|  | return newName.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + newName.Substring(1, newName.Length - 1); | 
|  | } | 
|  | } | 
|  | } |