2011-03-11 3 views
3

환경 : asp.net C#을 OPENXML이YASR - 또 다른 검색 및 교체 질문

좋아, 그래서 나는 조각의 톤을 읽고 바퀴를 다시 시도하고, 그러나 나는 somone에 도움을 줄 수 바라고 있었어요 나는 더 빨리 나의 선택에 들어간다. 함께 병합해야하는 여러 문서가 있습니다 ... 확인 ... openxml SDK를 사용하여 수행 할 수 있습니다. 새들이 노래하고, 태양은 지금까지 빛난다. 이제 원하는대로 문서를 만들었으므로 텍스트 및/또는 콘텐츠 컨트롤을 검색하고 바꿔야합니다.

내 자신의 텍스트를 사용해 보았습니다. {이걸 대신합니다.}하지만 xml을 보았을 때 (docx의 이름을 바꿔서 파일을 보았을 때) {는 텍스트 근처에 없었습니다. 그래서 나는 그들이 dverge하지 않기 위해 doucment 내에서 그것을 보호하는 방법을 알아야하거나 검색하고 교체 할 다른 방법을 찾아야합니다.

xml 파일이면 검색/바꾸기가 가능하지만 쉽게 다시 결합 할 수는 없습니다.

아래 코드 ... 내가 언급 한 것처럼 ... 문서 병합이 잘 작동합니다. 그냥 물건을 교체해야합니다.

* 업데이트 *은 정규식 대신 태그를 사용하도록 교체 코드를 변경했습니다. 나는 지금 올바른 정보를 가지고 있지만, .Replace 전화는 일하고 싶지 않습니다. 마지막 네 줄은 내가 올바른 태그 내용을보고 있다는 확인을위한 것입니다. 나는 그 내용을 지금 바꾸고 싶다. 나는이 권리를 읽고 있어요 경우

protected void exeProcessTheDoc(object sender, EventArgs e) 
    { 
     string doc1 = Server.MapPath("~/Templates/doc1.docx"); 
     string doc2 = Server.MapPath("~/Templates/doc2.docx"); 
     string final_doc = Server.MapPath("~/Templates/extFinal.docx"); 

     File.Delete(final_doc); 
     File.Copy(doc1, final_doc); 

     using (WordprocessingDocument myDoc = WordprocessingDocument.Open(final_doc, true)) 
     { 
      string altChunkId = "AltChunkId2"; 

      MainDocumentPart mainPart = myDoc.MainDocumentPart; 
      AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(
      AlternativeFormatImportPartType.WordprocessingML, altChunkId); 
      using (FileStream fileStream = File.Open(doc2, FileMode.Open)) 
      chunk.FeedData(fileStream); 
      AltChunk altChunk = new AltChunk(); 
      altChunk.Id = altChunkId; 
      mainPart.Document.Body.InsertAfter(altChunk, mainPart.Document.Body.Elements<Paragraph>().Last()); 
      mainPart.Document.Save(); 
     } 
     exeSearchReplace(final_doc); 
    } 

    public static void GetPropertyFromDocument(string document, string outdoc) 
    { 
     XmlDocument xmlProperties = new XmlDocument(); 

     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false)) 
     { 
      ExtendedFilePropertiesPart appPart = wordDoc.ExtendedFilePropertiesPart; 

      xmlProperties.Load(appPart.GetStream()); 
     } 
     XmlNodeList chars = xmlProperties.GetElementsByTagName("Company"); 
     chars.Item(0).InnerText.Replace("{ClientName}", "Penn Inc."); 

     StreamWriter sw; 
     sw = File.CreateText(outdoc); 
     sw.WriteLine(chars.Item(0).InnerText); 
     sw.Close(); 
    }  
} 

}

답변

1

, 당신은 .DOCX에서 "{} 나 교체"하고 XML을 반복, 당신은 <t>{replace</t><t> me</><t>}</t> 같은 것들을 찾고 있습니다 다음 때처럼 뭔가를 또는 그러한 혼란. 그런 XML을 사용하면 "{나를 대신하십시오"}를 대체 할 루틴을 만드는 것은 불가능합니다.

그렇다면 교정 오류로 간주 될 가능성이 매우 높습니다. 즉 Word가 관련 될 때 철자가 잘못되었습니다. 그 원인은 Word에서 문서를 열고 교정 기능을 켜 놓았 기 때문입니다. 따라서 텍스트는 "isDirty"로 표시되고 다른 실행으로 분리됩니다.

이 고정에 대한 두 가지가있다 :

  1. 클라이언트 측. Word에서 모든 교정 오류를 수정하거나 무시하십시오.
  2. 서식 측면. Visual Studio 2010 용 Open XML Package Editor Power Tool에 포함되어있는 MarkupSimplifier 도구를 사용하여 클라이언트 외부에서이를 해결할 수 있습니다. 에릭 화이트 좋은 (당신을 위해 적시 - 몇 일 이전)가 그것을 여기에 쓰기 : Getting Started with Open XML PowerTools Markup Simplifier
+0

바른 길에. Prooferr는 그것의 일부 defintely했다. 마크 업 Simplifier는 도움이되지 않았지만 분리 문제를 찾고 해결할 수있었습니다. 나는 여전히 필드를 찾아서 대체 할 수없는 것처럼 보입니다. 내 수색 및 코드 교체 아이디어가 있습니까? – petronius31

+0

말하기 어렵습니다. 나는 이것에 대해 StreamReader를 사용하려고하는지 확신하지 못한다. 왜 XML로 이것을 끌어오고 RegEx 텍스트를 검색하기 위해'.Value'를 모두 얻은 다음, 결국에는 할 일을하고'. 저장 '하십시오. 다음은 PowerPoint 및 VB.NET 예제입니다. http://stackoverflow.com/questions/3903142/is-it-possible-to-update-a-powerpoint-slide-with-new-data-in-c/4504970# 4504970 XML을 Linq 사용. –

+0

@ petronius31 : 방금 업데이트를 보았습니다. 세 가지 : ** 1) **'using' 문은'XmlNodeList chars = xmlProperties.GetElementsByTagName ("Company");를 포함해야합니다.chars.Item (0) .InnerText.Replace ("{ClientName}", "Penn Inc.");, ** 2) ** Linq을 대신 사용할 수 있습니다.) **. 저장하는 스트림을 읽는 대신'xmlProperties.Save'를 원할 것입니다. –

1

당신이 검색하고 WordprocessingML의 문서에서 텍스트를 교체하려는 경우가 상당히 쉬운 알고리즘이를 그 당신은 사용할 수 있습니다 :

  • 모든 브레이크는 단일 문자로 실행됩니다. 여기에는 줄 바꿈, 캐리지 리턴 또는 하드 탭과 같은 특수 문자가있는 실행이 포함됩니다.
  • 그러면 검색 문자열의 문자와 일치하는 실행 집합을 찾는 것이 매우 쉽습니다.
  • 일치하는 실행 집합을 식별하면 해당 실행 집합을 새로 생성 된 실행 (검색 문자열과 일치하는 첫 번째 문자가 포함 된 실행 속성이 실행 됨)으로 바꿀 수 있습니다.
  • 새로 생성 된 실행으로 단일 문자 실행을 바꾸면 동일한 서식으로 인접 실행을 통합 할 수 있습니다.

블로그 게시물을 작성하고이 알고리즘을 수행하는 스크린 캐스트를 기록했습니다.

블로그 게시물 : http://openxmldeveloper.org/archive/2011/05/12/148357.aspx
스크린 캐스트 : http://www.youtube.com/watch?v=w128hJUu3GM

-Eric