using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Xml; using System.Drawing; namespace OfficeOpenXml.Style.Dxf { public class ExcelDxfStyleConditionalFormatting : DxfStyleBase { XmlHelperInstance _helper; internal ExcelDxfStyleConditionalFormatting(XmlNamespaceManager nameSpaceManager, XmlNode topNode, ExcelStyles styles) : base(styles) { NumberFormat = new ExcelDxfNumberFormat(_styles); Font = new ExcelDxfFontBase(_styles); Border = new ExcelDxfBorderBase(_styles); Fill = new ExcelDxfFill(_styles); if (topNode != null) { _helper = new XmlHelperInstance(nameSpaceManager, topNode); NumberFormat.NumFmtID = _helper.GetXmlNodeInt("d:numFmt/@numFmtId"); NumberFormat.Format = _helper.GetXmlNodeString("d:numFmt/@formatCode"); if (NumberFormat.NumFmtID < 164 && string.IsNullOrEmpty(NumberFormat.Format)) { NumberFormat.Format = ExcelNumberFormat.GetFromBuildInFromID(NumberFormat.NumFmtID); } Font.Bold = _helper.GetXmlNodeBoolNullable("d:font/d:b/@val"); Font.Italic = _helper.GetXmlNodeBoolNullable("d:font/d:i/@val"); Font.Strike = _helper.GetXmlNodeBoolNullable("d:font/d:strike"); Font.Underline = GetUnderLineEnum(_helper.GetXmlNodeString("d:font/d:u/@val")); Font.Color = GetColor(_helper, "d:font/d:color"); Border.Left = GetBorderItem(_helper, "d:border/d:left"); Border.Right = GetBorderItem(_helper, "d:border/d:right"); Border.Bottom = GetBorderItem(_helper, "d:border/d:bottom"); Border.Top = GetBorderItem(_helper, "d:border/d:top"); Fill.PatternType = GetPatternTypeEnum(_helper.GetXmlNodeString("d:fill/d:patternFill/@patternType")); Fill.BackgroundColor = GetColor(_helper, "d:fill/d:patternFill/d:bgColor/"); Fill.PatternColor = GetColor(_helper, "d:fill/d:patternFill/d:fgColor/"); } else { _helper = new XmlHelperInstance(nameSpaceManager); } _helper.SchemaNodeOrder = new string[] { "font", "numFmt", "fill", "border" }; } private ExcelDxfBorderItem GetBorderItem(XmlHelperInstance helper, string path) { ExcelDxfBorderItem bi = new ExcelDxfBorderItem(_styles); bi.Style = GetBorderStyleEnum(helper.GetXmlNodeString(path+"/@style")); bi.Color = GetColor(helper, path+"/d:color"); return bi; } private ExcelBorderStyle GetBorderStyleEnum(string style) { if (style == "") return ExcelBorderStyle.None; string sInStyle = style.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture) + style.Substring(1, style.Length - 1); try { return (ExcelBorderStyle)Enum.Parse(typeof(ExcelBorderStyle), sInStyle); } catch { return ExcelBorderStyle.None; } } private ExcelFillStyle GetPatternTypeEnum(string patternType) { if (patternType == "") return ExcelFillStyle.None; patternType = patternType.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture) + patternType.Substring(1, patternType.Length - 1); try { return (ExcelFillStyle)Enum.Parse(typeof(ExcelFillStyle), patternType); } catch { return ExcelFillStyle.None; } } private ExcelDxfColor GetColor(XmlHelperInstance helper, string path) { ExcelDxfColor ret = new ExcelDxfColor(_styles); ret.Theme = helper.GetXmlNodeIntNull(path + "/@theme"); ret.Index = helper.GetXmlNodeIntNull(path + "/@indexed"); string rgb=helper.GetXmlNodeString(path + "/@rgb"); if(rgb!="") { ret.Color = Color.FromArgb( int.Parse(rgb.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier), int.Parse(rgb.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier), int.Parse(rgb.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier), int.Parse(rgb.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier)); } ret.Auto = helper.GetXmlNodeBoolNullable(path + "/@auto"); ret.Tint = helper.GetXmlNodeDoubleNull(path + "/@tint"); return ret; } private ExcelUnderLineType? GetUnderLineEnum(string value) { switch(value.ToLower(CultureInfo.InvariantCulture)) { case "single": return ExcelUnderLineType.Single; case "double": return ExcelUnderLineType.Double; case "singleaccounting": return ExcelUnderLineType.SingleAccounting; case "doubleaccounting": return ExcelUnderLineType.DoubleAccounting; default: return null; } } internal int DxfId { get; set; } public ExcelDxfFontBase Font { get; set; } public ExcelDxfNumberFormat NumberFormat { get; set; } public ExcelDxfFill Fill { get; set; } public ExcelDxfBorderBase Border { get; set; } protected internal override string Id { get { return NumberFormat.Id + Font.Id + Border.Id + Fill.Id + (AllowChange ? "" : DxfId.ToString());//If allowchange is false we add the dxfID to ensure it's not used when conditional formatting is updated); } } protected internal override ExcelDxfStyleConditionalFormatting Clone() { var s=new ExcelDxfStyleConditionalFormatting(_helper.NameSpaceManager, null, _styles); s.Font = Font.Clone(); s.NumberFormat = NumberFormat.Clone(); s.Fill = Fill.Clone(); s.Border = Border.Clone(); return s; } protected internal override void CreateNodes(XmlHelper helper, string path) { if(Font.HasValue) Font.CreateNodes(helper, "d:font"); if (NumberFormat.HasValue) NumberFormat.CreateNodes(helper, "d:numFmt"); if (Fill.HasValue) Fill.CreateNodes(helper, "d:fill"); if (Border.HasValue) Border.CreateNodes(helper, "d:border"); } protected internal override bool HasValue { get { return Font.HasValue || NumberFormat.HasValue || Fill.HasValue || Border.HasValue; } } } }