2011-11-09 27 views
6

Tôi đang thực sự sử dụng thư viện "DocX" để tạo tài liệu Word (2007+) từ .Net. Điều tốt là nó có thể sử dụng mẫu "docx" để tạo lại hoặc cập nhật tài liệu.Thêm CustomProperty hiện tại không cập nhật tài liệu

Sự cố: Khi tôi "AddCustomProperty (...)" nó không cập nhật tài liệu từ. Tôi thực sự cần phải mở nó và sau đó chọn tất cả và đẩy F9. Tôi đã tự hỏi nếu có một cách để tự động cập nhật các "thuộc tính tùy chỉnh" bằng cách sử dụng thư viện DocX.

Để tái tạo vấn đề của tôi bạn có thể làm theo các bước sau:

  1. Mở "mẫu" có sẵn trên dự án Docx.
  2. Run nó một lần (nó sẽ tạo ra file trong debug \ docs)
  3. mở hóa đơn mẫu và sau đó thêm một dòng (có hoặc không có văn bản) và lưu các tập tin
  4. Re-chạy cùng một dự án mẫu (nó sẽ sử dụng mẫu hiện có)
  5. Mở kết quả hóa đơn. Khi bạn làm như vậy, bạn có thể thấy rằng bàn đã được tạo ra, NHƯNG, tất cả các lĩnh vực khác chưa được cập nhật cho đến khi bạn chọn tất cả và sau đó đẩy CTRL + F9

Nếu ai có một giải pháp, tôi vui vẻ muốn nghe về nó.

(Lưu ý: Tôi không muốn interop MS Word)

dự án và các mẫu có sẵn tại địa chỉ: http://docx.codeplex.com/

Trả lời

3

Vấn đề là khi chúng tôi sử dụng MS Word (Tôi sử dụng phiên bản 2010) và sau đó chúng tôi sửa đổi mẫu và lưu nó. Nó thay đổi những gì tài liệu chứa.

Dưới đây là những gì chúng ta có khi chúng tôi lần đầu tiên tạo ra các mẫu sử dụng 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> 

Và khi chúng tôi sửa với Word (thêm một ngắt dòng hoặc một số văn bản) và chúng tôi lưu nó, nó viết lại fldSimple một cái gì đó như thế:

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

Thay vì chờ đợi ai đó khắc phục vấn đề, tôi chỉ cố gắng thực hiện dự thảo triển khai đầu tiên. Tôi thực sự đã sửa đổi phương thức UpdateCustomPropertyValue (...). Tôi thực sự đã thêm mã của số đầu tiên cho số. Số thứ hai foreach đã có và áp dụng cho tài liệu được tạo từ 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)); 
       } 
      } 
} 
Các vấn đề liên quan