OpenXmlUtil 书签

using System.Collections.Generic;
using System.IO;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using AA = DocumentFormat.OpenXml.Drawing;
using V = DocumentFormat.OpenXml.Vml;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using System.Linq;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
namespace Wisdombud.Report
{
public static partial class OpenXmlUtil
{

    /// <summary>
    /// 按书签替换图片
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="picPath"></param>
    /// <param name="bm"></param>
    /// <param name="x">宽度厘米</param>
    /// <param name="y">高度厘米</param>
    /// <param name="type"></param>
    public static void ReplaceBMPicture(string filePath, string picPath, string bm)
    {
        RemoveBookMarkContent(filePath, bm);
        InsertBMPicture(filePath, picPath, bm);
    }
    /// <summary>
    /// 修改单元格内容
    /// </summary>
    /// <param name="cell"></param>
    /// <param name="content"></param>
    public static void ModifyCell(TableCell cell, string content)
    {
        Paragraph pa = cell.Elements<Paragraph>().FirstOrDefault();
        if (pa == null)
        {
            pa = new Paragraph();
            cell.Append(pa);
        }

        List<Paragraph> paraList = new List<Paragraph>();
        foreach (var inst in cell.Elements<Paragraph>())
        {
            if (inst == pa)
            {
                continue;
            }
            paraList.Add(inst);
        }
        foreach (var inst in paraList)
        {
            inst.Remove();
        }

        ModifyParagraph(pa, content);
    }

    /// <summary>
    /// 按书签替换图片
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="picPath"></param>
    /// <param name="bm"></param>
    /// <param name="x">宽度厘米</param>
    /// <param name="y">高度厘米</param>
    /// <param name="type"></param>
    public static void ReplaceBMPicture(string filePath, string picPath, string bm, long x, ImagePartType type)
    {
        RemoveBookMarkContent(filePath, bm);
        InsertBMPicture(filePath, picPath, bm, x, type);
    }
    /// <summary>
    /// 按书签替换图片
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="picPath"></param>
    /// <param name="bm"></param>
    /// <param name="x">宽度厘米</param>
    /// <param name="y">高度厘米</param>
    /// <param name="type"></param>
    public static void ReplaceBMPicture(string filePath, string picPath, string bm, long x, long y, ImagePartType type)
    {
        RemoveBookMarkContent(filePath, bm);
        InsertBMPicture(filePath, picPath, bm, x, y, type);
    }
    public static void ReplaceBMPicture(WordprocessingDocument doc, string picPath, string bm, long x, long y, ImagePartType type)
    {
        RemoveBookMarkContent(doc, bm);
        InsertBMPicture(doc, picPath, bm, x, y, type);
    }
    /// <summary>
    /// 按书签插入图片
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="picPath"></param>
    /// <param name="bm"></param>
    /// <param name="x">宽度厘米</param>
    /// <param name="y">高度厘米</param>
    /// <param name="type"></param>
    public static void InsertBMPicture(string filePath, string picPath, string bm, long x, ImagePartType type)
    {
        long y = 0;
        using (System.Drawing.Bitmap objPic = new System.Drawing.Bitmap(picPath))
        {
            y = (x * objPic.Height) / objPic.Width;
        }
        InsertBMPicture(filePath, picPath, bm, x, y, type);
    }

    /// <summary>
    /// 按书签插入图片
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="picPath"></param>
    /// <param name="bm"></param>
    /// <param name="x">宽度厘米</param>
    /// <param name="y">高度厘米</param>
    /// <param name="type"></param>
    public static void InsertBMPicture(string filePath, string picPath, string bm, long x, long y, ImagePartType type)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            MainDocumentPart mainPart = doc.MainDocumentPart;

            BookmarkStart bmStart = findBookMarkStart(doc, bm);
            if (bmStart == null)
            {
                return;
            }
            ImagePart imagePart = mainPart.AddImagePart(type);
            using (FileStream stream = new FileStream(picPath, FileMode.Open, FileAccess.Read))
            {
                imagePart.FeedData(stream);
            }
            long cx = 360000L * x;//360000L = 1厘米
            long cy = 360000L * y;
            Run r = AddImage(doc, mainPart.GetIdOfPart(imagePart), cx, cy);
            bmStart.Parent.InsertAfter<Run>(r, bmStart);
            mainPart.Document.Save();
        }
    }
    public static void InsertBMPicture(WordprocessingDocument doc, string picPath, string bm, long x, long y, ImagePartType type)
    {
        MainDocumentPart mainPart = doc.MainDocumentPart;
        BookmarkStart bmStart = findBookMarkStart(doc, bm);
        if (bmStart == null)
        {
            return;
        }
        ImagePart imagePart = mainPart.AddImagePart(type);
        using (FileStream stream = new FileStream(picPath, FileMode.Open, FileAccess.Read))
        {
            imagePart.FeedData(stream);
        }
        long cx = 360000L * x;//360000L = 1厘米
        long cy = 360000L * y;
        Run r = AddImage(doc, mainPart.GetIdOfPart(imagePart), cx, cy);
        bmStart.Parent.InsertAfter<Run>(r, bmStart);
        mainPart.Document.Save();
    }
    /// <summary>
    /// 查找表格
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="start"></param>
    /// <returns></returns>
    public static Table FindTableByInnerTextStart(WordprocessingDocument doc, string start)
    {
        Body b = doc.MainDocumentPart.Document.Body;
        foreach (var table in b.Descendants<Table>())
        {
            if (table.InnerText.StartsWith(start))
            {
                return table;
            }
        }

        return null;
    }
    /// <summary>
    /// 按书签插入图片。默认15厘米,JPG
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="picPath"></param>
    /// <param name="bm"></param>
    public static void InsertBMPicture(string filePath, string picPath, string bm)
    {
        InsertBMPicture(filePath, picPath, bm, 15, 15, ImagePartType.Jpeg);
    }
    /// <summary>
    /// 查找书签
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="bmName"></param>
    /// <returns></returns>
    public static BookmarkStart findBookMarkStart(WordprocessingDocument doc, string bmName)
    {
        foreach (var footer in doc.MainDocumentPart.FooterParts)
        {
            foreach (var inst in footer.Footer.Descendants<BookmarkStart>())
            {
                if (inst.Name == bmName)
                {
                    return inst;
                }
            }
        }
        foreach (var header in doc.MainDocumentPart.HeaderParts)
        {
            foreach (var inst in header.Header.Descendants<BookmarkStart>())
            {
                if (inst.Name == bmName)
                {
                    return inst;
                }
            }
        }
        foreach (var inst in doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>())
        {
            if (inst is BookmarkStart)
            {
                if (inst.Name == bmName)
                {
                    return inst;
                }
            }
        }

        return null;
    }

    /// <summary>
    /// 查找书签
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="bmName"></param>
    /// <returns></returns>
    public static List<BookmarkStart> findAllBookMarkStart(WordprocessingDocument doc)
    {
        List<BookmarkStart> ret = new List<BookmarkStart>();
        foreach (var footer in doc.MainDocumentPart.FooterParts)
        {
            ret.AddRange(footer.Footer.Descendants<BookmarkStart>());
        }
        foreach (var header in doc.MainDocumentPart.HeaderParts)
        {
            ret.AddRange(header.Header.Descendants<BookmarkStart>());
        }
        ret.AddRange(doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>());
        return ret;
    }
    /// <summary>
    /// 查找书签
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="bmName"></param>
    /// <returns></returns>
    public static List<BookmarkEnd> findAllBookMarkEnd(WordprocessingDocument doc)
    {
        List<BookmarkEnd> ret = new List<BookmarkEnd>();
        foreach (var footer in doc.MainDocumentPart.FooterParts)
        {
            ret.AddRange(footer.Footer.Descendants<BookmarkEnd>());
        }
        foreach (var header in doc.MainDocumentPart.HeaderParts)
        {
            ret.AddRange(header.Header.Descendants<BookmarkEnd>());
        }
        ret.AddRange(doc.MainDocumentPart.RootElement.Descendants<BookmarkEnd>());
        return ret;
    }


    /// <summary>
    /// 查找书签END
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="bmName"></param>
    /// <returns></returns>
    public static BookmarkEnd findBookMarkEnd(WordprocessingDocument doc, string id)
    {
        foreach (var footer in doc.MainDocumentPart.FooterParts)
        {
            foreach (var inst in footer.Footer.Descendants<BookmarkEnd>())
            {
                if (inst.Id == id)
                {
                    return inst;
                }
            }
        }

        foreach (var header in doc.MainDocumentPart.HeaderParts)
        {
            foreach (var inst in header.Header.Descendants<BookmarkEnd>())
            {
                if (inst.Id == id)
                {
                    return inst;
                }
            }
        }
        foreach (var inst in doc.MainDocumentPart.RootElement.Descendants<BookmarkEnd>())
        {
            if (inst.Id == id)
            {
                return inst;
            }

        }

        return null;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="picPath"></param>
    /// <param name="mainPart"></param>
    /// <param name="r"></param>
    public static void GetNewPicRun(WordprocessingDocument doc, string picPath, out MainDocumentPart mainPart, out Run r)
    {
        mainPart = doc.MainDocumentPart;
        ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Png);

        long cx;
        long cy;

        long x = 4;
        long y = 0;
        using (System.Drawing.Bitmap objPic = new System.Drawing.Bitmap(picPath))
        {
            y = (x * objPic.Height) / objPic.Width;
        }
        using (FileStream stream = new FileStream(picPath, FileMode.Open, FileAccess.Read))
        {
            imagePart.FeedData(stream);
        }
        cx = 360000L * x;//360000L = 1厘米
        cy = 360000L * y;

        r = OpenXmlUtil.AddImage(doc, mainPart.GetIdOfPart(imagePart), cx, cy);
    }
    private static Run AddImage(WordprocessingDocument wordDoc, string relationshipId, long cx, long cy)
    {
        return new Run(new Drawing(
                 new DW.Inline(
                     new DW.Extent() { Cx = cx, Cy = cy },
                     new DW.EffectExtent()
                     {
                         LeftEdge = 0L,
                         TopEdge = 0L,
                         RightEdge = 0L,
                         BottomEdge = 0L
                     },
                     new DW.DocProperties()
                     {
                         Id = (UInt32Value)1U,
                         Name = "Picture 1"
                     },
                     new DW.NonVisualGraphicFrameDrawingProperties(
                         new AA.GraphicFrameLocks() { NoChangeAspect = true }),
                     new AA.Graphic(
                         new AA.GraphicData(
                             new PIC.Picture(
                                 new PIC.NonVisualPictureProperties(
                                     new PIC.NonVisualDrawingProperties()
                                     {
                                         Id = (UInt32Value)0U,
                                         Name = "New Bitmap Image.jpg"
                                     },
                                     new PIC.NonVisualPictureDrawingProperties()),
                                 new PIC.BlipFill(
                                     new AA.Blip(
                                         new AA.BlipExtensionList(
                                             new AA.BlipExtension()
                                             {
                                                 Uri =
                                                   "{28A0092B-C50C-407E-A947-70E740481C1C}"
                                             })
                                     )
                                     {
                                         Embed = relationshipId,
                                         CompressionState =
                                         AA.BlipCompressionValues.Print
                                     },
                                     new AA.Stretch(
                                         new AA.FillRectangle())),
                                 new PIC.ShapeProperties(
                                     new AA.Transform2D(
                                         new AA.Offset() { X = 0L, Y = 0L },
                                         new AA.Extents() { Cx = 952500L, Cy = 571500L }),
                                     new AA.PresetGeometry(
                                         new AA.AdjustValueList()
                                     ) { Preset = AA.ShapeTypeValues.Rectangle }))
                         ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
                 )
                 {
                     DistanceFromTop = (UInt32Value)0U,
                     DistanceFromBottom = (UInt32Value)0U,
                     DistanceFromLeft = (UInt32Value)0U,
                     DistanceFromRight = (UInt32Value)0U,

                 }));

    }
    /// <summary>
    /// 删除某一段文本
    /// 1 标记1结束到标记2开始;2 标记1结束到标记2结束;3 标记1开始到标记2结束; 4 标记1开始到标记2开始;
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="stringStart"></param>
    /// <param name="stringStop"></param>
    /// <param name="way"></param>
    public static void DeleteRange(string filePath, string stringStart, string stringStop, int way)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            List<OpenXmlElement> deleteList = new List<OpenXmlElement>();
            bool flag = false;
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                if (way == 1)
                {
                    if (inst.InnerText.Contains(stringStop))
                    {
                        flag = false;
                    }
                    if (flag)
                    {
                        deleteList.Add(inst);
                    }
                    if (inst.InnerText.Contains(stringStart))
                    {
                        flag = true;
                    }
                }
                else if (way == 2)
                {

                    if (flag)
                    {
                        deleteList.Add(inst);
                    }
                    if (inst.InnerText.Contains(stringStart))
                    {
                        flag = true;
                    }
                    if (inst.InnerText.Contains(stringStop))
                    {
                        flag = false;
                    }
                }
                else if (way == 3)
                {
                    if (inst.InnerText.Contains(stringStart))
                    {
                        flag = true;
                    }
                    if (flag)
                    {
                        deleteList.Add(inst);
                    }

                    if (inst.InnerText.Contains(stringStop))
                    {
                        flag = false;
                    }
                }
                else if (way == 4)
                {
                    if (inst.InnerText.Contains(stringStart))
                    {
                        flag = true;
                    }
                    if (inst.InnerText.Contains(stringStop))
                    {
                        flag = false;
                    }
                    if (flag)
                    {
                        deleteList.Add(inst);
                    }

                }

            }
            foreach (var inst in deleteList)
            {
                inst.Remove();
            }
        }

    }
    /// <summary>
    /// 删除某一段文本(从第二个符合的Elements开始)
    /// 标记1开始到标记2开始;
    /// <param name="filePath"></param>
    /// <param name="stringStart"></param>
    /// <param name="stringStop"></param>
    /// <param name="way"></param>
    public static void DeleteRangeByJieTu(string filePath, string stringStart, string stringStop)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            List<OpenXmlElement> deleteList = new List<OpenXmlElement>();
            bool flag = false;
            int i = 0;
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                if (inst.InnerText.Contains(stringStart))
                {
                    if (i == 1)
                    {
                        flag = true;
                    }
                    i++;
                }
                if (inst.InnerText.Contains(stringStop))
                {
                    flag = false;
                }
                if (flag)
                {
                    deleteList.Add(inst);
                }
            }
            foreach (var inst in deleteList)
            {
                inst.Remove();
            }
        }

    }
    /// <summary>
    /// 从stringStart 开始删除到最后
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="stringStart"></param>
    /// <param name="stringStop"></param>
    /// <param name="way"></param>
    public static void DeleteRange(string filePath, string stringStart)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            List<OpenXmlElement> deleteList = new List<OpenXmlElement>();
            bool flag = false;

            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                if (inst.InnerText.Contains(stringStart))
                {

                    flag = true;
                }
                if (flag)
                {
                    deleteList.Add(inst);
                }
            }
            foreach (var inst in deleteList)
            {
                inst.Remove();
            }
        }

    }
    /// <summary>
    /// 从stringStart结束删除到最后,跳过第一个符合stringStart的Elements
    /// 2018-10-16
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="stringStart"></param>
    public static void DeleteRangeByJieTu(string filePath, string stringStart)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            List<OpenXmlElement> deleteList = new List<OpenXmlElement>();
            bool flag = false;
            int i = 0;
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                if (flag)
                {
                    deleteList.Add(inst);
                }
                if (inst.InnerText.Contains(stringStart))
                {
                    if (i == 1)
                    {
                        flag = true;
                    }
                    i++;
                }
            }
            foreach (var inst in deleteList)
            {
                inst.Remove();
            }
        }
    }
    public static void DeleteRangeList(List<List<OpenXmlElement>> rangeList)
    {
        foreach (var range in rangeList)
        {
            foreach (var element in range)
            {
                element.Remove();
            }
        }
    }
    public static void DeleteRangeList(string filePath, string stringStart, string stringStop, int way)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            List<List<OpenXmlElement>> rangeList = new List<List<OpenXmlElement>>();
            List<OpenXmlElement> temp = null;
            bool add = false;
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                if (way == 1)
                {
                    if (inst.InnerText.Contains(stringStop))
                    {
                        add = false;
                        rangeList.Add(temp.ToList());
                    }
                    if (add)
                    {
                        temp.Add(inst);
                    }
                    if (inst.InnerText.Contains(stringStart))
                    {
                        add = true;
                        temp = new List<OpenXmlElement>();
                    }
                }
                else if (way == 2)
                {

                    if (add)
                    {
                        temp.Add(inst);
                    }
                    if (inst.InnerText.Contains(stringStart))
                    {
                        add = true;
                        temp = new List<OpenXmlElement>();
                    }
                    if (inst.InnerText.Contains(stringStop))
                    {
                        add = false;
                        rangeList.Add(temp);
                    }
                }
                else if (way == 3)
                {
                    if (inst.InnerText.Contains(stringStart))
                    {
                        add = true;
                        temp = new List<OpenXmlElement>();
                    }
                    if (add)
                    {
                        temp.Add(inst);
                    }

                    if (inst.InnerText.Contains(stringStop))
                    {
                        add = false;
                        rangeList.Add(temp);
                    }
                }
                else if (way == 4)
                {
                    if (inst.InnerText.Contains(stringStart))
                    {
                        add = true;
                        temp = new List<OpenXmlElement>();
                    }
                    if (inst.InnerText.Contains(stringStop))
                    {
                        add = false;
                        rangeList.Add(temp);
                    }
                    if (add)
                    {
                        temp.Add(inst);
                    }
                }
            }
            foreach (var range in rangeList)
            {
                foreach (var item in range)
                {
                    if (item.Parent != null)
                    {
                        item.Remove();
                    }

                }
            }
        }
    }
    /// <summary>
    /// 
    /// 1:从字符开始到最后
    /// 2:从字符结束到最后
    /// </summary>
    /// <param name="findStr"></param>
    /// <param name="way"></param>
    /// <param name="huiche"></param>
    public static List<OpenXmlElement> RangeFindCopy2End(string filePath, string findStr, int way)
    {
        List<OpenXmlElement> ret = new List<OpenXmlElement>();
        bool find = false;
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                if (way == 1)
                {
                    if (inst.InnerText.Contains(findStr))
                    {
                        find = true;
                    }
                    if (find)
                    {
                        ret.Add(inst.CloneNode(true));
                    }
                }
                else if (way == 2)
                {
                    if (find)
                    {
                        ret.Add(inst.CloneNode(true));
                    }
                    if (inst.InnerText.Contains(findStr))
                    {
                        find = true;
                    }
                }
            }
        }
        return ret;
    }
    public static List<OpenXmlElement> RangeFindCopy2End(WordprocessingDocument doc, string findStr, int way)
    {
        List<OpenXmlElement> ret = new List<OpenXmlElement>();
        bool find = false;
        foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
        {
            if (way == 1)
            {
                if (inst.InnerText.Contains(findStr))
                {
                    find = true;
                }
                if (find)
                {
                    ret.Add(inst.CloneNode(true));
                }
            }
            else if (way == 2)
            {
                if (find)
                {
                    ret.Add(inst.CloneNode(true));
                }
                if (inst.InnerText.Contains(findStr))
                {
                    find = true;
                }
            }
        }
        return ret;
    }
    /// <summary>
    /// 此方法get date 后,insert document(原始记录)页眉消失,未修改
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public static List<OpenXmlElement> FindWholeDoc(string filePath)
    {
        List<OpenXmlElement> ret = new List<OpenXmlElement>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                ret.Add(inst.CloneNode(true));
            }
        }
        return ret;
    }
    /// <summary>
    /// 1 标记1结束到标记2开始;2 标记1结束到标记2结束;3 标记1开始到标记2结束; 4 标记1开始到标记2开始;
    /// </summary>
    /// <param name="stringStart"></param>
    /// <param name="stringStop"></param>
    /// <param name="way"></param>
    public static List<OpenXmlElement> RangeFind(string filePath, string stringStart, string stringStop, int way)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            return RangeFind(doc, stringStart, stringStop, way);
        }

    }
    /// <summary>
    /// 1 标记1结束到标记2开始;2 标记1结束到标记2结束;3 标记1开始到标记2结束; 4 标记1开始到标记2开始;
    /// </summary>
    /// <param name="stringStart"></param>
    /// <param name="stringStop"></param>
    /// <param name="way"></param>
    public static List<OpenXmlElement> RangeFind(WordprocessingDocument doc, string stringStart, string stringStop, int way)
    {
        List<OpenXmlElement> ret = new List<OpenXmlElement>();
        bool add = false;
        foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
        {
            if (way == 1)
            {
                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                }
                if (add)
                {
                    //if (inst is Paragraph && inst.InnerXml.Contains("w:pict"))
                    //{
                    //    continue;
                    //}
                    ret.Add(inst.CloneNode(true));
                }
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                }
            }
            else if (way == 2)
            {

                if (add)
                {
                    ret.Add(inst.CloneNode(true));
                }
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                }
                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                }
            }
            else if (way == 3)
            {
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                }
                if (add)
                {
                    ret.Add(inst.CloneNode(true));
                }

                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                }
            }
            else if (way == 4)
            {
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                }
                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                }
                if (add)
                {
                    ret.Add(inst.CloneNode(true));
                }
            }
        }
        return ret;
    }
    /// <summary>
    /// 1 标记1结束到标记2开始;2 标记1结束到标记2结束;3 标记1开始到标记2结束; 4 标记1开始到标记2开始;
    /// </summary>
    /// <param name="stringStart"></param>
    /// <param name="stringStop"></param>
    /// <param name="way"></param>
    public static List<OpenXmlElement> RangeFindAll(string filePath)
    {
        List<OpenXmlElement> ret = new List<OpenXmlElement>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                ret.Add(inst.CloneNode(true));
            }
        }
        return ret;
    }

    public static List<List<OpenXmlElement>> RangeListFind(WordprocessingDocument doc, string stringStart, string stringStop, int way)
    {
        List<List<OpenXmlElement>> ret = new List<List<OpenXmlElement>>();
        List<OpenXmlElement> temp = null;
        bool add = false;
        foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
        {
            if (way == 1)
            {
                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                    ret.Add(temp.ToList());
                }
                if (add)
                {
                    temp.Add(inst.CloneNode(true));
                }
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                    temp = new List<OpenXmlElement>();
                }
            }
            else if (way == 2)
            {

                if (add)
                {
                    temp.Add(inst.CloneNode(true));
                }
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                    temp = new List<OpenXmlElement>();
                }
                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                    ret.Add(temp);
                }
            }
            else if (way == 3)
            {
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                    temp = new List<OpenXmlElement>();
                }
                if (add)
                {
                    temp.Add(inst.CloneNode(true));
                }

                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                    ret.Add(temp);
                }
            }
            else if (way == 4)
            {
                if (inst.InnerText.Contains(stringStart))
                {
                    add = true;
                    temp = new List<OpenXmlElement>();
                }
                if (inst.InnerText.Contains(stringStop))
                {
                    add = false;
                    ret.Add(temp);
                }
                if (add)
                {
                    temp.Add(inst.CloneNode(true));
                }
            }
        }
        return ret;
    }
    /// <summary>
    /// 不包含开始和结束
    /// 遇见第一个字符串结束循环
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="stringStart"></param>
    /// <param name="stringStop"></param>
    /// <returns></returns>
    public static List<List<OpenXmlElement>> RangeListFind(WordprocessingDocument doc, string stringStart, string stringStop)
    {
        List<List<OpenXmlElement>> ret = new List<List<OpenXmlElement>>();
        List<OpenXmlElement> temp = null;
        bool add = false;
        foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
        {
            if (inst.InnerText.Contains(stringStop))
            {
                add = false;
                ret.Add(temp.ToList());
                //break;
            }
            if (add)
            {
                temp.Add(inst.CloneNode(true));
            }
            if (inst.InnerText.Contains(stringStart) && !add)
            {
                add = true;
                temp = new List<OpenXmlElement>();
            }
        }
        return ret;
    }


    /// <summary>
    /// 修改书签
    /// </summary>
    /// <param name="filePath">word文档</param>
    /// <param name="bmName">书签名字</param>
    /// <param name="text">替换的文本</param>
    public static void SetBMTxt(string filePath, string bmName, string text)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            SetBMTxt(doc, bmName, text);
        }
    }


    public static void SetBMTxt(WordprocessingDocument doc, string bmName, string text)
    {
        BookmarkStart bs = findBookMarkStart(doc, bmName);

        if (bs != null)
        {
            OpenXmlElement elem = bs.NextSibling();

            while (elem != null && !(elem is BookmarkEnd))
            {
                OpenXmlElement nextElem = elem.NextSibling();
                elem.Remove();
                elem = nextElem;
            }

            bs.Parent.InsertAfter<Run>(new Run(new Text(text)), bs);
        }

    }
    /// <summary>
    /// 删除书签内容(目前适用于书签内无表格)
    /// </summary>
    /// <param name="bookmark"></param>
    public static void DeleteBookMarkAndContent(string filePath, string bmName)
    {
        RemoveBookMarkContent(filePath, bmName);
        RemoveBookMark(filePath, bmName);
    }
    public static void DeleteBookMarkAndContent(WordprocessingDocument doc, string bmName)
    {
        RemoveBookMarkContent(doc, bmName);
        RemoveBookMark(doc, bmName);
    }
    /// <summary>
    /// 
    /// 1:文档开始到字符开始
    /// 2:文档开始到字符结束
    /// true:包括回车
    /// </summary>
    /// <param name="findStr"></param>
    /// <param name="way"></param>
    /// <param name="huiche"></param>
    public static List<OpenXmlElement> RangeFindCopyFromStart(string filePath, string findStr, int way)
    {
        List<OpenXmlElement> ret = new List<OpenXmlElement>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            foreach (var inst in doc.MainDocumentPart.Document.Body.Elements())
            {
                if (way == 1)
                {
                    if (inst.InnerText.Contains(findStr))
                    {
                        break;
                    }
                    ret.Add(inst.CloneNode(true));
                }
                else if (way == 2)
                {
                    ret.Add(inst.CloneNode(true));
                    if (inst.InnerText.Contains(findStr))
                    {
                        break;
                    }
                }
            }
        }
        return ret;
    }

    /// <summary>
    /// 把elements复制到文件的最后面
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="elements"></param>
    public static void PasteDocumentEnd(string filePath, List<OpenXmlElement> elements)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            PasteDocumentEnd(doc, elements);
        }
    }
    public static void PasteDocumentEnd(WordprocessingDocument doc, List<OpenXmlElement> elements)
    {
        Body b = doc.MainDocumentPart.Document.Body;
        OpenXmlElement flag = b.Elements().LastOrDefault();
        if (flag == null)
        {
            return;
        }
        foreach (var inst in elements)
        {
            b.InsertBefore(inst, flag);
        }
    }
    /// <summary>
    /// 删除书签内容(目前适用于书签内无表格)
    /// </summary>
    /// <param name="bookmark"></param>
    public static void RemoveBookMarkContent(string filePath, string bmName)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            RemoveBookMarkContent(doc, bmName);
        }
    }
    /// <summary>
    /// 删除书签内容(目前适用于书签内无表格)
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="bmName"></param>
    public static void RemoveBookMarkContent(WordprocessingDocument doc, string bmName)
    {

        BookmarkStart bmStart = findBookMarkStart(doc, bmName);
        BookmarkEnd bmEnd = findBookMarkEnd(doc, bmStart.Id);
        while (true)
        {
            var run = bmStart.NextSibling();
            if (run == null)
            {
                break;
            }
            if (run is BookmarkEnd && (BookmarkEnd)run == bmEnd)
            {
                break;
            }
            run.Remove();
        }
    }
    /// <summary>
    /// 重命名书签,在书签前面加前缀
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="prefix">前缀</param>
    public static void PrefixBookMark(string filePath, string prefix)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            foreach (var inst in findAllBookMarkStart(doc))
            {
                inst.Name = prefix + inst.Name;
            }
        }
    }

    /// <summary>
    /// 重命名书签
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="oldName"></param>
    /// <param name="newName"></param>
    public static void RenameBookMark(string filePath, string oldName, string newName)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            var bm = findBookMarkStart(doc, oldName);
            bm.Name = newName;
        }
    }

    /// <summary>
    /// 重命名书签
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="oldName"></param>
    /// <param name="newName"></param>
    public static void RenameBookMark(WordprocessingDocument doc, string oldName, string newName)
    {
        var bm = findBookMarkStart(doc, oldName);
        bm.Name = newName;
    }
    /// <summary>
    /// 删除书签
    /// </summary>
    /// <param name="bookmark"></param>
    public static void RemoveBookMark(string filePath, string bmName)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            RemoveBookMark(doc, bmName);
        }
    }
    /// <summary>
    /// 删除书签
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="bmName"></param>
    public static void RemoveBookMark(WordprocessingDocument doc, string bmName)
    {

        var bmStart = findBookMarkStart(doc, bmName);
        if (bmStart == null)
        {
            return;
        }
        var bmEnd = findBookMarkEnd(doc, bmStart.Id);
        bmStart.Remove();
        bmEnd.Remove();
    }
    /// <summary>
    /// 删除书签所在的Paragraph:
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="bmName"></param>
    public static void RemoveBookMarkAndParagraph(string filePath, string bmName)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            var bmStart = findBookMarkStart(doc, bmName);
            if (bmStart == null)
            {
                return;
            }
            bmStart.Parent.Remove();
        }
    }

    public static void InsertBefore(string filePath, string findStr, List<OpenXmlElement> datas)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();
            foreach (var inst in b.Elements())
            {
                if (inst.InnerText.Contains(findStr))
                {
                    flag = inst;
                    break;
                }
            }
            foreach (var inst in datas)
            {
                b.InsertBefore(inst, flag);
            }
        }
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="findStr"></param>
    /// <param name="findStrIndex">start 0</param>
    /// <param name="datas"></param>
    public static void InsertBefore(string filePath, string findStr, int findStrIndex, List<OpenXmlElement> datas)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();

            var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
            if (findStrIndex >= flagList.Count)
            {
                return;
            }
            flag = flagList[findStrIndex];

            foreach (var inst in datas)
            {
                var newOpenXmlElement = inst.CloneNode(true);
                b.InsertBefore(newOpenXmlElement, flag);
            }
        }
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="findStr"></param>
    /// <param name="findStrIndex">start 0</param>
    /// <param name="datas"></param>
    public static void InsertBefore(WordprocessingDocument doc, string findStr, int findStrIndex, List<OpenXmlElement> datas)
    {

        Body b = doc.MainDocumentPart.Document.Body;
        OpenXmlElement flag = b.Elements().FirstOrDefault();

        var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
        if (findStrIndex >= flagList.Count)
        {
            return;
        }
        flag = flagList[findStrIndex];

        foreach (var inst in datas)
        {
            var newOpenXmlElement = inst.CloneNode(true);
            b.InsertBefore(newOpenXmlElement, flag);
        }
    }
    /// <summary>
    /// 杀进程
    /// </summary>
    public static void KillWinWordProcess()
    {
        Process[] processes = Process.GetProcesses();
        foreach (Process pr in processes)
        {
            if (pr.ProcessName.ToLower().Contains("winword"))
            {
                pr.Kill();
            }
        }
        Thread.Sleep(1000);
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="findStr"></param>
    /// <param name="findStrIndex">start 0</param>
    /// <param name="datas"></param>
    public static void InsertBefore(string filePath, string findStr, int findStrIndex, List<Paragraph> datas)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();

            var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
            if (findStrIndex >= flagList.Count)
            {
                return;
            }
            flag = flagList[findStrIndex];

            foreach (var inst in datas)
            {
                var newOpenXmlElement = inst.CloneNode(true);
                b.InsertBefore(newOpenXmlElement, flag);
            }
        }
    }
    public static void InsertAfter(string filePath, string findStr, int findStrIndex, List<OpenXmlElement> datas)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();

            var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
            if (findStrIndex >= flagList.Count)
            {
                return;
            }
            flag = flagList[findStrIndex];
            datas.Reverse();
            foreach (var inst in datas)
            {
                b.InsertAfter(inst, flag);
            }
        }
    }

    public static void InsertAfter(WordprocessingDocument doc, string findStr, int findStrIndex, List<OpenXmlElement> datas)
    {
        Body b = doc.MainDocumentPart.Document.Body;
        OpenXmlElement flag = b.Elements().FirstOrDefault();

        var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
        if (findStrIndex >= flagList.Count)
        {
            return;
        }
        flag = flagList[findStrIndex];
        datas.Reverse();
        foreach (var inst in datas)
        {
            b.InsertAfter(inst, flag);
        }
    }
    /// <summary>
    ///在findStr下插入内容 paragraph必须等于findStr才可以插入,包含不会插入
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="findStr"></param>
    /// <param name="findStrIndex"></param>
    /// <param name="datas"></param>

    public static void InsertAfterByEquelsFindStr(string filePath, string findStr, int findStrIndex, List<OpenXmlElement> datas)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();

            var flagList = b.Elements().Where(p => p.InnerText.Equals(findStr)).ToList();
            if (findStrIndex >= flagList.Count)
            {
                return;
            }
            flag = flagList[findStrIndex];
            datas.Reverse();
            foreach (var inst in datas)
            {
                b.InsertAfter(inst, flag);
            }
        }
    }
    public static void InsertBefore(string filePath, string findStr, OpenXmlElement data)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();
            foreach (var inst in b.Elements())
            {
                if (inst.InnerText.Contains(findStr))
                {
                    flag = inst;
                    break;
                }
            }
            flag.InsertBeforeSelf(data);

        }
    }

    public static void InsertBreakAfter(string filePath, string findStr)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();
            foreach (var inst in b.Elements())
            {
                if (inst.InnerText.Contains(findStr))
                {
                    flag = inst;
                    break;
                }
            }
            Break break1 = new Break() { Type = BreakValues.Page };
            Run run2 = new Run();
            run2.Append(break1);
            Paragraph p1 = new Paragraph();
            p1.Append(run2);
            flag.Append(p1);
        }
    }
    public static void InsertBreakAfter(string filePath, string findStr, int findStrIndex)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();

            var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
            if (findStrIndex >= flagList.Count)
            {
                return;
            }
            flag = flagList[findStrIndex];


            Break break1 = new Break() { Type = BreakValues.Page };
            Run run2 = new Run();
            run2.Append(break1);
            Paragraph p1 = new Paragraph();
            p1.Append(run2);
            flag.Append(p1);
        }
    }
    public static void InsertBreakBefore(string filePath, string findStr, int findStrIndex)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements().FirstOrDefault();

            var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
            if (findStrIndex >= flagList.Count)
            {
                return;
            }
            flag = flagList[findStrIndex];


            Break break1 = new Break() { Type = BreakValues.Page };
            Run run2 = new Run();
            run2.Append(break1);
            Paragraph p1 = new Paragraph();
            p1.Append(run2);
            flag.InsertBeforeSelf(p1);
        }
    }
    public static void InsertBreakBefore(string filePath, string findStr)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;

            var flagList = b.Elements().Where(p => p.InnerText.Contains(findStr)).ToList();
            foreach (var flag in flagList)
            {
                Break break1 = new Break() { Type = BreakValues.Page };
                Run run2 = new Run();
                run2.Append(break1);
                Paragraph p1 = new Paragraph();
                p1.Append(run2);
                flag.InsertBeforeSelf(p1);
            }
        }
    }
    /// <summary>
    /// 在文档最后插入一个分页符
    /// </summary>
    /// <param name="filePath"></param>
    public static void InsertBreakEnd(string filePath)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            InsertBreakEnd(doc);
        }
    }
    public static void InsertBreakEnd(WordprocessingDocument doc)
    {
        Body b = doc.MainDocumentPart.Document.Body;
        OpenXmlElement flag = b.Elements<Paragraph>().LastOrDefault();

        Break break1 = new Break() { Type = BreakValues.Page };
        Run run2 = new Run();
        run2.Append(break1);
        Paragraph p1 = new Paragraph();
        p1.Append(run2);
        flag.InsertAfterSelf(p1);
    }
    /// <summary>
    /// 在文档开头插入一个分页符
    /// </summary>
    /// <param name="filePath"></param>
    public static void InsertBreakStart(string filePath)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            OpenXmlElement flag = b.Elements<Paragraph>().FirstOrDefault();

            Paragraph p1 = new Paragraph();

            Break break1 = new Break() { Type = BreakValues.Page };
            Run run1 = new Run();
            run1.Append(break1);
            p1.Append(run1);
            b.InsertBefore(p1, flag);
        }
    }
    /// <summary>
    /// 在paragraph之前插入分页符
    /// </summary>
    /// <param name="paragraph"></param>
    public static void InsertBreakByPragraph(Paragraph paragraph)
    {
        Paragraph paragraph1 = new Paragraph() { RsidParagraphAddition = "00F221A5", RsidRunAdditionDefault = "00F221A5" };

        ParagraphProperties paragraphProperties1 = new ParagraphProperties();
        WidowControl widowControl1 = new WidowControl();
        Justification justification1 = new Justification() { Val = JustificationValues.Left };

        paragraphProperties1.Append(widowControl1);
        paragraphProperties1.Append(justification1);

        Run run1 = new Run();
        Break break1 = new Break() { Type = BreakValues.Page };

        run1.Append(break1);

        paragraph1.Append(paragraphProperties1);
        paragraph1.Append(run1);
        paragraph.InsertBeforeSelf(paragraph1);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="wordPath"></param>
    /// <param name="keyWords">要修改的TableCell里的Paragraph的Text</param>
    /// <param name="innerText"></param>
    /// <param name="rowIndex"></param>
    /// <param name="cellIndex"></param>
    public static void ModifyTableFreRange(string wordPath, string keyWords, string innerText)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Descendants<Paragraph>().Where(p => p.InnerText.Contains("被测设备主要技术参数描述"));
            if (paras != null && paras.Count() != 0)
            {
                var tableRows = paras.First().NextSibling<Table>().Where(p => p.InnerText.Contains(keyWords));
                if (tableRows != null && tableRows.Count() != 0)
                {
                    var para = ((TableRow)tableRows.First()).Descendants<Paragraph>().Where(p => p.InnerText.Contains(keyWords));
                    if (para != null && para.Count() != 0)
                    {
                        ModifyParagraph(para.First(), innerText);
                    }
                }
            }
        }
    }
    #region Oper Table
    /// <summary>
    /// innerTxt唯一则表唯一,List<Table> count=1
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="innerTxt"></param>
    /// <param name="condition">0:StartsWith,1:Contains,2:EndsWith</param>
    /// <returns></returns>
    public static List<Table> FindTableByInnerText(WordprocessingDocument doc, string innerTxt, int condition)
    {
        List<Table> list = new List<Table>();
        Body b = doc.MainDocumentPart.Document.Body;
        foreach (Table inst in b.Descendants<Table>())
        {
            Table table = null;

            if (condition == 0)
            {
                if (inst.InnerText.StartsWith(innerTxt))
                {
                    table = inst;
                }
            }
            else if (condition == 1)
            {
                if (inst.InnerText.Contains(innerTxt))
                {
                    table = inst;
                }
            }
            else if (condition == 2)
            {
                if (inst.InnerText.EndsWith(innerTxt))
                {
                    table = inst;
                }
            }

            if (table != null)
            {
                list.Add(table);
            }
        }
        return list;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="innerTxt"></param>
    /// <param name="condition">0:StartsWith,1:Contains,2:EndsWith</param>
    public static void DeleteTablesByInnerText(string filePath, string innerTxt, int condition)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            var tables = FindTableByInnerText(doc, innerTxt, condition);
            if (tables != null)
            {
                foreach (var inst in tables)
                {
                    inst.Remove();
                }
            }
        }
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="rowInnerTxt"></param>
    /// <param name="rowCondition">0:StartsWith,1:Contains,2:EndsWith</param>
    private static void DeleteTableRowByInnerText(Table table, string rowInnerTxt, int rowCondition)
    {
        if (table != null)
        {
            TableRow row = null;
            foreach (TableRow inst in table.Descendants<TableRow>())
            {
                switch (rowCondition)
                {
                    case 0:
                        if (inst.InnerText.StartsWith(rowInnerTxt))
                        {
                            row = inst;
                        }
                        break;
                    case 1:
                        if (inst.InnerText.Contains(rowInnerTxt))
                        {
                            row = inst;
                        }
                        break;
                    case 2:
                        if (inst.InnerText.EndsWith(rowInnerTxt))
                        {
                            row = inst;
                        }
                        break;
                    default:
                        row = null;
                        break;
                }
            }

            if (row != null)
            {
                row.Remove();
            }
        }
    }
    /// <summary>
    /// 删除FDD杂散发射部分
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="tableInnerTxt"></param>
    /// <param name="tableCondition"></param>
    /// <param name="rowInnerTxt"></param>
    /// <param name="rowCondition"></param>
    public static void DeleteFDDZaSanByInnerText(string filePath, string tableInnerTxt, int tableCondition, string rowInnerTxt, int rowCondition)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            var table = OpenXmlUtil.FindTableByInnerText(doc, tableInnerTxt, tableCondition).FirstOrDefault();
            if (table != null)
            {
                List<DocumentFormat.OpenXml.Wordprocessing.TableRow> rList = new List<DocumentFormat.OpenXml.Wordprocessing.TableRow>();
                DocumentFormat.OpenXml.Wordprocessing.TableRow row = null;

                foreach (DocumentFormat.OpenXml.Wordprocessing.TableRow inst in table.Descendants<DocumentFormat.OpenXml.Wordprocessing.TableRow>())
                {
                    switch (rowCondition)
                    {
                        case 0:
                            if (inst.InnerText.StartsWith(rowInnerTxt))
                            {
                                row = inst;
                            }
                            break;
                        case 1:
                            if (inst.InnerText.Contains(rowInnerTxt))
                            {
                                row = inst;
                            }
                            break;
                        case 2:
                            if (inst.InnerText.EndsWith(rowInnerTxt))
                            {
                                row = inst;
                            }
                            break;
                        default:
                            row = null;
                            break;
                    }

                    //
                    if (row != null)
                    {
                        var firstCell = inst.GetFirstChild<DocumentFormat.OpenXml.Wordprocessing.TableCell>();
                        //if (row != inst && !string.IsNullOrEmpty(firstCell.InnerText))
                        //{
                        //    break;
                        //}

                        if (row != inst && firstCell.TableCellProperties.VerticalMerge.Val != null && firstCell.TableCellProperties.VerticalMerge.Val == MergedCellValues.Restart)
                        {
                            break;
                        }

                        rList.Add(inst);
                    }
                }

                if (rList != null)
                {
                    foreach (var inst in rList)
                    {
                        inst.Remove();
                    }
                }
            }
        }
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="tableInnerTxt"></param>
    /// <param name="tableCondition">0:StartsWith,1:Contains,2:EndsWith</param>
    /// <param name="rowInnerTxt"></param>
    /// <param name="rowCondition">0:StartsWith,1:Contains,2:EndsWith</param>
    public static void DeleteTableRowByInnerText(string filePath, string tableInnerTxt, int tableCondition, string rowInnerTxt, int rowCondition)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            var tables = FindTableByInnerText(doc, tableInnerTxt, tableCondition);
            if (tables != null)
            {
                foreach (var inst in tables)
                {
                    DeleteTableRowByInnerText(inst, rowInnerTxt, rowCondition);
                }
            }
        }
    }
    #endregion

    public static void ModifyParagraph(Paragraph pa, string content)
    {
        Run run = new Run();
        if (pa.Elements<Run>().Count() > 0)
        {
            run = (Run)pa.Elements<Run>().FirstOrDefault().CloneNode(true);
            pa.RemoveAllChildren<Run>();
            run.RemoveAllChildren<Text>();
        }
        else
        {
            run = new Run();
        }
        Text t = new Text(content);
        run.Append(t);
        pa.Append(run);
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="content"></param>
    /// <param name="phInnerTxt"></param>
    /// <param name="condition">0:StartsWith,1:Contains,2:EndsWith</param>
    public static void ModifyParagraph(string filePath, string content, string phInnerTxt, int condition)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            List<Paragraph> phList = FindParaByInnerTxt(doc, phInnerTxt, condition);
            foreach (var inst in phList)
            {
                ModifyParagraph(inst, content);
            }
        }
    }

    private static void FindAllParaRecursive(OpenXmlElement element, List<Paragraph> paragraphList)
    {
        if (element is Paragraph)
        {
            paragraphList.Add((Paragraph)element);
        }
        foreach (var inst in element.Elements())
        {
            FindAllParaRecursive(inst, paragraphList);
        }
    }

    /// <summary>
    /// 查找所有书签
    /// </summary>
    /// <param name="doc"></param>
    /// <returns></returns>
    public static List<string> FindAllBookmark(WordprocessingDocument doc)
    {
        var retList = new List<string>();
        foreach (var footer in doc.MainDocumentPart.FooterParts)
        {
            foreach (var inst in footer.Footer.Descendants<BookmarkStart>())
            {
                retList.Add(inst.Name);
            }
        }
        foreach (var header in doc.MainDocumentPart.HeaderParts)
        {
            foreach (var inst in header.Header.Descendants<BookmarkStart>())
            {
                retList.Add(inst.Name);
            }
        }
        foreach (var inst in doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>())
        {
            if (inst is BookmarkStart)
            {
                retList.Add(inst.Name);
            }
        }
        return retList;
    }
    /// <summary>
    ///得到书签内容
    /// </summary>
    /// <param name="bookmark"></param>
    /// <returns></returns>
    public static string GetTheBookMarkText(BookmarkStart bookmark)
    {
        string str = string.Empty;
        if (bookmark == null)
        {
            return str;
        }
        //紧邻元素
        OpenXmlElement elem = bookmark.NextSibling();
        while (elem != null && !(elem is BookmarkEnd))
        {
            if (elem is Run)
            {
                str += elem.InnerText;
            }
            elem = elem.NextSibling();
        }
        return str;
    }



    public static List<Paragraph> FindAllPara(WordprocessingDocument doc)
    {
        List<Paragraph> paragraphList = new List<Paragraph>();
        Body b = doc.MainDocumentPart.Document.Body;
        foreach (var inst in b.Elements())
        {
            FindAllParaRecursive(inst, paragraphList);
        }

        return paragraphList;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="doc"></param>
    /// <param name="innerTxt"></param>
    /// <param name="condition">0:StartsWith,1:Contains,2:EndsWith</param>
    /// <returns></returns>
    public static List<Paragraph> FindParaByInnerTxt(WordprocessingDocument doc, string innerTxt, int condition)
    {
        Paragraph ph = null;
        List<Paragraph> phList = new List<Paragraph>();
        List<Paragraph> allPhList = FindAllPara(doc);
        foreach (var inst in allPhList)
        {
            if (inst == null || string.IsNullOrEmpty(inst.InnerText))
            {
                continue;
            }

            if (condition == 0)
            {
                if (inst.InnerText.StartsWith(innerTxt))
                {
                    ph = inst;
                }
                else { ph = null; }
            }
            else if (condition == 1)
            {
                if (inst.InnerText.Contains(innerTxt))
                {
                    ph = inst;
                }
                else { ph = null; }
            }
            else if (condition == 2)
            {
                if (inst.InnerText.EndsWith(innerTxt))
                {
                    ph = inst;
                }
                else { ph = null; }
            }

            if (ph != null)
            {
                phList.Add(ph);
            }
        }
        return phList;
    }
    /// <summary>
    /// 获得整机辐射模块名称
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public static string GetModelNameByOpenXml(string filePath)
    {
        string modelName = string.Empty;
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            foreach (var para in paras)
            {
                if (para.InnerText.Contains("模块") && para.InnerText.EndsWith("部分"))
                {
                    string[] modelNames = para.InnerText.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                    modelName = modelNames[modelNames.Count() - 1];
                    break;
                }
            }
            return modelName;
        }
    }

    /// <summary>
    /// 获得整机辐射模块名称
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public static List<string> GetModelNamesByOpenXml(string filePath)
    {
        List<string> modelNameList = new List<string>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            foreach (var para in paras)
            {
                if (para.InnerText.Contains("模块") && para.InnerText.EndsWith("部分"))
                {
                    string[] modelNames = para.InnerText.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                    modelNameList.Add(modelNames[modelNames.Count() - 1]);
                }
            }
            return modelNameList;
        }
    }
    /// <summary>
    /// 得到正文中numId
    /// </summary>
    /// <param name="wordPath"></param>
    /// <returns></returns>
    public static int GetNumId(string wordPath)
    {
        bool flag = false;
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            int index = 0;
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("附件:检测数据及被测设备照片"))
                    {
                        if (index == 1)
                        {
                            flag = true;
                        }
                        index++;
                        continue;
                    }
                    if (flag)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                return id.NumberingId.Val;
                            }
                        }
                    }
                }
            }
        }
        return -1;
    }
    public static int GetPicNumId(string wordPath)
    {
        bool flag = false;
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("附件:检测截图"))
                    {
                        flag = true;
                        continue;
                    }
                    if (flag)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                return id.NumberingId.Val;
                            }
                        }
                    }
                }
            }
        }
        return -1;
    }
    public static int GetAbstractNumId(string wordPath, string numId)
    {
        int abstractNumId = -1;
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            Numbering numbering = doc.MainDocumentPart.NumberingDefinitionsPart.Numbering;
            var numInstances = numbering.Elements<NumberingInstance>().Where(p => p.NumberID == numId);
            if (numInstances != null && numInstances.Count() != 0)
            {
                abstractNumId = ((NumberingInstance)numInstances.First()).AbstractNumId.Val;
            }
        }
        return abstractNumId;
    }
    public static int AddNumberingInstance(string wordPath)
    {
        int id = -1;
        int numId = GetNumId(wordPath);
        if (numId == -1)
        {
            return id;
        }
        int abstractNumId = GetAbstractNumId(wordPath, numId.ToString());
        if (abstractNumId == -1)
        {
            return id;
        }
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            Numbering numbering = doc.MainDocumentPart.NumberingDefinitionsPart.Numbering;
            NumberingInstance instance = new NumberingInstance() { NumberID = numbering.Elements<NumberingInstance>().Count() + 1 };
            instance.AppendChild<AbstractNumId>(new AbstractNumId() { Val = abstractNumId });
            CreateLevel(instance);
            numbering.AppendChild<NumberingInstance>(instance);
            id = instance.NumberID;
        }
        return id;
    }
    public static int AddNumberingInstancePic(string wordPath)
    {
        int id = -1;
        int numId = GetPicNumId(wordPath);
        if (numId == -1)
        {
            return id;
        }
        int abstractNumId = GetAbstractNumId(wordPath, numId.ToString());
        if (abstractNumId == -1)
        {
            return id;
        }
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            Numbering numbering = doc.MainDocumentPart.NumberingDefinitionsPart.Numbering;
            NumberingInstance instance = new NumberingInstance() { NumberID = numbering.Elements<NumberingInstance>().Count() + 1 };
            instance.AppendChild<AbstractNumId>(new AbstractNumId() { Val = abstractNumId });
            CreateLevel(instance);
            numbering.AppendChild<NumberingInstance>(instance);
            id = instance.NumberID;
        }
        return id;
    }
    public static void CreateLevel(NumberingInstance instance)
    {
        string str = string.Empty;
        for (int i = 1; i <= 9; i++)
        {
            str = i == 1 ? "%" + i : str + "." + "%" + i;
            CreateLevelOverRide(instance, i - 1, 1, str);
        }
    }
    public static void CreateLevelOverRide(NumberingInstance instance, int levelIndex, int start, string levelText)
    {
        LevelOverride levelOverRide = new LevelOverride() { LevelIndex = levelIndex };
        Level lev = new Level(
            new StartOverrideNumberingValue() { Val = start },
            new NumberingFormat() { Val = NumberFormatValues.Decimal },
            new LevelSuffix() { Val = LevelSuffixValues.Space },
            new LevelText() { Val = levelText },
            new LevelJustification() { Val = LevelJustificationValues.Left },
            new PreviousParagraphProperties(
                new Indentation() { Left = "0" }),
            new NumberingSymbolRunProperties(
                new RunFonts() { Hint = FontTypeHintValues.EastAsia })
            ) { LevelIndex = levelIndex };
        levelOverRide.Append(lev);
        instance.Append(levelOverRide);
    }
    #region 合并同Band刷序号
    public static void ModifyBandNumId(string wordPath, int sortWordPathListCount)
    {
        List<int> numsId = new List<int>();
        for (int i = 0; i < sortWordPathListCount; i++)
        {
            int id = AddBandNumberingInstance(wordPath);
            if (id == -1)//id==-1,则说明未找到numId.
            {
                return;
            }
            numsId.Add(id);
        }
        ModifyBandNumId(wordPath, numsId);
    }
    public static int AddBandNumberingInstance(string wordPath)
    {
        int id = -1;
        int numId = GetBandNumId(wordPath);
        if (numId == -1)
        {
            return id;
        }
        int abstractNumId = GetAbstractNumId(wordPath, numId.ToString());
        if (abstractNumId == -1)
        {
            return id;
        }
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            Numbering numbering = doc.MainDocumentPart.NumberingDefinitionsPart.Numbering;
            NumberingInstance instance = new NumberingInstance() { NumberID = numbering.Elements<NumberingInstance>().Count() + 1 };
            instance.AppendChild<AbstractNumId>(new AbstractNumId() { Val = abstractNumId });
            CreateLevel(instance);
            numbering.AppendChild<NumberingInstance>(instance);
            id = instance.NumberID;
        }
        return id;
    }
    public static int GetBandNumId(string wordPath)
    {
        bool flag = false;
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("原始记录"))
                    {
                        flag = true;
                        continue;
                    }
                    if (flag)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                return id.NumberingId.Val;
                            }
                        }
                    }
                }
            }
        }
        return -1;
    }
    private static void ModifyBandNumId(string wordPath, List<int> numsId)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            bool flag = false;
            int index = 0;
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("原始记录"))
                    {

                        flag = true;
                        index = 2;
                        continue;
                    }
                    if (flag == true)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                if (index - 2 < numsId.Count)
                                {
                                    id.NumberingId.Val = numsId[index - 2];
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    #endregion
    /// <summary>
    /// 修改编号
    /// </summary>
    /// <param name="wordPath"></param>
    /// <param name="sortWordPathListCount">word数量</param>
    public static void ModifyNumId(string wordPath, int sortWordPathListCount)
    {
        List<int> numsId = new List<int>();
        for (int i = 0; i < sortWordPathListCount; i++)
        {
            int id = AddNumberingInstance(wordPath);
            if (id == -1)//id==-1,则说明未找到numId.
            {
                return;
            }
            numsId.Add(id);
        }
        ModifyNumId(wordPath, numsId);
    }
    public static void ModifyPicNumId(string wordPath, int sortWordPathListCount)
    {
        List<int> numsId = new List<int>();
        for (int i = 0; i < sortWordPathListCount; i++)
        {
            int id = AddNumberingInstancePic(wordPath);
            if (id == -1)//id==-1,则说明未找到numId.
            {
                return;
            }
            numsId.Add(id);
        }
        ModifyPicNumId(wordPath, numsId);
    }
    private static void ModifyPicNumId(string wordPath, List<int> numsId)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            bool flag = false;
            int index = 0;
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("检测截图*"))
                    {

                        flag = true;
                        index = 2;
                        continue;
                    }
                    if (flag == true)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                if (index - 2 < numsId.Count)
                                {
                                    id.NumberingId.Val = numsId[index - 2];
                                }
                            }
                        }
                        if (para.InnerText.EndsWith("检测仪表及附件"))
                        {
                            index++;
                        }
                    }
                }
            }
        }
    }
    private static void ModifyNumId(string wordPath, List<int> numsId)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            bool flag = false;
            int index = 0;
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("附件:检测数据及被测设备照片"))
                    {
                        if (index == 1)
                        {
                            flag = true;
                        }
                        index++;
                        continue;
                    }
                    if (flag == true)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                if (index - 2 < numsId.Count)
                                {
                                    id.NumberingId.Val = numsId[index - 2];
                                }
                            }
                        }
                        if (para.InnerText.EndsWith("检测仪表及附件"))
                        {
                            index++;
                        }
                    }
                }
            }
        }
    }
    #region 本地大报告刷序号
    public static void ModifyLocalReportNumId(string wordPath, int sortWordPathListCount)
    {
        List<int> numsId = new List<int>();
        for (int i = 0; i < sortWordPathListCount; i++)
        {
            int id = AddLocalReportNumberingInstance(wordPath);
            if (id == -1)//id==-1,则说明未找到numId.
            {
                return;
            }
            numsId.Add(id);
        }
        ModifyLocalReportNumId(wordPath, numsId);
    }
    public static int AddLocalReportNumberingInstance(string wordPath)
    {
        int id = -1;
        int numId = GetLocalReportNumId(wordPath);
        if (numId == -1)
        {
            return id;
        }
        int abstractNumId = GetAbstractNumId(wordPath, numId.ToString());
        if (abstractNumId == -1)
        {
            return id;
        }
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            Numbering numbering = doc.MainDocumentPart.NumberingDefinitionsPart.Numbering;
            NumberingInstance instance = new NumberingInstance() { NumberID = numbering.Elements<NumberingInstance>().Count() + 1 };
            instance.AppendChild<AbstractNumId>(new AbstractNumId() { Val = abstractNumId });
            CreateLevel(instance);
            numbering.AppendChild<NumberingInstance>(instance);
            id = instance.NumberID;
        }
        return id;
    }
    public static int GetLocalReportNumId(string wordPath)
    {
        bool flag = false;
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("本地大报告"))
                    {
                        flag = true;
                        continue;
                    }
                    if (flag)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                return id.NumberingId.Val;
                            }
                        }
                    }
                }
            }
        }
        return -1;
    }
    private static void ModifyLocalReportNumId(string wordPath, List<int> numsId)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            bool flag = false;
            int index = 0;
            if (paras != null)
            {
                foreach (Paragraph para in paras.ToList())
                {
                    if (para.InnerText.StartsWith("本地大报告"))
                    {

                        flag = true;
                        index = 2;
                        continue;
                    }
                    if (flag == true)
                    {
                        if (para.ParagraphProperties != null)
                        {
                            foreach (NumberingProperties id in para.ParagraphProperties.Elements<NumberingProperties>())
                            {
                                if (index - 2 < numsId.Count)
                                {
                                    id.NumberingId.Val = numsId[index - 2];
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    #endregion
    /// <summary>
    /// 如果检测项包含整机辐射模块,则再进行编号;
    /// 但非整机辐射模块也适用
    /// </summary>
    /// <param name="finalReport"></param>
    /// <param name="fuLuNumbers"></param>
    public static void ModifyFuJianIndex(string finalReport, List<string> fuLuNumbers)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(finalReport, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>().Where(p => p.InnerText.StartsWith("附件"));
            List<Paragraph> lstPara = new List<Paragraph>();
            bool flag = false;
            int count = 0;
            foreach (var inst in paras)
            {
                if (inst.InnerText.Contains("附件:检测数据及被测设备照片"))
                {
                    if (count == 1)
                    {
                        flag = true;
                        continue;
                    }
                    count++;
                }
                if (flag == true)
                {
                    if (inst.InnerText.StartsWith("附件"))
                    {
                        lstPara.Add(inst);
                    }
                }
            }
            int num = 0;
            foreach (var inst in lstPara)
            {
                foreach (var item in paras)
                {
                    if (inst == item)
                    {
                        string str = string.Empty;
                        if (item.InnerText.Contains(":") || item.InnerText.Contains(":"))
                        {
                            //Console.WriteLine(item.InnerText);
                            string[] strArray = item.InnerText.Split(new Char[] { ':', ':' }, StringSplitOptions.RemoveEmptyEntries);
                            if (strArray.Length > 1)
                            {
                                str = strArray[1];
                            }
                        }
                        ModifyParagraph(item, "附件" + fuLuNumbers[num] + ":" + str);
                        //Console.WriteLine(num);
                        break;
                    }

                }
                num++;
            }
        }
    }
    public static void ModifyBaseInfo(string wordPath)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            var paras = doc.MainDocumentPart.Document.Body.Elements<Paragraph>();
            if (paras == null)
            {
                return;
            }
            bool flag = false;
            bool flag2 = true;
            int index = 0;
            int index2 = 0;
            foreach (Paragraph para in paras.ToList())
            {
                if (para.InnerText.Contains("报告编号"))
                {
                    flag2 = false;
                }
                if (flag2 == true)
                {
                    if (para.InnerText.Contains("无线电发射设备"))
                    {
                        ModifyPara4(para, " 无 线 电 发 射 设 备 ", "48");
                    }
                    if (para.InnerText.Contains("检测报告"))
                    {
                        ModifyPara4(para, "检 测 报 告", "48");
                    }
                }

                if (para.InnerText.Contains("检测单位信息"))
                {
                    if (index == 1)
                    {
                        flag = true;
                    }
                    index++;
                }
                if (para.InnerText.Contains("检测结果概述及检测人员签字"))
                {
                    if (index2 == 1)
                    {
                        return;
                    }
                    index2++;
                }
                if (flag)
                {
                    ModifyPara(para);
                }
            }
        }
    }
    private static void ModifyPara(Paragraph para)
    {
        if (para.InnerText.StartsWith("电话"))
        {
            ModifyPara(para, "电    话");
        }
        if (para.InnerText.StartsWith("传真"))
        {
            ModifyPara(para, "传    真");
        }
        if (para.InnerText.StartsWith("网址"))
        {
            ModifyPara(para, "网    址");
        }
        if (para.InnerText.StartsWith("联系人"))
        {
            ModifyPara(para, "联 系 人");
        }
        if (para.InnerText.StartsWith("(检测报告专用章)"))
        {
            ModifyPara3(para, "(检测报告专用章)", "21");
        }
        if (para.InnerText.StartsWith("签发日期:"))
        {
            ModifyPara3(para, "签发日期:       年      月      日", "24");
        }
        if (para.InnerText.StartsWith("审核:"))
        {
            ModifyPara2(para, "审    核:", "28");
        }
        if (para.InnerText.StartsWith("批准:"))
        {
            ModifyPara2(para, "批    准:", "28");
        }
    }
    public static void ModifyPara4(Paragraph para, string str, string fontSize)
    {
        para.RemoveAllChildren<Run>();
        para.Append(new Run(
            new RunProperties(new FontSize() { Val = fontSize },
                new RunFonts() { Hint = FontTypeHintValues.EastAsia, EastAsia = "黑体" },
                new Bold()),
            new Text(str)));
    }
    public static void ModifyPara3(Paragraph para, string str, string fontSize)
    {
        para.RemoveAllChildren<Run>();
        if (str.Contains("检测报告专用章)"))
        {
            para.Append(new Run(new Text("                                                     ") { Space = SpaceProcessingModeValues.Preserve }));
        }
        else
        {
            para.Append(new Run(new Text("                                ") { Space = SpaceProcessingModeValues.Preserve }));
        }
        para.Append(new Run(
            new RunProperties(new FontSize() { Val = fontSize },
                new RunFonts() { Hint = FontTypeHintValues.EastAsia, EastAsia = "黑体" }),
            new Text(str)));
    }
    public static void ModifyPara2(Paragraph para, string str, string fontSize)
    {
        para.RemoveAllChildren<Run>();
        para.Append(new Run(
            new RunProperties(new FontSize() { Val = fontSize },
                new RunFonts() { Hint = FontTypeHintValues.EastAsia, EastAsia = "黑体" }),
            new Text(str)));
    }
    public static void ModifyPara(Paragraph para, string str)
    {
        string[] strs = para.InnerText.Split(new char[] { ':', ':' });
        para.RemoveAllChildren<Run>();
        para.Append(
            new Run(
                new RunProperties(new FontSize() { Val = "24" }),
                new Text(str + ":" + strs[1]))
            );
    }
    public static void InsertParagraphAtLast(string filePath, string innerText)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            b.AppendChild<Paragraph>(CreateParagraph(innerText));
        }
    }

    private static Paragraph CreateParagraph(string innerText)
    {
        return new Paragraph(
            new ParagraphProperties(
                new OutlineLevel() { Val = 0 },
                new ParagraphMarkRunProperties(
                    new RunFonts() { Ascii = "黑体", HighAnsi = "黑体", EastAsia = "黑体" },
                    new Bold(),
                    new Color() { Val = "000000" },
                    new FontSize() { Val = "32" },
                    new FontSizeComplexScript() { Val = "32" })),
            CreateRun(innerText)
            ) { RsidParagraphMarkRevision = "002D4DE0", RsidParagraphAddition = "00B87079", RsidParagraphProperties = "002D4DE0", RsidRunAdditionDefault = "00037A5D" };
    }
    private static Run CreateRun(string innerText)
    {
        return new Run(
            new RunProperties(
                new RunFonts() { Hint = FontTypeHintValues.EastAsia, Ascii = "黑体", HighAnsi = "黑体", EastAsia = "黑体" },
                new Bold(),
                new Color() { Val = "000000" },
                new FontSize() { Val = "32" },
                new FontSizeComplexScript() { Val = "32" }),
            new Text(innerText));
    }
    public static void RemoveParagraph(string filePath, string keyWords, int index)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            Body b = doc.MainDocumentPart.Document.Body;
            int count = 0;
            Paragraph para1 = null;
            foreach (Paragraph para in b.Elements<Paragraph>())
            {
                if (para.InnerText.Contains(keyWords))
                {
                    if (count == index)
                    {
                        para1 = para;
                        break;
                    }
                    count++;
                }
            }
            if (para1 != null)
            {
                para1.Remove();
            }
        }
    }
    public static void RemoveSectionInParagraph(string filePath, string keyWords, int index)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        {
            int count = 0;
            Paragraph para1 = null;
            foreach (Paragraph para in doc.MainDocumentPart.Document.Body.Elements<Paragraph>())
            {
                if (para.InnerText.Contains(keyWords))
                {
                    if (count == index)
                    {
                        para1 = para;
                    }
                    count++;
                }
            }
            if (para1 != null)
            {
                IEnumerable<Run> runList = para1.Elements<Run>();
                runList.Last().Remove();
            }
        }
    }
    public static void RemoveOpenXmlElement(Paragraph para)
    {
        List<OpenXmlElement> elementList = new List<DocumentFormat.OpenXml.OpenXmlElement>();
        bool flag = false;
        if (para == null)
        {
            return;
        }
        foreach (OpenXmlElement element in para.Elements())
        {
            if (element is PermEnd)
            {
                flag = false;
                continue;
            }
            if (element is PermStart)
            {
                flag = true;
                continue;
            }
            if (flag)
            {
                elementList.Add(element);
            }
        }
        foreach (OpenXmlElement element in elementList)
        {
            if (element != null)
            {
                element.Remove();
            }
        }
    }
    public static void InsertRunAfterPermStart(Paragraph para, params string[] innerTxtList)
    {

        List<PermStart> permStartList = new List<PermStart>();
        if (para == null)
        {
            return;
        }
        RemoveOpenXmlElement(para);
        foreach (PermStart startElement in para.Elements<PermStart>())
        {
            if (startElement != null)
            {
                permStartList.Add(startElement);
            }
        }
        int i = 0;
        foreach (PermStart permStart in permStartList)
        {
            if (i < innerTxtList.Length)
            {
                permStart.InsertAfterSelf<Run>(new Run(new Text(innerTxtList[i])));
            }
            i++;
        }
    }
    public static List<string> GetRunAfterPermStart(Paragraph para)
    {
        List<string> list = new List<string>();
        if (para == null)
        {
            return null;
        }
        bool flag = false;
        List<Run> runList = new List<Run>();
        foreach (OpenXmlElement startElement in para.Elements<OpenXmlElement>())
        {
            if (startElement == null)
            {
                continue;
            }
            if (startElement is PermEnd)
            {
                string str = string.Empty;
                foreach (Run run in runList)
                {
                    str += run.InnerText;
                }
                list.Add(str);
                flag = false;
            }
            if (flag && (startElement is Run))
            {
                runList.Add((Run)startElement);
            }
            if (startElement is PermStart)
            {
                runList.Clear();
                flag = true;
            }
        }
        return list;
    }
    /// <summary>
    /// 对齐方式
    /// </summary>
    /// <param name="prop"></param>
    /// <param name="enumVal"></param>
    public static void JustificationWay(ParagraphProperties prop, JustificationValues enumVal)
    {
        if (prop != null)
        {
            var justifications = prop.Elements<Justification>();
            if (justifications != null)
            {
                Justification just = justifications.FirstOrDefault();
                if (just != null)
                {
                    just.Val = enumVal;
                }
            }
            else
            {
                Justification just = new Justification() { Val = enumVal };
                prop.Append(just);
            }
        }
    }
    /// <summary>
    /// 得到startVals->结尾 的OpenXmlElement
    /// </summary>
    /// <param name="wordPath"></param>
    /// <param name="startVals">开始关键字</param>
    ///<param name="startNum">第几个startVals,从0开始</param>
    /// <param name="way">0:包含startVals; 1:不包含startVals</param>
    /// <param name="copyOrRemove">0:返回拷贝的数据; 1:返回原数据</param>
    /// <returns></returns>
    public static List<OpenXmlElement> FindOpenXmlElement(string wordPath, string startVals, int startNum, int way, int copyOrRemove)
    {
        List<OpenXmlElement> elementList = new List<OpenXmlElement>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            elementList = FindOpenXmlElement(startVals, startNum, way, copyOrRemove, doc);
        }
        return elementList;
    }

    public static List<OpenXmlElement> FindOpenXmlElement(string startVals, int startNum, int way, int copyOrRemove, WordprocessingDocument doc)
    {
        List<OpenXmlElement> elementList = new List<OpenXmlElement>();
        Body b = doc.MainDocumentPart.Document.Body;
        bool flag = false;
        int count = 0;
        foreach (OpenXmlElement element in b.Elements<OpenXmlElement>())
        {
            if (element.InnerText.EndsWith(startVals))
            {
                if (count == startNum)
                {
                    flag = true;
                    if (way == 1)
                    {
                        count++;
                        continue;
                    }
                }
                count++;
            }
            if (element is SectionProperties)
            {
                continue;
            }
            if (flag)
            {
                if (copyOrRemove == 0)
                {
                    elementList.Add(element.CloneNode(true));
                }
                else if (copyOrRemove == 1)
                {
                    elementList.Add(element);
                }
            }
        }
        return elementList;
    }
    /// <summary>
    ///  得到startVals->endVals之间 的OpenXmlElement
    /// </summary>
    /// <param name="wordPath"></param>
    /// <param name="startVals">开始关键字</param>
    /// <param name="startNum">第几个startVals,从0开始</param>
    /// <param name="endVals">结束关键字</param>
    /// <param name="endNum">第几个endVals,从0开始</param>
    /// <param name="way">0:包含startVals,包含endVals; 1:不包含startVals,不包含endVals;2:只包含startVals;3:只包含endVals</param>
    /// <param name="copyOrRemove">0:返回拷贝的数据; 1:返回原数据</param>
    /// <returns></returns>
    public static List<OpenXmlElement> FindOpenXmlElement(string wordPath, string startVals, int startNum, string endVals, int endNum, int way, int copyOrRemove)
    {
        List<OpenXmlElement> elementList = new List<OpenXmlElement>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            elementList = FindOpenXmlElement(startVals, startNum, endVals, endNum, way, copyOrRemove, doc);
        }
        return elementList;
    }

    public static List<OpenXmlElement> FindOpenXmlElement(string startVals, int startNum, string endVals, int endNum, int way, int copyOrRemove, WordprocessingDocument doc)
    {
        List<OpenXmlElement> elementList = new List<OpenXmlElement>();
        Body b = doc.MainDocumentPart.Document.Body;
        bool flag = false;
        int startCount = 0;
        int endCount = 0;
        foreach (OpenXmlElement element in b.Elements<OpenXmlElement>())
        {
            switch (way)
            {
                case 0:
                    Step1(startVals, startNum, ref flag, ref startCount, element);
                    Step2(elementList, flag, copyOrRemove, element);
                    Step3(endVals, endNum, ref flag, ref endCount, element);
                    break;
                case 1:
                    Step3(endVals, endNum, ref flag, ref endCount, element);
                    Step2(elementList, flag, copyOrRemove, element);
                    Step1(startVals, startNum, ref flag, ref startCount, element);
                    break;
                case 2:
                    Step3(endVals, endNum, ref flag, ref endCount, element);
                    Step1(startVals, startNum, ref flag, ref startCount, element);
                    Step2(elementList, flag, copyOrRemove, element);
                    break;
                case 3:
                    Step2(elementList, flag, copyOrRemove, element);
                    Step1(startVals, startNum, ref flag, ref startCount, element);
                    Step3(endVals, endNum, ref flag, ref endCount, element);
                    break;
            }
        }
        return elementList;
    }

    private static void Step3(string endVals, int endNum, ref bool flag, ref int endCount, OpenXmlElement element)
    {
        if (element.InnerText.EndsWith(endVals))
        {
            if (endCount == endNum)
            {
                flag = false;
            }
            endCount++;
        }
    }

    private static void Step2(List<OpenXmlElement> elementList, bool flag, int copyOrRemove, OpenXmlElement element)
    {
        if (flag)
        {
            if (copyOrRemove == 0)
            {
                elementList.Add(element.CloneNode(true));

            }
            else if (copyOrRemove == 1)
            {
                elementList.Add(element);

            }
        }
    }

    private static void Step1(string startVals, int startNum, ref bool flag, ref int startCount, OpenXmlElement element)
    {
        if (element.InnerText.EndsWith(startVals))
        {
            if (startCount == startNum)
            {
                flag = true;
            }
            startCount++;
        }
    }

    /// <summary>
    /// srcPath中的openXmlList复制到dstPath中,需要把srcPath的ImagePart信息copy到dstPath中,重新关联id关系
    /// 修改图片关联Id
    /// </summary>
    /// <param name="srcPath"></param>
    /// <param name="dstPath"></param>
    /// <param name="srcOpenXmlElementList">srcPath中的OpenXmlElementList</param>
    public static void ModifyAssociatedIdOfPicture(string srcPath, string dstPath, List<OpenXmlElement> srcOpenXmlElementList)
    {
        Dictionary<string, string> newAndOldId = new Dictionary<string, string>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(dstPath, true))
        {
            using (WordprocessingDocument doc2 = WordprocessingDocument.Open(srcPath, true))
            {
                foreach (ImagePart inst in doc2.MainDocumentPart.ImageParts)
                {
                    ImagePart imagePart = doc.MainDocumentPart.AddPart<ImagePart>(inst);
                    newAndOldId.Add(doc2.MainDocumentPart.GetIdOfPart(inst), doc.MainDocumentPart.GetIdOfPart(imagePart));
                }
            }
            foreach (OpenXmlElement element in srcOpenXmlElementList)
            {
                foreach (AA.Blip blip in element.Descendants<AA.Blip>())
                {
                    blip.Embed = newAndOldId[blip.Embed];
                }
                foreach (V.ImageData imageData in element.Descendants<V.ImageData>())
                {
                    imageData.RelationshipId = newAndOldId[imageData.RelationshipId];
                }
            }
        }
    }

    #region Insert SectionBreak
    /// <summary>
    /// 
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="innerTxt"></param>
    /// <param name="condition">0:StartsWith,1:Contains,2:EndsWith</param>
    public static void InsertSectionBreakByParagraphInnerTxt(string fileName, string innerTxt, int condition)
    {
        using (WordprocessingDocument wDoc = WordprocessingDocument.Open(fileName, true))
        {
            Body b = wDoc.MainDocumentPart.Document.Body;

            var pFirst = OpenXmlUtil.FindParaByInnerTxt(wDoc, innerTxt, condition).FirstOrDefault();
            if (pFirst == null)
            {
                return;
            }
            //In order to position the section break within a paragraph, there 
            //actually needs to be a new paragraph that follows the section break. 
            //Make a copy of the first paragraph, then break it into two parts (paras).
            Paragraph pNew1 = (Paragraph)pFirst.CloneNode(true);
            Paragraph pNew2 = new Paragraph();
            pFirst.InsertAfterSelf(pNew2);
            //First para contains first run of original
            var runs = pNew1.Elements<Run>();

            foreach (var inst in runs)
            {
                pNew2.Append(inst.CloneNode(true));
            }

            //Add the section break to the first paragraph.

            ParagraphProperties pProps = pNew1.Elements<ParagraphProperties>().FirstOrDefault(); //old ParagraphProperties;
            //ParagraphProperties pPropsCloneNode = (ParagraphProperties)pProps.CloneNode(true); //CloneNode old ParagraphProperties;
            ParagraphProperties pPropsCloneNode = GenerateParagraphProperties();
            if (pPropsCloneNode != null)
            {
                pNew2.InsertAt(pPropsCloneNode, 0);

            }

            //Second paragraph contains all but first run of original
            foreach (var inst in runs)
            {
                inst.RemoveAllChildren();
                inst.Remove();
            }

            //Remove the original paragraph at the end.
            pFirst.RemoveAllChildren();
            pFirst.Remove();
        }
    }
    public static void RemoveFooterAllChild(string wordPath)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            if (doc.MainDocumentPart.FooterParts != null)
            {
                List<Footer> footerLst = new List<Footer>();
                foreach (FooterPart footerPart in doc.MainDocumentPart.FooterParts)
                {
                    footerLst.Add(footerPart.Footer);
                }
                foreach (Footer footer in footerLst)
                {
                    footer.RemoveAllChildren();
                }
            }
        }
    }
    public static ParagraphProperties GenerateParagraphProperties()
    {
        ParagraphProperties paragraphProperties1 = new ParagraphProperties();

        ParagraphMarkRunProperties paragraphMarkRunProperties1 = new ParagraphMarkRunProperties();
        RunFonts runFonts1 = new RunFonts() { Ascii = "Arial", HighAnsi = "Arial", ComplexScript = "Arial" };
        Color color1 = new Color() { Val = "000000" };
        FontSize fontSize1 = new FontSize() { Val = "24" };
        FontSizeComplexScript fontSizeComplexScript1 = new FontSizeComplexScript() { Val = "24" };

        paragraphMarkRunProperties1.Append(runFonts1);
        paragraphMarkRunProperties1.Append(color1);
        paragraphMarkRunProperties1.Append(fontSize1);
        paragraphMarkRunProperties1.Append(fontSizeComplexScript1);

        SectionProperties sectionProperties1 = new SectionProperties() { RsidR = "00E04B20", RsidSect = "00D46C38" };
        //HeaderReference headerReference1 = new HeaderReference() { Type = HeaderFooterValues.Default, Id = "rId9" };
        PageSize pageSize1 = new PageSize() { Width = (UInt32Value)11906U, Height = (UInt32Value)16838U };
        PageMargin pageMargin1 = new PageMargin() { Top = 1644, Right = (UInt32Value)1797U, Bottom = 1440, Left = (UInt32Value)1622U, Header = (UInt32Value)851U, Footer = (UInt32Value)992U, Gutter = (UInt32Value)0U };
        PageNumberType pageNumberType1 = new PageNumberType() { Start = 1 };
        Columns columns1 = new Columns() { Space = "720" };
        DocGrid docGrid1 = new DocGrid() { Type = DocGridValues.Lines, LinePitch = 312 };

        //sectionProperties1.Append(headerReference1);
        sectionProperties1.Append(pageSize1);
        sectionProperties1.Append(pageMargin1);
        sectionProperties1.Append(pageNumberType1);
        sectionProperties1.Append(columns1);
        sectionProperties1.Append(docGrid1);

        paragraphProperties1.Append(paragraphMarkRunProperties1);
        paragraphProperties1.Append(sectionProperties1);
        return paragraphProperties1;
    }
    #endregion
    [DllImport("kernel32.dll")]
    public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
    [DllImport("kernel32.dll")]
    public static extern bool CloseHandle(IntPtr hObject);

    public const int OF_READWRITE = 2;
    public const int OF_SHARE_DENY_NONE = 0x40;
    public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);
    /// <summary>
    /// 判断文件是否被占用
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public static bool IsInUse(string filePath)
    {
        IntPtr vHandle = _lopen(filePath, OF_READWRITE | OF_SHARE_DENY_NONE);
        if (vHandle == HFILE_ERROR)
        {
            return true;
        }
        CloseHandle(vHandle);
        return false;
    }
    public static void RenameLEXuHao(string mergeSingeMxa20Paht)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(mergeSingeMxa20Paht, true))
        {
            Body body = doc.MainDocumentPart.Document.Body;
            int num = 0;
            bool isLe = false;
            string sencondTitleStr = string.Empty;
            foreach (var paragraph in body.Elements<DocumentFormat.OpenXml.Wordprocessing.Paragraph>())
            {
                var oil = paragraph.Descendants<OutlineLevel>().FirstOrDefault();
                if (oil == null)
                {
                    continue;
                }
                if (paragraph.InnerText.Contains("检测条件"))
                {
                    num = 0;
                    isLe = false;
                    continue;
                }
                if (paragraph.InnerText.Contains("BR部分检测数据"))
                {
                    num++;
                    isLe = false;
                    continue;
                }
                if (paragraph.InnerText.Contains("EDR部分检测数据"))
                {
                    num++;
                    isLe = false;
                    continue;
                }
                if (paragraph.InnerText.Contains("LE部分检测数据"))
                {
                    if (num != 0)
                    {
                        isLe = true;
                        string xuHaoStr = "5." + ++num;
                        sencondTitleStr = "5." + num + ".";
                        string titleName = xuHaoStr + " LE部分检测数据";
                        OpenXmlUtil.ModifyParagraph(paragraph, titleName);
                        continue;
                    }
                }
                if (isLe)
                {
                    var contentStr = paragraph.InnerText.Replace("5.1.", sencondTitleStr);
                    OpenXmlUtil.ModifyParagraph(paragraph, contentStr);
                }
            }

        }
    }

    public static void InsertTestDataMxa20(string mergeSingeMxa20Paht, List<List<OpenXmlElement>> mergeSingeMxaOpenXmlElementLists)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(mergeSingeMxa20Paht, true))
        {
            Body body = doc.MainDocumentPart.Document.Body;
            List<OpenXmlElement> openXmlElementList = body.Elements<OpenXmlElement>().Where(p => p.InnerText.Contains("检测仪表及附件")).ToList();
            for (int i = 0; i < openXmlElementList.Count; i++)
            {
                if (i < mergeSingeMxaOpenXmlElementLists.Count)
                {
                    foreach (var openXmlElement in mergeSingeMxaOpenXmlElementLists[i])
                    {
                        var newOpenXmlElement = openXmlElement.CloneNode(true);
                        openXmlElementList[i].InsertBeforeSelf(newOpenXmlElement);
                    }
                }
            }
        }
    }

    public static void GenMergeSingleMxa40TestData(string mergeSingeMxa40Paht, List<List<OpenXmlElement>> mergeSingeMxaOpenXmlElementLists)
    {
        List<OpenXmlElement> mergeSingeMxaOpenXmlElementList = new List<OpenXmlElement>();
        bool isFlag = false;

        using (WordprocessingDocument doc = WordprocessingDocument.Open(mergeSingeMxa40Paht, true))
        {
            Body body = doc.MainDocumentPart.Document.Body;
            foreach (var openXmlElement in body.Elements<OpenXmlElement>())
            {
                if (openXmlElement.InnerText.Contains("LE部分检测数据"))
                {
                    mergeSingeMxaOpenXmlElementList = new List<OpenXmlElement>();
                    isFlag = true;
                }
                if (openXmlElement.InnerText.Contains("检测仪表及附件"))
                {
                    isFlag = false;
                    mergeSingeMxaOpenXmlElementLists.Add(mergeSingeMxaOpenXmlElementList);
                    continue;
                }
                if (isFlag)
                {
                    mergeSingeMxaOpenXmlElementList.Add(openXmlElement);
                }
            }
        }
    }
    public static List<List<OpenXmlElement>> RangList(string mergeSingeMxa40Path, string startContentStr, string endContentStr)
    {
        List<List<OpenXmlElement>> openXmlElementForJianCeList = new List<List<OpenXmlElement>>();
        using (WordprocessingDocument doc = WordprocessingDocument.Open(mergeSingeMxa40Path, true))
        {
            Body body = doc.MainDocumentPart.Document.Body;
            bool isFlag = false;
            List<OpenXmlElement> openXmlElementList = new List<OpenXmlElement>();
            foreach (var openXmlElement in body.Elements<OpenXmlElement>())
            {
                if (openXmlElement.InnerText.Contains(startContentStr))
                {
                    isFlag = true;
                    openXmlElementList = new List<OpenXmlElement>();
                    continue;
                }
                if (openXmlElement.InnerText.Contains(endContentStr))
                {
                    isFlag = false;
                    openXmlElementForJianCeList.Add(openXmlElementList);
                    continue;
                }
                if (isFlag)
                {
                    openXmlElementList.Add(openXmlElement);
                }
            }
        }
        return openXmlElementForJianCeList;
    }

    public static void ModefyPicNum(string biaoTiNum, string wordPath)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPath, true))
        {
            ModefyPicNum(biaoTiNum, doc);
        }
    }
    public static void ModefyPicNum(string biaoTiNum, WordprocessingDocument doc)
    {
        Body body = doc.MainDocumentPart.Document.Body;
        List<Paragraph> openXmlParagraphList = new List<Paragraph>();
        openXmlParagraphList = body.Elements<Paragraph>().Where(p => (p.InnerText.Contains("图") && p.InnerText.Contains("-")) && !p.InnerText.Contains("图5-")).ToList();
        for (int i = 0; i < openXmlParagraphList.Count; i++)
        {
            OpenXmlUtil.ModifyParagraph(openXmlParagraphList[i], "图" + biaoTiNum + "-" + (i + 1));
        }
    }

    /// <summary>
    /// 修改标题的缩进,左对齐Left=0
    /// </summary>
    /// <param name="path"></param>
    public static void SetIndentationInNumParagraph(string path)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(path, true))
        {
            var body = doc.MainDocumentPart.Document.Body;

            List<Paragraph> allNumPara = OpenXmlUtil.FindAllPara(doc).Where(p => p.Descendants<NumberingProperties>().Count() > 0).ToList();
            for (int i = 0; i < allNumPara.Count; i++)
            {
                var indents = allNumPara[i].Descendants<Indentation>();
                foreach (var indent in indents)
                {
                    indent.FirstLineChars = new DocumentFormat.OpenXml.Int32Value(0);
                    indent.Left = new DocumentFormat.OpenXml.StringValue("0");
                    indent.FirstLine = new DocumentFormat.OpenXml.StringValue("0");
                    indent.Hanging = null;
                }

            }
        }

    }
}

}

此方法需要引用DocumentFormat.OpenXml; 这个大家可以在网上一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值