Пример #1
0
        private void apppendCellShading(byte[] sprmArg, int cellIndex)
        {
            //shading descriptor can have 10 bytes (Word 2000) or 2 bytes (Word 97)
            int shdLength = 2;

            if (sprmArg.Length % 10 == 0)
            {
                shdLength = 10;
            }

            byte[] shdBytes = new byte[shdLength];

            //multiple cell can be formatted with the same SHD.
            //in this case there is only 1 SHD for all cells in the row.
            if ((cellIndex * shdLength) >= sprmArg.Length)
            {
                //use the first SHD
                cellIndex = 0;
            }

            Array.Copy(sprmArg, cellIndex * shdBytes.Length, shdBytes, 0, shdBytes.Length);

            ShadingDescriptor shd = new ShadingDescriptor(shdBytes);

            appendShading(_tcPr, shd);
        }
Пример #2
0
 protected PAPAbstractType()
 {
     this.field_11_lspd          = new LineSpacingDescriptor();
     this.field_11_lspd          = new LineSpacingDescriptor();
     this.field_28_dcs           = new DropCapSpecifier();
     this.field_32_fWidowControl = true;
     this.field_41_lvl           = 9;
     this.field_61_brcTop        = new BorderCode();
     this.field_62_brcLeft       = new BorderCode();
     this.field_63_brcBottom     = new BorderCode();
     this.field_64_brcRight      = new BorderCode();
     this.field_65_brcBetween    = new BorderCode();
     this.field_66_brcBar        = new BorderCode();
     this.field_67_shd           = new ShadingDescriptor();
     this.field_68_anld          = new byte[0];
     this.field_69_phe           = new byte[0];
     this.field_72_dttmPropRMark = new DateAndTime();
     this.field_74_rgdxaTab      = new int[0];
     this.field_75_rgtbd         = new byte[0];
     this.field_76_numrm         = new byte[0];
     this.field_77_ptap          = new byte[0];
 }
        protected void appendShading(XmlElement parent, ShadingDescriptor desc)
        {
            XmlElement shd = _nodeFactory.CreateElement("w", "shd", OpenXmlNamespaces.WordprocessingML);

            //fill color
            XmlAttribute fill = _nodeFactory.CreateAttribute("w", "fill", OpenXmlNamespaces.WordprocessingML);

            if (desc.cvBack != 0)
            {
                fill.Value = new RGBColor((int)desc.cvBack, RGBColor.ByteOrder.RedLast).SixDigitHexCode;
            }
            else
            {
                fill.Value = desc.icoBack.ToString();
            }
            shd.Attributes.Append(fill);

            //foreground color
            XmlAttribute color = _nodeFactory.CreateAttribute("w", "color", OpenXmlNamespaces.WordprocessingML);

            if (desc.cvFore != 0)
            {
                color.Value = new RGBColor((int)desc.cvFore, RGBColor.ByteOrder.RedFirst).SixDigitHexCode;
            }
            else
            {
                color.Value = desc.icoFore.ToString();
            }
            shd.Attributes.Append(color);

            //pattern
            XmlAttribute val = _nodeFactory.CreateAttribute("w", "val", OpenXmlNamespaces.WordprocessingML);

            val.Value = getShadingPattern(desc);
            shd.Attributes.Append(val);

            parent.AppendChild(shd);
        }
        private string getShadingPattern(ShadingDescriptor shd)
        {
            string pattern = "";

            switch (shd.ipat)
            {
            case ShadingDescriptor.ShadingPattern.Automatic:
                pattern = "auto";
                break;

            case ShadingDescriptor.ShadingPattern.Solid:
                pattern = "solid";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_5:
                pattern = "pct5";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_10:
                pattern = "pct10";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_20:
                pattern = "pct20";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_25:
                pattern = "pct25";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_30:
                pattern = "pct30";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_40:
                pattern = "pct40";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_50:
                pattern = "pct50";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_60:
                pattern = "pct60";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_70:
                pattern = "pct70";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_75:
                pattern = "pct75";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_80:
                pattern = "pct80";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_90:
                pattern = "pct90";
                break;

            case ShadingDescriptor.ShadingPattern.DarkHorizontal:
                pattern = "thinHorzStripe";
                break;

            case ShadingDescriptor.ShadingPattern.DarkVertical:
                pattern = "thinVertStripe";
                break;

            case ShadingDescriptor.ShadingPattern.DarkForwardDiagonal:
                break;

            case ShadingDescriptor.ShadingPattern.DarkBackwardDiagonal:
                break;

            case ShadingDescriptor.ShadingPattern.DarkCross:
                break;

            case ShadingDescriptor.ShadingPattern.DarkDiagonalCross:
                pattern = "thinDiagCross";
                break;

            case ShadingDescriptor.ShadingPattern.Horizontal:
                pattern = "horzStripe";
                break;

            case ShadingDescriptor.ShadingPattern.Vertical:
                pattern = "vertStripe";
                break;

            case ShadingDescriptor.ShadingPattern.ForwardDiagonal:
                break;

            case ShadingDescriptor.ShadingPattern.BackwardDiagonal:
                break;

            case ShadingDescriptor.ShadingPattern.Cross:
                break;

            case ShadingDescriptor.ShadingPattern.DiagonalCross:
                pattern = "diagCross";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_2_5:
                pattern = "pct5";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_7_5:
                pattern = "pct10";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_12_5:
                pattern = "pct12";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_15:
                pattern = "pct15";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_17_5:
                pattern = "pct15";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_22_5:
                pattern = "pct20";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_27_5:
                pattern = "pct30";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_32_5:
                pattern = "pct35";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_35:
                pattern = "pct35";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_37_5:
                pattern = "pct37";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_42_5:
                pattern = "pct40";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_45:
                pattern = "pct45";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_47_5:
                pattern = "pct45";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_52_5:
                pattern = "pct50";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_55:
                pattern = "pct55";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_57_5:
                pattern = "pct55";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_62_5:
                pattern = "pct62";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_65:
                pattern = "pct65";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_67_5:
                pattern = "pct65";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_72_5:
                pattern = "pct70";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_77_5:
                pattern = "pct75";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_82_5:
                pattern = "pct80";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_85:
                pattern = "pct85";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_87_5:
                pattern = "pct87";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_92_5:
                pattern = "pct90";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_95:
                pattern = "pct95";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_97_5:
                pattern = "pct95";
                break;

            case ShadingDescriptor.ShadingPattern.Percent_97:
                pattern = "pct95";
                break;

            default:
                pattern = "nil";
                break;
            }
            return(pattern);
        }
Пример #5
0
 /**
  * Set the shd field for the CHP record.
  */
 public void SetShd(ShadingDescriptor field_42_shd)
 {
     this.field_42_shd = field_42_shd;
 }
Пример #6
0
        private void convertSprms(List <SinglePropertyModifier> sprms, XmlElement parent)
        {
            XmlElement   shd      = _nodeFactory.CreateElement("w", "shd", OpenXmlNamespaces.WordprocessingML);
            XmlElement   rFonts   = _nodeFactory.CreateElement("w", "rFonts", OpenXmlNamespaces.WordprocessingML);
            XmlElement   color    = _nodeFactory.CreateElement("w", "color", OpenXmlNamespaces.WordprocessingML);
            XmlAttribute colorVal = _nodeFactory.CreateAttribute("w", "val", OpenXmlNamespaces.WordprocessingML);
            XmlElement   lang     = _nodeFactory.CreateElement("w", "lang", OpenXmlNamespaces.WordprocessingML);

            foreach (SinglePropertyModifier sprm in sprms)
            {
                switch ((int)sprm.OpCode)
                {
                //style id
                case 0x4A30:
                    _currentIstd = System.BitConverter.ToUInt16(sprm.Arguments, 0);
                    appendValueElement(parent, "rStyle", StyleSheetMapping.MakeStyleId(_doc.Styles.Styles[_currentIstd]), true);
                    break;

                //Element flags
                case 0x085A:
                    appendFlagElement(parent, sprm, "rtl", true);
                    break;

                case 0x0835:
                    appendFlagElement(parent, sprm, "b", true);
                    break;

                case 0x085C:
                    appendFlagElement(parent, sprm, "bCs", true);
                    break;

                case 0x083B:
                    appendFlagElement(parent, sprm, "caps", true);;
                    break;

                case 0x0882:
                    appendFlagElement(parent, sprm, "cs", true);
                    break;

                case 0x2A53:
                    appendFlagElement(parent, sprm, "dstrike", true);
                    break;

                case 0x0858:
                    appendFlagElement(parent, sprm, "emboss", true);
                    break;

                case 0x0854:
                    appendFlagElement(parent, sprm, "imprint", true);
                    break;

                case 0x0836:
                    appendFlagElement(parent, sprm, "i", true);
                    break;

                case 0x085D:
                    appendFlagElement(parent, sprm, "iCs", true);
                    break;

                case 0x0875:
                    appendFlagElement(parent, sprm, "noProof", true);
                    break;

                case 0x0838:
                    appendFlagElement(parent, sprm, "outline", true);
                    break;

                case 0x0839:
                    appendFlagElement(parent, sprm, "shadow", true);
                    break;

                case 0x083A:
                    appendFlagElement(parent, sprm, "smallCaps", true);
                    break;

                case 0x0818:
                    appendFlagElement(parent, sprm, "specVanish", true);
                    break;

                case 0x0837:
                    appendFlagElement(parent, sprm, "strike", true);
                    break;

                case 0x083C:
                    appendFlagElement(parent, sprm, "vanish", true);
                    break;

                case 0x0811:
                    appendFlagElement(parent, sprm, "webHidden", true);
                    break;

                case 0x2A48:
                    SuperscriptIndex iss = (SuperscriptIndex)sprm.Arguments[0];
                    appendValueElement(parent, "vertAlign", iss.ToString(), true);
                    break;

                //language
                case 0x486D:
                case 0x4873:
                    //latin
                    LanguageId langid = new LanguageId(System.BitConverter.ToInt16(sprm.Arguments, 0));
                    langid.Convert(new LanguageIdMapping(lang, LanguageIdMapping.LanguageType.Default));
                    break;

                case 0x486E:
                case 0x4874:
                    //east asia
                    langid = new LanguageId(System.BitConverter.ToInt16(sprm.Arguments, 0));
                    langid.Convert(new LanguageIdMapping(lang, LanguageIdMapping.LanguageType.EastAsian));
                    break;

                case 0x485F:
                    //bidi
                    langid = new LanguageId(System.BitConverter.ToInt16(sprm.Arguments, 0));
                    langid.Convert(new LanguageIdMapping(lang, LanguageIdMapping.LanguageType.Complex));
                    break;

                //borders
                case 0x6865:
                case 0xCA72:
                    XmlNode bdr = _nodeFactory.CreateElement("w", "bdr", OpenXmlNamespaces.WordprocessingML);
                    appendBorderAttributes(new BorderCode(sprm.Arguments), bdr);
                    parent.AppendChild(bdr);
                    break;

                //shading
                case 0x4866:
                case 0xCA71:
                    ShadingDescriptor desc = new ShadingDescriptor(sprm.Arguments);
                    appendShading(parent, desc);
                    break;

                //color
                case 0x2A42:
                case 0x4A60:
                    colorVal.Value = ((Global.ColorIdentifier)(sprm.Arguments[0])).ToString();
                    break;

                case 0x6870:
                    //R
                    colorVal.Value = String.Format("{0:x2}", sprm.Arguments[0]);
                    //G
                    colorVal.Value += String.Format("{0:x2}", sprm.Arguments[1]);
                    //B
                    colorVal.Value += String.Format("{0:x2}", sprm.Arguments[2]);
                    break;

                //highlightning
                case 0x2A0C:
                    appendValueElement(parent, "highlight", ((Global.ColorIdentifier)sprm.Arguments[0]).ToString(), true);
                    break;

                //spacing
                case 0x8840:
                    appendValueElement(parent, "spacing", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString(), true);
                    break;

                //font size
                case 0x4A43:
                    appendValueElement(parent, "sz", sprm.Arguments[0].ToString(), true);
                    break;

                case 0x484B:
                    appendValueElement(parent, "kern", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString(), true);
                    break;

                case 0x4A61:
                    appendValueElement(parent, "szCs", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString(), true);
                    break;

                //font family
                case 0x4A4F:
                    XmlAttribute   ascii = _nodeFactory.CreateAttribute("w", "ascii", OpenXmlNamespaces.WordprocessingML);
                    FontFamilyName ffn   = (FontFamilyName)_doc.FontTable.Data[System.BitConverter.ToUInt16(sprm.Arguments, 0)];
                    ascii.Value = ffn.xszFtn;
                    rFonts.Attributes.Append(ascii);
                    break;

                case 0x4A50:
                    XmlAttribute   eastAsia = _nodeFactory.CreateAttribute("w", "eastAsia", OpenXmlNamespaces.WordprocessingML);
                    FontFamilyName ffnAsia  = (FontFamilyName)_doc.FontTable.Data[System.BitConverter.ToUInt16(sprm.Arguments, 0)];
                    eastAsia.Value = ffnAsia.xszFtn;
                    rFonts.Attributes.Append(eastAsia);
                    break;

                case 0x4A51:
                    XmlAttribute   ansi    = _nodeFactory.CreateAttribute("w", "hAnsi", OpenXmlNamespaces.WordprocessingML);
                    FontFamilyName ffnAnsi = (FontFamilyName)_doc.FontTable.Data[System.BitConverter.ToUInt16(sprm.Arguments, 0)];
                    ansi.Value = ffnAnsi.xszFtn;
                    rFonts.Attributes.Append(ansi);
                    break;

                //Underlining
                case 0x2A3E:
                    appendValueElement(parent, "u", lowerFirstChar(((Global.UnderlineCode)sprm.Arguments[0]).ToString()), true);
                    break;

                //char width
                case 0x4852:
                    appendValueElement(parent, "w", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString(), true);
                    break;

                //animation
                case 0x2859:
                    appendValueElement(parent, "effect", ((Global.TextAnimation)sprm.Arguments[0]).ToString(), true);
                    break;

                default:
                    break;
                }
            }

            //apend lang
            if (lang.Attributes.Count > 0)
            {
                parent.AppendChild(lang);
            }

            //append fonts
            if (rFonts.Attributes.Count > 0)
            {
                parent.AppendChild(rFonts);
            }

            //append color
            if (colorVal.Value != "")
            {
                color.Attributes.Append(colorVal);
                parent.AppendChild(color);
            }
        }
        public void Apply(ParagraphPropertyExceptions papx)
        {
            var        ind     = this._nodeFactory.CreateElement("w", "ind", OpenXmlNamespaces.WordprocessingML);
            var        numPr   = this._nodeFactory.CreateElement("w", "numPr", OpenXmlNamespaces.WordprocessingML);
            var        pBdr    = this._nodeFactory.CreateElement("w", "pBdr", OpenXmlNamespaces.WordprocessingML);
            var        spacing = this._nodeFactory.CreateElement("w", "spacing", OpenXmlNamespaces.WordprocessingML);
            XmlElement jc      = null;

            //append style id , do not append "Normal" style (istd 0)
            var pStyle  = this._nodeFactory.CreateElement("w", "pStyle", OpenXmlNamespaces.WordprocessingML);
            var styleId = this._nodeFactory.CreateAttribute("w", "val", OpenXmlNamespaces.WordprocessingML);

            styleId.Value = StyleSheetMapping.MakeStyleId(this._parentDoc.Styles.Styles[papx.istd]);
            pStyle.Attributes.Append(styleId);
            this._pPr.AppendChild(pStyle);

            //append formatting of paragraph end mark
            if (this._paraEndChpx != null)
            {
                var rPr = this._nodeFactory.CreateElement("w", "rPr", OpenXmlNamespaces.WordprocessingML);

                //append properties
                this._paraEndChpx.Convert(new CharacterPropertiesMapping(rPr, this._ctx.Doc, new RevisionData(this._paraEndChpx), papx, false));

                var rev = new RevisionData(this._paraEndChpx);
                //append delete infos
                if (rev.Type == RevisionData.RevisionType.Deleted)
                {
                    var del = this._nodeFactory.CreateElement("w", "del", OpenXmlNamespaces.WordprocessingML);
                    rPr.AppendChild(del);
                }

                if (rPr.ChildNodes.Count > 0)
                {
                    this._pPr.AppendChild(rPr);
                }
            }

            bool isRightToLeft = false;

            foreach (var sprm in papx.grpprl)
            {
                switch (sprm.OpCode)
                {
                //rsid for paragraph property enditing (write to parent element)
                case SinglePropertyModifier.OperationCode.sprmPRsid:
                    string rsid = string.Format("{0:x8}", System.BitConverter.ToInt32(sprm.Arguments, 0));
                    this._ctx.AddRsid(rsid);
                    this._writer.WriteAttributeString("w", "rsidP", OpenXmlNamespaces.WordprocessingML, rsid);
                    break;

                //attributes
                case SinglePropertyModifier.OperationCode.sprmPIpgp:
                    var divId = this._nodeFactory.CreateAttribute("w", "divId", OpenXmlNamespaces.WordprocessingML);
                    divId.Value = System.BitConverter.ToUInt32(sprm.Arguments, 0).ToString();
                    this._pPr.Attributes.Append(divId);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFAutoSpaceDE:
                    appendFlagAttribute(this._pPr, sprm, "autoSpaceDE");
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFAutoSpaceDN:
                    appendFlagAttribute(this._pPr, sprm, "autoSpaceDN");
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFContextualSpacing:
                    appendFlagAttribute(this._pPr, sprm, "contextualSpacing");
                    break;

                //element flags
                case SinglePropertyModifier.OperationCode.sprmPFBiDi:
                    isRightToLeft = true;
                    appendFlagElement(this._pPr, sprm, "bidi", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFKeep:
                    appendFlagElement(this._pPr, sprm, "keepLines", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFKeepFollow:
                    appendFlagElement(this._pPr, sprm, "keepNext", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFKinsoku:
                    appendFlagElement(this._pPr, sprm, "kinsoku", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFOverflowPunct:
                    appendFlagElement(this._pPr, sprm, "overflowPunct", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFPageBreakBefore:
                    appendFlagElement(this._pPr, sprm, "pageBreakBefore", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFNoAutoHyph:
                    appendFlagElement(this._pPr, sprm, "su_pPressAutoHyphens", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFNoLineNumb:
                    appendFlagElement(this._pPr, sprm, "su_pPressLineNumbers", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFNoAllowOverlap:
                    appendFlagElement(this._pPr, sprm, "su_pPressOverlap", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFTopLinePunct:
                    appendFlagElement(this._pPr, sprm, "topLinePunct", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFWidowControl:
                    appendFlagElement(this._pPr, sprm, "widowControl", true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFWordWrap:
                    appendFlagElement(this._pPr, sprm, "wordWrap", true);
                    break;

                //indentation
                case SinglePropertyModifier.OperationCode.sprmPDxaLeft:
                case SinglePropertyModifier.OperationCode.sprmPDxaLeft80:
                case SinglePropertyModifier.OperationCode.sprmPNest:
                case SinglePropertyModifier.OperationCode.sprmPNest80:
                    appendValueAttribute(ind, "left", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxcLeft:
                    appendValueAttribute(ind, "leftChars", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxaLeft1:
                case SinglePropertyModifier.OperationCode.sprmPDxaLeft180:
                    short  flValue = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    string flName;
                    if (flValue >= 0)
                    {
                        flName = "firstLine";
                    }
                    else
                    {
                        flName   = "hanging";
                        flValue *= -1;
                    }
                    appendValueAttribute(ind, flName, flValue.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxcLeft1:
                    appendValueAttribute(ind, "firstLineChars", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxaRight:
                case SinglePropertyModifier.OperationCode.sprmPDxaRight80:
                    appendValueAttribute(ind, "right", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxcRight:
                    appendValueAttribute(ind, "rightChars", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                //spacing
                case SinglePropertyModifier.OperationCode.sprmPDyaBefore:
                    var before = this._nodeFactory.CreateAttribute("w", "before", OpenXmlNamespaces.WordprocessingML);
                    before.Value = System.BitConverter.ToUInt16(sprm.Arguments, 0).ToString();
                    spacing.Attributes.Append(before);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDyaAfter:
                    var after = this._nodeFactory.CreateAttribute("w", "after", OpenXmlNamespaces.WordprocessingML);
                    after.Value = System.BitConverter.ToUInt16(sprm.Arguments, 0).ToString();
                    spacing.Attributes.Append(after);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFDyaAfterAuto:
                    var afterAutospacing = this._nodeFactory.CreateAttribute("w", "afterAutospacing", OpenXmlNamespaces.WordprocessingML);
                    afterAutospacing.Value = sprm.Arguments[0].ToString();
                    spacing.Attributes.Append(afterAutospacing);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPFDyaBeforeAuto:
                    var beforeAutospacing = this._nodeFactory.CreateAttribute("w", "beforeAutospacing", OpenXmlNamespaces.WordprocessingML);
                    beforeAutospacing.Value = sprm.Arguments[0].ToString();
                    spacing.Attributes.Append(beforeAutospacing);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDyaLine:
                    var lspd = new LineSpacingDescriptor(sprm.Arguments);
                    var line = this._nodeFactory.CreateAttribute("w", "line", OpenXmlNamespaces.WordprocessingML);
                    line.Value = Math.Abs(lspd.dyaLine).ToString();
                    spacing.Attributes.Append(line);
                    var lineRule = this._nodeFactory.CreateAttribute("w", "lineRule", OpenXmlNamespaces.WordprocessingML);
                    if (!lspd.fMultLinespace && lspd.dyaLine < 0)
                    {
                        lineRule.Value = "exact";
                    }
                    else if (!lspd.fMultLinespace && lspd.dyaLine > 0)
                    {
                        lineRule.Value = "atLeast";
                    }
                    //no line rule means auto
                    spacing.Attributes.Append(lineRule);
                    break;

                //justification code
                case SinglePropertyModifier.OperationCode.sprmPJc:
                case SinglePropertyModifier.OperationCode.sprmPJc80:
                    jc = this._nodeFactory.CreateElement("w", "jc", OpenXmlNamespaces.WordprocessingML);
                    var jcVal = this._nodeFactory.CreateAttribute("w", "val", OpenXmlNamespaces.WordprocessingML);
                    jcVal.Value = ((Global.JustificationCode)sprm.Arguments[0]).ToString();
                    jc.Attributes.Append(jcVal);
                    break;

                //borders
                //case 0x461C:
                case SinglePropertyModifier.OperationCode.sprmPBrcTop:
                //case 0x4424:
                case SinglePropertyModifier.OperationCode.sprmPBrcTop80:
                    var topBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "top", OpenXmlNamespaces.WordprocessingML);
                    appendBorderAttributes(new BorderCode(sprm.Arguments), topBorder);
                    addOrSetBorder(pBdr, topBorder);
                    break;

                //case 0x461D:
                case SinglePropertyModifier.OperationCode.sprmPBrcLeft:
                //case 0x4425:
                case SinglePropertyModifier.OperationCode.sprmPBrcLeft80:
                    var leftBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "left", OpenXmlNamespaces.WordprocessingML);
                    appendBorderAttributes(new BorderCode(sprm.Arguments), leftBorder);
                    addOrSetBorder(pBdr, leftBorder);
                    break;

                //case 0x461E:
                case SinglePropertyModifier.OperationCode.sprmPBrcBottom:
                //case 0x4426:
                case SinglePropertyModifier.OperationCode.sprmPBrcBottom80:
                    var bottomBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "bottom", OpenXmlNamespaces.WordprocessingML);
                    appendBorderAttributes(new BorderCode(sprm.Arguments), bottomBorder);
                    addOrSetBorder(pBdr, bottomBorder);
                    break;

                //case 0x461F:
                case SinglePropertyModifier.OperationCode.sprmPBrcRight:
                //case 0x4427:
                case SinglePropertyModifier.OperationCode.sprmPBrcRight80:
                    var rightBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "right", OpenXmlNamespaces.WordprocessingML);
                    appendBorderAttributes(new BorderCode(sprm.Arguments), rightBorder);
                    addOrSetBorder(pBdr, rightBorder);
                    break;

                //case 0x4620:
                case SinglePropertyModifier.OperationCode.sprmPBrcBetween:
                //case 0x4428:
                case SinglePropertyModifier.OperationCode.sprmPBrcBetween80:
                    var betweenBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "between", OpenXmlNamespaces.WordprocessingML);
                    appendBorderAttributes(new BorderCode(sprm.Arguments), betweenBorder);
                    addOrSetBorder(pBdr, betweenBorder);
                    break;

                //case 0x4621:
                case SinglePropertyModifier.OperationCode.sprmPBrcBar:
                //case 0x4629:
                case SinglePropertyModifier.OperationCode.sprmPBrcBar80:
                    var barBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "bar", OpenXmlNamespaces.WordprocessingML);
                    appendBorderAttributes(new BorderCode(sprm.Arguments), barBorder);
                    addOrSetBorder(pBdr, barBorder);
                    break;

                //shading
                case SinglePropertyModifier.OperationCode.sprmPShd80:
                case SinglePropertyModifier.OperationCode.sprmPShd:
                    var desc = new ShadingDescriptor(sprm.Arguments);
                    appendShading(this._pPr, desc);
                    break;

                //numbering
                case SinglePropertyModifier.OperationCode.sprmPIlvl:
                    appendValueElement(numPr, "ilvl", sprm.Arguments[0].ToString(), true);
                    break;

                case SinglePropertyModifier.OperationCode.sprmPIlfo:
                    ushort val = System.BitConverter.ToUInt16(sprm.Arguments, 0);
                    appendValueElement(numPr, "numId", val.ToString(), true);

                    ////check if there is a ilvl reference, if not, check the count of LVLs.
                    ////if only one LVL exists in the referenced list, create a hard reference to that LVL
                    //if (containsLvlReference(papx.grpprl) == false)
                    //{
                    //    ListFormatOverride lfo = _ctx.Doc.ListFormatOverrideTable[val];
                    //    int index = NumberingMapping.FindIndexbyId(_ctx.Doc.ListTable, lfo.lsid);
                    //    ListData lst = _ctx.Doc.ListTable[index];
                    //    if (lst.rglvl.Length == 1)
                    //    {
                    //        appendValueElement(numPr, "ilvl", "0", true);
                    //    }
                    //}
                    break;

                //tabs
                case SinglePropertyModifier.OperationCode.sprmPChgTabsPapx:
                case SinglePropertyModifier.OperationCode.sprmPChgTabs:
                    var tabs = this._nodeFactory.CreateElement("w", "tabs", OpenXmlNamespaces.WordprocessingML);
                    int pos  = 0;
                    //read the removed tabs
                    byte itbdDelMax = sprm.Arguments[pos];
                    pos++;
                    for (int i = 0; i < itbdDelMax; i++)
                    {
                        var tab = this._nodeFactory.CreateElement("w", "tab", OpenXmlNamespaces.WordprocessingML);
                        //clear
                        var tabsVal = this._nodeFactory.CreateAttribute("w", "val", OpenXmlNamespaces.WordprocessingML);
                        tabsVal.Value = "clear";
                        tab.Attributes.Append(tabsVal);
                        //position
                        var tabsPos = this._nodeFactory.CreateAttribute("w", "pos", OpenXmlNamespaces.WordprocessingML);
                        tabsPos.Value = System.BitConverter.ToInt16(sprm.Arguments, pos).ToString();
                        tab.Attributes.Append(tabsPos);
                        tabs.AppendChild(tab);

                        //skip the tolerence array in sprm 0xC615
                        if (sprm.OpCode == SinglePropertyModifier.OperationCode.sprmPChgTabs)
                        {
                            pos += 4;
                        }
                        else
                        {
                            pos += 2;
                        }
                    }
                    //read the added tabs
                    byte itbdAddMax = sprm.Arguments[pos];
                    pos++;
                    for (int i = 0; i < itbdAddMax; i++)
                    {
                        var tbd = new TabDescriptor(sprm.Arguments[pos + (itbdAddMax * 2) + i]);
                        var tab = this._nodeFactory.CreateElement("w", "tab", OpenXmlNamespaces.WordprocessingML);
                        //justification
                        var tabsVal = this._nodeFactory.CreateAttribute("w", "val", OpenXmlNamespaces.WordprocessingML);
                        tabsVal.Value = ((Global.JustificationCode)tbd.jc).ToString();
                        tab.Attributes.Append(tabsVal);
                        //tab leader type
                        var leader = this._nodeFactory.CreateAttribute("w", "leader", OpenXmlNamespaces.WordprocessingML);
                        leader.Value = ((Global.TabLeader)tbd.tlc).ToString();
                        tab.Attributes.Append(leader);
                        //position
                        var tabsPos = this._nodeFactory.CreateAttribute("w", "pos", OpenXmlNamespaces.WordprocessingML);
                        tabsPos.Value = System.BitConverter.ToInt16(sprm.Arguments, pos + (i * 2)).ToString();
                        tab.Attributes.Append(tabsPos);
                        tabs.AppendChild(tab);
                    }
                    this._pPr.AppendChild(tabs);
                    break;

                //frame properties

                case SinglePropertyModifier.OperationCode.sprmPPc:
                    //position code
                    byte flag   = sprm.Arguments[0];
                    var  pcVert = (Global.VerticalPositionCode)((flag & 0x30) >> 4);
                    var  pcHorz = (Global.HorizontalPositionCode)((flag & 0xC0) >> 6);
                    appendValueAttribute(this._framePr, "hAnchor", pcHorz.ToString());
                    appendValueAttribute(this._framePr, "vAnchor", pcVert.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPWr:
                    var wrapping = (Global.TextFrameWrapping)sprm.Arguments[0];
                    appendValueAttribute(this._framePr, "wrap", wrapping.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxaAbs:
                    short frameX = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    appendValueAttribute(this._framePr, "x", frameX.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDyaAbs:
                    short frameY = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    appendValueAttribute(this._framePr, "y", frameY.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPWHeightAbs:
                    short frameHeight = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    appendValueAttribute(this._framePr, "h", frameHeight.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxaWidth:
                    short frameWidth = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    appendValueAttribute(this._framePr, "w", frameWidth.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDxaFromText:
                    short frameSpaceH = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    appendValueAttribute(this._framePr, "hSpace", frameSpaceH.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmPDyaFromText:
                    short frameSpaceV = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    appendValueAttribute(this._framePr, "vSpace", frameSpaceV.ToString());
                    break;

                //outline level
                case SinglePropertyModifier.OperationCode.sprmPOutLvl:
                    appendValueElement(this._pPr, "outlineLvl", sprm.Arguments[0].ToString(), false);
                    break;

                default:
                    break;
                }
            }

            //append frame properties
            if (this._framePr.Attributes.Count > 0)
            {
                this._pPr.AppendChild(this._framePr);
            }

            //append section properties
            if (this._sepx != null)
            {
                var sectPr = this._nodeFactory.CreateElement("w", "sectPr", OpenXmlNamespaces.WordprocessingML);
                this._sepx.Convert(new SectionPropertiesMapping(sectPr, this._ctx, this._sectionNr));
                this._pPr.AppendChild(sectPr);
            }

            //append indent
            if (ind.Attributes.Count > 0)
            {
                this._pPr.AppendChild(ind);
            }

            //append spacing
            if (spacing.Attributes.Count > 0)
            {
                this._pPr.AppendChild(spacing);
            }

            //append justification
            if (jc != null)
            {
                var jcVal = jc.Attributes["val", OpenXmlNamespaces.WordprocessingML];
                if ((isRightToLeft || isStyleRightToLeft(papx.istd)) && jcVal.Value == "right")
                {
                    //ignore jc="right" for RTL documents
                }
                else
                {
                    this._pPr.AppendChild(jc);
                }
            }

            //append numPr
            if (numPr.ChildNodes.Count > 0)
            {
                this._pPr.AppendChild(numPr);
            }

            //append borders
            if (pBdr.ChildNodes.Count > 0)
            {
                this._pPr.AppendChild(pBdr);
            }

            //write Properties
            if (this._pPr.ChildNodes.Count > 0 || this._pPr.Attributes.Count > 0)
            {
                this._pPr.WriteTo(this._writer);
            }
        }
Пример #8
0
        public void Apply(TablePropertyExceptions tapx)
        {
            var tblBorders = this._nodeFactory.CreateElement("w", "tblBorders", OpenXmlNamespaces.WordprocessingML);
            var tblCellMar = this._nodeFactory.CreateElement("w", "tblCellMar", OpenXmlNamespaces.WordprocessingML);
            var tblLayout  = this._nodeFactory.CreateElement("w", "tblLayout", OpenXmlNamespaces.WordprocessingML);
            var tblpPr     = this._nodeFactory.CreateElement("w", "tblpPr", OpenXmlNamespaces.WordprocessingML);
            var layoutType = this._nodeFactory.CreateAttribute("w", "type", OpenXmlNamespaces.WordprocessingML);

            layoutType.Value = "fixed";
            short tblIndent   = 0;
            short gabHalf     = 0;
            short marginLeft  = 0;
            short marginRight = 0;

            foreach (var sprm in tapx.grpprl)
            {
                switch (sprm.OpCode)
                {
                case SinglePropertyModifier.OperationCode.sprmTDxaGapHalf:
                    gabHalf = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    break;

                //table definition
                case SinglePropertyModifier.OperationCode.sprmTDefTable:
                    var tDef = new SprmTDefTable(sprm.Arguments);
                    //Workaround for retrieving the indent of the table:
                    //In some files there is a indent but no sprmTWidthIndent is set.
                    //For this cases we can calculate the indent of the table by getting the
                    //first boundary of the TDef and adding the padding of the cells
                    tblIndent = System.BitConverter.ToInt16(sprm.Arguments, 1);
                    //add the gabHalf
                    tblIndent += gabHalf;
                    //If there follows a real sprmTWidthIndent, this value will be overwritten
                    break;

                //preferred table width
                case SinglePropertyModifier.OperationCode.sprmTTableWidth:
                    var   fts   = (WidthType)sprm.Arguments[0];
                    short width = System.BitConverter.ToInt16(sprm.Arguments, 1);
                    var   tblW  = this._nodeFactory.CreateElement("w", "tblW", OpenXmlNamespaces.WordprocessingML);
                    var   w     = this._nodeFactory.CreateAttribute("w", "w", OpenXmlNamespaces.WordprocessingML);
                    w.Value = width.ToString();
                    var type = this._nodeFactory.CreateAttribute("w", "type", OpenXmlNamespaces.WordprocessingML);
                    type.Value = fts.ToString();
                    tblW.Attributes.Append(type);
                    tblW.Attributes.Append(w);
                    this._tblPr.AppendChild(tblW);
                    break;

                //justification
                case SinglePropertyModifier.OperationCode.sprmTJc:
                case  SinglePropertyModifier.OperationCode.sprmTJcRow:
                    appendValueElement(this._tblPr, "jc", ((Global.JustificationCode)sprm.Arguments[0]).ToString(), true);
                    break;

                //indent
                case SinglePropertyModifier.OperationCode.sprmTWidthIndent:
                    tblIndent = System.BitConverter.ToInt16(sprm.Arguments, 1);
                    break;

                //style
                case SinglePropertyModifier.OperationCode.sprmTIstd:
                case SinglePropertyModifier.OperationCode.sprmTIstdPermute:
                    short styleIndex = System.BitConverter.ToInt16(sprm.Arguments, 0);
                    if (this._styles.Styles.Count > styleIndex)
                    {
                        string id = StyleSheetMapping.MakeStyleId(this._styles.Styles[styleIndex]);
                        if (id != "TableNormal")
                        {
                            appendValueElement(this._tblPr, "tblStyle", id, true);
                        }
                    }
                    break;

                //bidi
                case SinglePropertyModifier.OperationCode.sprmTFBiDi:
                case SinglePropertyModifier.OperationCode.sprmTFBiDi90:
                    appendValueElement(this._tblPr, "bidiVisual", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString(), true);
                    break;

                //table look
                case SinglePropertyModifier.OperationCode.sprmTTlp:
                    appendValueElement(this._tblPr, "tblLook", string.Format("{0:x4}", System.BitConverter.ToInt16(sprm.Arguments, 2)), true);
                    break;

                //autofit
                case SinglePropertyModifier.OperationCode.sprmTFAutofit:
                    if (sprm.Arguments[0] == 1)
                    {
                        layoutType.Value = "auto";
                    }
                    break;

                //default cell padding (margin)
                case SinglePropertyModifier.OperationCode.sprmTCellPadding:
                case SinglePropertyModifier.OperationCode.sprmTCellPaddingDefault:
                case SinglePropertyModifier.OperationCode.sprmTCellPaddingOuter:
                    byte  grfbrc = sprm.Arguments[2];
                    short wMar   = System.BitConverter.ToInt16(sprm.Arguments, 4);
                    if (Utils.BitmaskToBool((int)grfbrc, 0x01))
                    {
                        appendDxaElement(tblCellMar, "top", wMar.ToString(), true);
                    }
                    if (Utils.BitmaskToBool((int)grfbrc, 0x02))
                    {
                        marginLeft = wMar;
                    }
                    if (Utils.BitmaskToBool((int)grfbrc, 0x04))
                    {
                        appendDxaElement(tblCellMar, "bottom", wMar.ToString(), true);
                    }
                    if (Utils.BitmaskToBool((int)grfbrc, 0x08))
                    {
                        marginRight = wMar;
                    }
                    break;

                //row count
                case SinglePropertyModifier.OperationCode.sprmTCHorzBands:
                    appendValueElement(this._tblPr, "tblStyleRowBandSize", sprm.Arguments[0].ToString(), true);
                    break;

                //col count
                case SinglePropertyModifier.OperationCode.sprmTCVertBands:
                    appendValueElement(this._tblPr, "tblStyleColBandSize", sprm.Arguments[0].ToString(), true);
                    break;

                //overlap
                case SinglePropertyModifier.OperationCode.sprmTFNoAllowOverlap:
                    bool   noOverlap     = Utils.ByteToBool(sprm.Arguments[0]);
                    string tblOverlapVal = "overlap";
                    if (noOverlap)
                    {
                        tblOverlapVal = "never";
                    }
                    appendValueElement(this._tblPr, "tblOverlap", tblOverlapVal, true);
                    break;

                //shading
                case SinglePropertyModifier.OperationCode.sprmTSetShdTable:
                    var desc = new ShadingDescriptor(sprm.Arguments);
                    appendShading(this._tblPr, desc);
                    break;

                //borders 80 exceptions
                case SinglePropertyModifier.OperationCode.sprmTTableBorders80:
                    var brc80 = new byte[4];
                    //top border
                    Array.Copy(sprm.Arguments, 0, brc80, 0, 4);
                    this.brcTop = new BorderCode(brc80);
                    //left
                    Array.Copy(sprm.Arguments, 4, brc80, 0, 4);
                    this.brcLeft = new BorderCode(brc80);
                    //bottom
                    Array.Copy(sprm.Arguments, 8, brc80, 0, 4);
                    this.brcBottom = new BorderCode(brc80);
                    //right
                    Array.Copy(sprm.Arguments, 12, brc80, 0, 4);
                    this.brcRight = new BorderCode(brc80);
                    //inside H
                    Array.Copy(sprm.Arguments, 16, brc80, 0, 4);
                    this.brcHorz = new BorderCode(brc80);
                    //inside V
                    Array.Copy(sprm.Arguments, 20, brc80, 0, 4);
                    this.brcVert = new BorderCode(brc80);
                    break;

                //border exceptions
                case SinglePropertyModifier.OperationCode.sprmTTableBorders:
                    var brc = new byte[8];
                    //top border
                    Array.Copy(sprm.Arguments, 0, brc, 0, 8);
                    this.brcTop = new BorderCode(brc);
                    //left
                    Array.Copy(sprm.Arguments, 8, brc, 0, 8);
                    this.brcLeft = new BorderCode(brc);
                    //bottom
                    Array.Copy(sprm.Arguments, 16, brc, 0, 8);
                    this.brcBottom = new BorderCode(brc);
                    //right
                    Array.Copy(sprm.Arguments, 24, brc, 0, 8);
                    this.brcRight = new BorderCode(brc);
                    //inside H
                    Array.Copy(sprm.Arguments, 32, brc, 0, 8);
                    this.brcHorz = new BorderCode(brc);
                    //inside V
                    Array.Copy(sprm.Arguments, 40, brc, 0, 8);
                    this.brcVert = new BorderCode(brc);
                    break;

                //floating table properties
                case SinglePropertyModifier.OperationCode.sprmTPc:
                    byte flag   = sprm.Arguments[0];
                    var  pcVert = (Global.VerticalPositionCode)((flag & 0x30) >> 4);
                    var  pcHorz = (Global.HorizontalPositionCode)((flag & 0xC0) >> 6);
                    appendValueAttribute(tblpPr, "horzAnchor", pcHorz.ToString());
                    appendValueAttribute(tblpPr, "vertAnchor", pcVert.ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmTDxaFromText:
                    appendValueAttribute(tblpPr, "leftFromText", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmTDxaFromTextRight:
                    appendValueAttribute(tblpPr, "rightFromText", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmTDyaFromText:
                    appendValueAttribute(tblpPr, "topFromText", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmTDyaFromTextBottom:
                    appendValueAttribute(tblpPr, "bottomFromText", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmTDxaAbs:
                    appendValueAttribute(tblpPr, "tblpX", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;

                case SinglePropertyModifier.OperationCode.sprmTDyaAbs:
                    appendValueAttribute(tblpPr, "tblpY", System.BitConverter.ToInt16(sprm.Arguments, 0).ToString());
                    break;
                }
            }

            //indent
            if (tblIndent != 0)
            {
                var tblInd  = this._nodeFactory.CreateElement("w", "tblInd", OpenXmlNamespaces.WordprocessingML);
                var tblIndW = this._nodeFactory.CreateAttribute("w", "w", OpenXmlNamespaces.WordprocessingML);
                tblIndW.Value = tblIndent.ToString();
                tblInd.Attributes.Append(tblIndW);
                var tblIndType = this._nodeFactory.CreateAttribute("w", "type", OpenXmlNamespaces.WordprocessingML);
                tblIndType.Value = "dxa";
                tblInd.Attributes.Append(tblIndType);
                this._tblPr.AppendChild(tblInd);
            }

            //append floating props
            if (tblpPr.Attributes.Count > 0)
            {
                this._tblPr.AppendChild(tblpPr);
            }

            //set borders
            if (this.brcTop != null)
            {
                var topBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "top", OpenXmlNamespaces.WordprocessingML);
                appendBorderAttributes(this.brcTop, topBorder);
                addOrSetBorder(this._tblBorders, topBorder);
            }
            if (this.brcLeft != null)
            {
                var leftBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "left", OpenXmlNamespaces.WordprocessingML);
                appendBorderAttributes(this.brcLeft, leftBorder);
                addOrSetBorder(this._tblBorders, leftBorder);
            }
            if (this.brcBottom != null)
            {
                var bottomBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "bottom", OpenXmlNamespaces.WordprocessingML);
                appendBorderAttributes(this.brcBottom, bottomBorder);
                addOrSetBorder(this._tblBorders, bottomBorder);
            }
            if (this.brcRight != null)
            {
                var rightBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "right", OpenXmlNamespaces.WordprocessingML);
                appendBorderAttributes(this.brcRight, rightBorder);
                addOrSetBorder(this._tblBorders, rightBorder);
            }
            if (this.brcHorz != null)
            {
                var insideHBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "insideH", OpenXmlNamespaces.WordprocessingML);
                appendBorderAttributes(this.brcHorz, insideHBorder);
                addOrSetBorder(this._tblBorders, insideHBorder);
            }
            if (this.brcVert != null)
            {
                var insideVBorder = this._nodeFactory.CreateNode(XmlNodeType.Element, "w", "insideV", OpenXmlNamespaces.WordprocessingML);
                appendBorderAttributes(this.brcVert, insideVBorder);
                addOrSetBorder(this._tblBorders, insideVBorder);
            }
            if (this._tblBorders.ChildNodes.Count > 0)
            {
                this._tblPr.AppendChild(this._tblBorders);
            }

            //append layout type
            tblLayout.Attributes.Append(layoutType);
            this._tblPr.AppendChild(tblLayout);

            //append margins
            if (marginLeft == 0 && gabHalf != 0)
            {
                appendDxaElement(tblCellMar, "left", gabHalf.ToString(), true);
            }
            else
            {
                appendDxaElement(tblCellMar, "left", marginLeft.ToString(), true);
            }
            if (marginRight == 0 && gabHalf != 0)
            {
                appendDxaElement(tblCellMar, "right", gabHalf.ToString(), true);
            }
            else
            {
                appendDxaElement(tblCellMar, "right", marginRight.ToString(), true);
            }
            this._tblPr.AppendChild(tblCellMar);

            //write Properties
            if (this._tblPr.ChildNodes.Count > 0 || this._tblPr.Attributes.Count > 0)
            {
                this._tblPr.WriteTo(this._writer);
            }

            //append the grid
            this._tblGrid = this._nodeFactory.CreateElement("w", "tblGrid", OpenXmlNamespaces.WordprocessingML);
            foreach (short colW in this._grid)
            {
                var gridCol  = this._nodeFactory.CreateElement("w", "gridCol", OpenXmlNamespaces.WordprocessingML);
                var gridColW = this._nodeFactory.CreateAttribute("w", "w", OpenXmlNamespaces.WordprocessingML);
                gridColW.Value = colW.ToString();
                gridCol.Attributes.Append(gridColW);
                this._tblGrid.AppendChild(gridCol);
            }
            this._tblGrid.WriteTo(this._writer);
        }