2011-11-09 18 views
6

मैं वास्तव में लाइब्रेरी का उपयोग कर रहा हूं "DocX" .NET से Word दस्तावेज़ (2007+) उत्पन्न करने के लिए। अच्छा क्या है कि यह दस्तावेज़ को फिर से बनाने या अपडेट करने के लिए "docx" टेम्पलेट का उपयोग कर सकता है।कोई मौजूदा कस्टमप्रोपर्टी जोड़ें दस्तावेज़ को अपडेट नहीं करता

समस्या: जब मैं "AddCustomProperty (...)" यह शब्द दस्तावेज़ अपडेट नहीं होता। मुझे वास्तव में इसे खोलने की जरूरत है और फिर सभी का चयन करें और F9 दबाएं। मैं सोच रहा था कि क्या DocX लाइब्रेरी का उपयोग करके "कस्टम गुण" को स्वत: अद्यतन करने का कोई तरीका था।

  1. खोलें "नमूना" docx परियोजना पर उपलब्ध:

    मेरी समस्या आप निम्न चरणों कर सकते हैं पुन: पेश करने के लिए।

  2. भागो यह एक बार
  3. खुला चालान टेम्पलेट (यह डिबग \ डॉक्स में फ़ाइलों को पैदा करेगा) और फिर एक लाइन (के साथ या पाठ के बिना) जोड़ सकते हैं और बचाने के लिए फ़ाइल
  4. फिर से चलाने के ही नमूना परियोजना (यह मौजूदा टेम्पलेट का उपयोग करेगा)
  5. चालान परिणाम खोलें। जब आप ऐसा करते हैं, तो आप देख सकते हैं कि टेबल बनाया गया है, लेकिन, जब तक आप सभी का चयन करें सभी अन्य क्षेत्रों अपडेट नहीं किया गया और फिर धक्का CTRL + F9

किसी को भी एक समाधान है, तो मैं खुशी से इसके बारे में कान करना पसंद करेंगे।

(नोट: मैं एमएस वर्ड इंटरॉप नहीं करना चाहती)

परियोजना और नमूने पर उपलब्ध हैं: http://docx.codeplex.com/

उत्तर

3

जब हम एमएस वर्ड का उपयोग करें (मैं 2010 संस्करण का उपयोग करें) समस्या है और फिर हम टेम्पलेट को संशोधित करते हैं और इसे सहेजते हैं। यह दस्तावेज़ में क्या बदलता है बदलता है।

यहाँ हमारे पास क्या है जब हम पहले docx का उपयोग कर टेम्पलेट जेनरेट है:

<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> 

और जब हम वर्ड के साथ संपादित (एक ब्रेक लाइन या कुछ पाठ जोड़ने) और हम इसे बचाने के लिए, यह कुछ करने के लिए fldSimple पुनर्लेखन इस तरह:

<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> 

किसी को इस मुद्दे को ठीक करने के लिए प्रतीक्षा करने के बजाय, मैंने बस कार्यान्वयन का पहला मसौदा करने की कोशिश की। मैंने वास्तव में अद्यतन अद्यतन कस्टमप्रॉपर्टीवैल्यू (...) को संशोधित किया। मैंने वास्तव में पहले foreach का कोड जोड़ा। दूसरा foreach पहले से ही वहां था और यह DocX से बनाए गए दस्तावेज़ पर लागू होता है।

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)); 
       } 
      } 
} 
संबंधित मुद्दे