示例#1
0
    /// <summary>
    /// 取代書籤
    /// </summary>
    /// <param name="bookmarkName">書籤名稱</param>
    /// <param name="text">取代的值</param>
    /// <param name="delFlag">若取代值為空,是否刪除整個段落</param>
    /// <param name="color">套用此顏色</param>
    public void ReplaceBookmark(string bookmarkName, string text, bool delFlag, System.Drawing.Color color)
    {
        try {
            MainDocumentPart mainPart = outDoc.MainDocumentPart;
            //IEnumerable<BookmarkEnd> bookMarkEnds = mainPart.RootElement.Descendants<BookmarkEnd>();
            foreach (BookmarkStart bookmarkStart in mainPart.RootElement.Descendants <BookmarkStart>())
            {
                if (bookmarkStart.Name.Value.ToLower() == bookmarkName.ToLower())
                {
                    string id = bookmarkStart.Id.Value;

                    //如果是空值,且要刪除整個段落
                    if (text == "" && delFlag)
                    {
                        bookmarkStart.Parent.Remove();
                    }
                    else
                    {
                        BookmarkEnd bookmarkEnd = bookmarkStart.Parent.Descendants <BookmarkEnd>().Where(i => i.Id.Value == id).FirstOrDefault();

                        //留第一個run其他run刪除,從BookmarkStart刪到BookmarkEnd為止
                        OpenXmlElement[] bookmarkItems = bookmarkStart.Parent.ChildElements.ToArray();
                        //HttpContext.Current.Response.Write(bookmarkItems.Count());
                        //HttpContext.Current.Response.End();

                        bool canRemove = false;
                        int  bIndex    = 0;
                        foreach (OpenXmlElement item in bookmarkItems)
                        {
                            if (item.GetType() == typeof(BookmarkEnd) && bookmarkEnd != null && bookmarkEnd.Id == id)
                            {
                                break;
                            }
                            if (canRemove && item.GetType() == typeof(Run))
                            {
                                if (bIndex == 0)
                                {
                                    string[] txtArr = text.Split('\n');
                                    for (int i = 0; i < txtArr.Length; i++)
                                    {
                                        if (i == 0)
                                        {
                                            if (color != System.Drawing.Color.Empty)
                                            {
                                                RunProperties FirstRunProp = item.Descendants <RunProperties>().FirstOrDefault();
                                                if (FirstRunProp == null)
                                                {
                                                    FirstRunProp = new RunProperties();
                                                }
                                                Color RunColor = new Color()
                                                {
                                                    Val = toHtmlHexColor(color)
                                                };
                                                FirstRunProp.Append(RunColor);
                                            }
                                            item.GetFirstChild <Text>().Text = txtArr[i];
                                        }
                                        else
                                        {
                                            item.Append(new Break());
                                            item.Append(new Text(txtArr[i]));
                                        }
                                    }
                                }
                                else
                                {
                                    item.Remove();
                                }
                                bIndex++;
                            }
                            //if (item.GetType() == typeof(BookmarkStart)) {
                            if (item.Equals(bookmarkStart))
                            {
                                canRemove = true;
                            }
                        }

                        bookmarkStart.Remove();
                        if (bookmarkEnd != null)
                        {
                            bookmarkEnd.Remove();
                        }
                    }
                }
            }
        }
        catch (Exception ex) {
            throw new Exception("取代書籤錯誤!!(" + bookmarkName + ")", ex);
        }
    }
示例#2
0
        private static void PasteBookmarkText(MainDocumentPart documentPart, string bookmarkName, string text)
        {
            IEnumerable <BookmarkEnd> bookMarkEnds = documentPart.RootElement.Descendants <BookmarkEnd>();

            foreach (BookmarkStart bookmarkStart in documentPart.RootElement.Descendants <BookmarkStart>())
            {
                if (bookmarkStart.Name.Value.ToLower() == bookmarkName.ToLower())
                {
                    Console.WriteLine("find bookmark(" + bookmarkName + ")!!");
                    string      id          = bookmarkStart.Id.Value;
                    BookmarkEnd bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First();

                    ////var bookmarkText = bookmarkEnd.NextSibling();
                    //Run bookmarkRun = bookmarkStart.NextSibling<Run>();
                    //if (bookmarkRun != null) {
                    //	string[] txtArr = text.Split('\n');
                    //	for (int i = 0; i < txtArr.Length; i++) {
                    //		if (i == 0) {
                    //			Console.WriteLine("insert single!!");
                    //			bookmarkRun.GetFirstChild<Text>().Text = txtArr[i];
                    //		} else {
                    //			Console.WriteLine("insert multi!!");
                    //			bookmarkRun.Append(new Break());
                    //			bookmarkRun.Append(new Text(txtArr[i]));
                    //		}
                    //	}
                    //	//bookmarkRun.GetFirstChild<Text>().Text = text;
                    //	//bookmarkRun.Append(new Break());
                    //	//bookmarkRun.Append(new Text("換行"));
                    //}
                    //bookmarkStart.Remove();
                    //bookmarkEnd.Remove();

                    Run bookmarkRun = bookmarkStart.NextSibling <Run>();
                    if (bookmarkRun != null)
                    {
                        Run      tempRun = bookmarkRun;
                        string[] txtArr  = text.Split('\n');
                        for (int i = 0; i < txtArr.Length; i++)
                        {
                            if (i == 0)
                            {
                                bookmarkRun.GetFirstChild <Text>().Text = txtArr[i];
                            }
                            else
                            {
                                bookmarkRun.Append(new Break());
                                bookmarkRun.Append(new Text(txtArr[i]));
                            }
                        }
                        int j = 0;
                        while (tempRun.NextSibling() != null && tempRun.NextSibling().GetType() != typeof(BookmarkEnd))
                        {
                            j++;
                            tempRun.NextSibling().Remove();
                            if (j >= 20)
                            {
                                break;
                            }
                        }
                    }
                    bookmarkStart.Remove();
                    if (bookmarkEnd != null)
                    {
                        bookmarkEnd.Remove();
                    }
                }
            }
        }