2017-09-21 3 views
0

여러 줄 서식을 따르는 콘텐트 컨트롤을 얻는데 어려움이 있습니다. 그것은 문자 그대로 모든 것을 해석하는 것 같습니다. OpenXML을 처음 접했을 때 나는 뭔가 간단한 것을 놓치고 있어야 할 것 같은 기분입니다.OpenXML을 사용하여 서식있는 텍스트 콘텐트 컨트롤에 여러 줄의 텍스트 삽입

이 함수를 사용하여 다중 행 문자열을 변환합니다.

private static void parseTextForOpenXML(Run run, string text) 
    { 
     string[] newLineArray = { Environment.NewLine, "<br/>", "<br />", "\r\n" }; 
     string[] textArray = text.Split(newLineArray, StringSplitOptions.None); 

     bool first = true; 

     foreach (string line in textArray) 
     { 
      if (!first) 
      { 
       run.Append(new Break()); 
      } 

      first = false; 

      Text txt = new Text { Text = line }; 
      run.Append(txt); 
     } 
    } 

나는 나뿐만 아니라 InnerXML 및 OuterXML을 시도했습니다 있지만

doc.InsertText("Primary", primaryRun.InnerText); 

... 내가 좋아하는 뭔가를 호출이

public static WordprocessingDocument InsertText(this WordprocessingDocument doc, string contentControlTag, string text) 
    { 
     SdtElement element = doc.MainDocumentPart.Document.Body.Descendants<SdtElement>().FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>().Val == contentControlTag); 

     if (element == null) 
      throw new ArgumentException("ContentControlTag " + contentControlTag + " doesn't exist."); 

     element.Descendants<Text>().First().Text = text; 
     element.Descendants<Text>().Skip(1).ToList().ForEach(t => t.Remove()); 

     return doc; 
    } 

와 컨트롤에 삽입합니다. 결과는

예 AttnExample CompanyExample AddressNew 뉴욕, NY 12345 또는

<w:r xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:t>Example Attn</w:t><w:br /><w:t>Example Company</w:t><w:br /><w:t>Example Address</w:t><w:br /><w:t>New York, NY 12345</w:t></w:r> 

방법은 간단한 텍스트 삽입 잘 작동 같은 모양. 그것은 나를 위해 작동하지 않는 XML을 해석하는 데 필요할 때입니다.

나는 내가 필요한 것을 얻는 것에 가까워 질 것 같은 느낌이 들지만, 내 바이올린은 나를 아무데도 보내지 않습니다. 이견있는 사람? 고맙습니다.

답변

0

나는 그것을하려고하는 방식이 실패 할 운명이라고 생각합니다. 요소의 Text 속성을 설정하는 것은 항상 보이는 텍스트로 해석 될 것입니다. 나는 약간 다른 압정을 잡아야하는 것을 끝내었다. 새로운 삽입 방법을 만들었습니다.

public static WordprocessingDocument InsertText(this WordprocessingDocument doc, string contentControlTag, Paragraph paragraph) 
    { 
     SdtElement element = doc.MainDocumentPart.Document.Body.Descendants<SdtElement>().FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>().Val == contentControlTag); 

     if (element == null) 
      throw new ArgumentException("ContentControlTag " + contentControlTag + " doesn't exist."); 

     OpenXmlElement cc = element.Descendants<Text>().First().Parent; 
     cc.RemoveAllChildren(); 
     cc.Append(paragraph); 

     return doc; 
    } 

동일한 작업을 시작하고 태그를 검색하여 콘텐츠 컨트롤을 가져옵니다. 그런 다음 부모가되고 내용 컨트롤 요소를 제거하고 단락 요소로 바꿉니다.

정확히 내가 상상 한 것만은 아니지만 내 필요에 맞게 작동하는 것 같습니다.

관련 문제