2011-11-09 27 views
6

Aslında .Net'den Word belgesi (2007+) oluşturmak için "DocX" kütüphanesini kullanıyorum. İyi olan, bir belgeyi yeniden oluşturmak veya güncellemek için "docx" şablonunu kullanabilmesidir.Varolan bir CustomProperty belgesini güncelleştirmiyor

Sorun: Ben "AddCustomProperty (...)" o word dosyası güncellemiyor. Aslında onu açmalı ve sonra hepsini seçmeli ve F9'a basmalıyım. DocX kütüphanesini kullanarak "özel özellikleri" otomatik olarak güncellemenin bir yolu olup olmadığını merak ediyordum.

  1. Aç DOCX proje üzerinde mevcut "örnek":

    aşağıdaki adımları yapabilirsiniz benim sorunu yeniden belirleyin.
  2. Run dosyayı bir kez
  3. Açık fatura şablonu (debug \ docs dosyaları yaratacak) ve daha sonra (veya metin olmadan) bir satır ekleyin ve kaydedin
  4. (aynı örnek proje yeniden çalıştırın Mevcut şablonu kullanacaktır)
  5. Fatura sonucunu açın. Bunu yaparken herkes bir çözüm varsa, ben, CTRL + F9

, masa oluşturulmuş olduğunu tüm seçene kadar tüm diğer alanlarda güncellenmemiş ANCAK öğrenin ve daha sonra itebilir bu konuda kulak vermekten memnuniyet duyarım.

(Not: Ben MS Word birlikte çalışma istemiyorum)

Proje ve numuneler mevcuttur: Biz (Ben 2010 sürümünü kullanın) MS Word kullandığınızda sorunudur http://docx.codeplex.com/

cevap

3

ve sonra şablonu değiştirip kaydediyoruz. Belgenin içerdiği değişiklikleri değiştirir. İşte

biz ilk DOCX kullanarak şablon oluşturmak zaman elimizdeki budur: biz Word ile düzenleme (bir satır ara ya da bazı metin eklemek) ne zaman

<w:fldSimple w:instr="DOCPROPERTY company_name \* MERGEFORMAT" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    <w:r> 
    <w:t> 
     <w:rPr> 
     <w:b /> 
     <w:sz w:val="24" /> 
     <w:szCs w:val="24" /> 
     <w:color w:val="1F497D" /> 
     </w:rPr>Company Name</w:t> 
    </w:r> 
</w:fldSimple> 

Ve biz kaydetmek, bir şeyle fldSimple yeniden Bunun gibi:

<w:p w:rsidR="006D64DE" w:rsidRDefault="006B25B1"> 
     <w:r> 
      <w:fldChar w:fldCharType="begin" /> 
     </w:r> 
     <w:r> 
      <w:instrText>DOCPROPERTY company_name \* MERGEFORMAT</w:instrText> 
     </w:r> 
     <w:r> 
      <w:fldChar w:fldCharType="separate" /> 
     </w:r> 
     <w:r> 
     <w:rPr> 
      <w:b /> 
      <w:color w:val="1F497D" /> 
      <w:sz w:val="24" /> 
     <w:szCs w:val="24" /> 
    </w:rPr> 
    <w:t>Company Name</w:t> 
    </w:r> 
    ... 
    <w:r> 
    <w:rPr> 
     <w:b /> 
     <w:color w:val="1F497D" /> 
     <w:sz w:val="24" /> 
     <w:szCs w:val="24" /> 
    </w:rPr> 
    <w:fldChar w:fldCharType="end" /> 
    </w:r> 
</w:p> 

Sorunu düzeltmek için birini beklemek yerine, yalnızca uygulamanın ilk taslağını yapmaya çalıştım. Aslında UpdateCustomPropertyValue (...) yöntemini değiştirdim. Aslında ilk foreach kodunu ekledim. İkinci foreach zaten oradaydı ve DocX'dan oluşturulan belgeye uygulanır.

internal static void UpdateCustomPropertyValue(DocX document, string customPropertyName, string customPropertyValue) 
     { 
      foreach (XElement e in document.mainDoc.Descendants(XName.Get("instrText", w.NamespaceName))) 
      { 
       string attr_value = e.Value.Replace(" ", string.Empty).Trim(); 
       string match_value = string.Format(@"DOCPROPERTY {0} \* MERGEFORMAT", customPropertyName).Replace(" ", string.Empty); 

       if (attr_value.Equals(match_value, StringComparison.CurrentCultureIgnoreCase)) 
       { 
        XNode node = e.Parent.NextNode; 
        bool found = false; 
        while (true) 
        { 
         if (node.NodeType == XmlNodeType.Element) 
         { 
          var ele = node as XElement; 
          var match = ele.Descendants(XName.Get("t", w.NamespaceName)); 
          if (match.Count() > 0) 
          { 
           if (!found) 
           { 
            match.First().Value = customPropertyValue; 
            found = true; 
           } 
           else 
           { 
            ele.RemoveNodes(); 
           } 
          } 
          else 
          { 
           match = ele.Descendants(XName.Get("fldChar", w.NamespaceName)); 
           if (match.Count() > 0) 
           { 
            var endMatch = match.First().Attribute(XName.Get("fldCharType", w.NamespaceName)); 
            if (endMatch != null && endMatch.Value == "end") 
            { 
             break; 
            } 
           } 
          } 
         } 
         node = node.NextNode; 
        } 
       } 
      } 

      foreach (XElement e in document.mainDoc.Descendants(XName.Get("fldSimple", w.NamespaceName))) 
      { 
       string attr_value = e.Attribute(XName.Get("instr", w.NamespaceName)).Value.Replace(" ", string.Empty).Trim(); 
       string match_value = string.Format(@"DOCPROPERTY {0} \* MERGEFORMAT", customPropertyName).Replace(" ", string.Empty); 

       if (attr_value.Equals(match_value, StringComparison.CurrentCultureIgnoreCase)) 
       { 
        XElement firstRun = e.Element(w + "r"); 
        XElement firstText = firstRun.Element(w + "t"); 
        XElement rPr = firstText.Element(w + "rPr"); 

        // Delete everything and insert updated text value 
        e.RemoveNodes(); 

        XElement t = new XElement(w + "t", rPr, customPropertyValue); 
        Novacode.Text.PreserveSpace(t); 
        e.Add(new XElement(firstRun.Name, firstRun.Attributes(), firstRun.Element(XName.Get("rPr", w.NamespaceName)), t)); 
       } 
      } 
} 
İlgili konular