簡體   English   中英

如何正確將樣式應用於Open Office XML書簽文本

[英]How to correctly apply style to Open Office XML Bookmark text

我准備了MS Word文檔模板,並在要插入文本的位置插入了書簽。 目前,我能夠插入文本,但是所有本機樣式都消失了(即:字體大小/樣式),我希望樣式能夠被繼承。

我一直在參考這個問題來尋求啟發,但是我收到了格式錯誤的XML:

<w:rFonts w:ascii="Playfair Display" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" />

這是我正在使用的書簽開始/結束的代碼片段:

<?xml version="1.0" encoding="UTF-8"?>
<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:rsidR="00300E4C" w:rsidRDefault="00582F11">
   <w:pPr>
      <w:spacing w:before="265" />
      <w:ind w:left="2822" w:right="1122" />
      <w:jc w:val="center" />
      <w:rPr>
         <w:rFonts w:ascii="Playfair Display" />
         <w:i />
         <w:sz w:val="88" />
      </w:rPr>
   </w:pPr>
   <w:bookmarkStart w:name="F_4000" w:id="0" />
   <w:bookmarkEnd w:id="0" />
   <w:r>
      <w:rPr>
         <w:rFonts w:ascii="Playfair Display" />
         <w:i />
         <w:color w:val="113628" />
         <w:sz w:val="88" />
      </w:rPr>
      <w:t xml:space="preserve"> </w:t>
   </w:r>
   <w:bookmarkStart w:name="F_4002" w:id="1" />
   <w:bookmarkEnd w:id="1" />
</w:p>

使用以下代碼時:

IEnumerable<OpenXmlElement> elementsAfter = bookmark.ElementsAfter();
IEnumerable<OpenXmlElement> insideBookmark = elementsAfter.TakeWhile(element => !(element is BookmarkEnd));
foreach (OpenXmlElement element in insideBookmark)
{
    element.RemoveAllChildren();
}

OpenXmlElement previousSibling = bookmark.PreviousSibling();
while (previousSibling is BookmarkStart || previousSibling is BookmarkEnd)
{
    previousSibling = previousSibling.PreviousSibling();
}

//Get previous font.
var runProperties = previousSibling.GetFirstChild<ParagraphMarkRunProperties>().GetFirstChild<RunFonts>();
//var runProperties = previousSibling.GetFirstChild<RunProperties>(); - if its simple element.

// Clone.
var newProperty = (RunFonts)runProperties.Clone();

// Create container with properties
// This is where I run into malformed XML for newProperty
var container = new Run(text)
{
    RunProperties = new RunProperties() { RunFonts = newProperty }
};

編輯:將一些文本插入書簽位置后,這里是XML(包含XML的段落XML)

<w:p w:rsidR="00300E4C" w:rsidRDefault="00582F11" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:pPr>
    <w:spacing w:before="265" />
    <w:ind w:left="2822" w:right="1122" />
    <w:jc w:val="center" />
    <w:rPr>
      <w:rFonts w:ascii="Playfair Display" />
      <w:i />
      <w:sz w:val="88" />
    </w:rPr>
  </w:pPr>
  <w:r>
    <w:t>First</w:t>
  </w:r>
  <w:bookmarkStart w:name="F_4000" w:id="0" />
  <w:bookmarkEnd w:id="0" />
  <w:r>
    <w:rPr>
      <w:rFonts w:ascii="Playfair Display" />
      <w:i />
      <w:color w:val="113628" />
      <w:sz w:val="88" />
    </w:rPr>
    <w:t xml:space="preserve"> </w:t>
  </w:r>
  <w:r>
    <w:t>Last</w:t>
  </w:r>
  <w:bookmarkStart w:name="F_4002" w:id="1" />
  <w:bookmarkEnd w:id="1" />
</w:p>

我只是想嘗試獲取本機(已處於活動狀態)樣式,但是我認為書簽正在以某種方式將其分解。 任何建議,不勝感激。

我最終想出的方法如下。 最大的幫助是使用Open XML SDK生產率工具來確定我需要插入哪種結構。 我需要輸入文本的兩個位置以一種奇怪的方式放置,因此一口氣就能輕松完成,對於其余元素,我只需要插入AfterSelf()

if (bookMarkEnd.Key == "F_4000" || bookMarkEnd.Key == "F_4002")
{
     OpenXmlElement previousSibling = bookMarkEnd.Value.Parent.PreviousSibling();

     while (previousSibling is BookmarkStart || previousSibling is BookmarkEnd)
     {
         previousSibling = previousSibling.PreviousSibling();
     }

     OpenXmlElement next = bookMarkEnd.Value.NextSibling<Run>();

     if (next != null)
     {
         next.GetFirstChild<Text>().Text = bookMarkEnd.Key + " " + "F_4002";
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM