/// <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); } }
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(); } } } }