2009-07-17 9 views
6

मैं वर्ड और OPENXML उपयोग कर रहा हूँ एक सी # ASP.NET वेब अनुप्रयोग में मेल मर्ज सुविधा प्रदान करने के:नकल वर्ड दस्तावेज़ OPENXML और का उपयोग कर सी #

1) एक दस्तावेज़ प्रतिस्थापन के लिए पूर्व निर्धारित तार की संख्या के साथ अपलोड की गई है ।

2) ओपनएक्सएमएल एसडीके 2.0 का उपयोग करके मैं वर्ड डॉक्यूमेंट खोलता हूं, मुख्य डॉक्यूमेंटपार्ट को स्ट्रिंग के रूप में प्राप्त करता हूं और रेगेक्स का उपयोग करके प्रतिस्थापन करता हूं।

3) फिर मैं OpenXML का उपयोग करके एक नया दस्तावेज़ बनाता हूं, एक नया मुख्य दस्तावेज़ दस्तावेज़ जोड़ें और प्रतिस्थापन से परिणामस्वरूप इस मुख्य दस्तावेज़ दस्तावेज़ में स्ट्रिंग डालें।

हालांकि, नए प्रारूप में सभी स्वरूपण/शैलियों आदि खो गए हैं।

मुझे लगता है कि मैं मूल दस्तावेज की नकल करने के लिए अलग-अलग शैली, परिभाषाएं, टिप्पणी भागों आदि को कॉपी और जोड़ सकता हूं।

हालांकि क्या एक नई दस्तावेज़ पर प्रतिस्थापन करने की अनुमति देने वाले दस्तावेज़ को डुप्लिकेट करने के लिए ओपन एक्सएमएल का उपयोग करने का कोई तरीका है?

धन्यवाद।

उत्तर

-1

जब आप ज़िप को खोलकर खोलने और इसे खोलकर ओपनएक्सएमएल दस्तावेज़ देखते हैं तो आप देखते हैं कि उस शब्द उपफोल्डर में एक _rels फ़ोल्डर है जहां सभी संबंध सूचीबद्ध हैं। ये संबंध आपके द्वारा वर्णित भागों (शैली ...) को इंगित करते हैं। दरअसल आपको इन भागों की आवश्यकता होती है क्योंकि उनमें स्वरूपण की परिभाषा होती है। इसलिए उन्हें कॉपी करने से नया दस्तावेज़ सामान्य.dot फ़ाइल में परिभाषित प्रारूपण का उपयोग नहीं करेगा और मूल दस्तावेज़ में परिभाषित नहीं किया जाएगा। तो मुझे लगता है कि आपको उन्हें कॉपी करना होगा।

+0

वास्तव में प्रश्न का उत्तर नहीं दे रहा है। जवाब देने से पहले इसे कैसे करें पर पढ़ें। –

2

मैंने कुछ बहुत ही समान चीजें की हैं, लेकिन पाठ प्रतिस्थापन तारों का उपयोग करने के बजाय, मैं वर्ड कंटेंट कंट्रोल का उपयोग करता हूं। मैंने निम्नलिखित ब्लॉग पोस्ट, SharePoint and Open Xml में कुछ विवरण दस्तावेज किए हैं। तकनीक SharePoint के लिए विशिष्ट नहीं है। आप शुद्ध एएसपी.नेट या अन्य अनुप्रयोगों में पैटर्न का पुन: उपयोग कर सकते हैं।

इसके अलावा, मैं आपको ओपन एक्सएमएल के संबंध में युक्तियों, चाल और तकनीकों के लिए Eric White's Blog की समीक्षा करने के लिए दृढ़ता से प्रोत्साहित करता हूं। विशेष रूप से, in-memory manipulation of Open Xml post, और Word content controls पोस्ट देखें। मुझे लगता है कि आप लंबे समय तक इन्हें और अधिक सहायक पाएंगे।

उम्मीद है कि इससे मदद मिलती है।

4

मैं सामग्री नियंत्रण अनुशंसाओं का उपयोग दूसरा सेकेंड करता हूं। अपने दस्तावेज़ के उन क्षेत्रों को चिह्नित करने के लिए उनका उपयोग करना जहां आप प्रतिस्थापन करना चाहते हैं, इसे करने का सबसे आसान तरीका है।

दस्तावेज़ डुप्लिकेट (और बनाए रखने के पूरे दस्तावेज सामग्री, शैली और सभी) यह अपेक्षाकृत आसान है के लिए के रूप में:

string documentURL = "full URL to your document"; 
byte[] docAsArray = File.ReadAllBytes(documentURL); 

using (MemoryStream stream = new MemoryStream) 
{ 
    stream.Write(docAsArray, 0, docAsArray.Length); // THIS performs doc copy 
    using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true)) 
    { 
     // perform content control substitution here, making sure to call .Save() 
     // on any documents Part's changed. 
    } 
    File.WriteAllBytes("full URL of your new doc to save, including .docx", stream.ToArray()); 
} 

वास्तव में सामग्री नियंत्रण पाने के LINQ का उपयोग कर केक का एक टुकड़ा है।

cc.SdtContentRun.Append(new Run(new Text("my replacement string"))); 

आशा:

using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true)) 
{      
    var mainDocument = doc.MainDocumentPart.Document; 
    var contentControls = from sdt in mainDocument.Descendants<SdtRun>() select sdt; 

    foreach (var cc in contentControls) 
    { 
     // drill down through the containment hierarchy to get to 
     // the contained <Text> object 
     cc.SdtContentRun.GetFirstChild<Run>().GetFirstChild<Text>().Text = "my replacement string"; 
    } 
} 

<Run> और <Text> तत्वों पहले से ही मौजूद नहीं हो सकता है, लेकिन उन्हें बनाने के लिए एक सरल प्रकार है: निम्न उदाहरण सब सरल पाठ सामग्री नियंत्रण (जो SdtRun के रूप में लिखे जाते हैं) पाता है जो किसी की मदद करता है।: डी

2

उपरोक्त में एक व्यय के रूप में; जो अधिक उपयोगी हो रहा है वह सामग्री नियंत्रण ढूंढ रहा है जिसे टैग किया गया है (शब्द जीयूआई का उपयोग करके)। मैंने हाल ही में कुछ सॉफ़्टवेयर लिखे हैं जो दस्तावेज़ टेम्पलेट्स को पॉप्युलेट करते हैं जिनमें टैग किए गए टैग के साथ सामग्री नियंत्रण शामिल है। उन्हें ढूंढने के लिए उपर्युक्त LINQ क्वेरी का विस्तार है:

var mainDocument = doc.MainDocumentPart.Document; 
var taggedContentControls = from sdt in mainDocument.Descendants<SdtElement>() 
          let sdtPr = sdt.GetFirstChild<SdtProperties>() 
          let tag = (sdtPr == null ? null : sdtPr.GetFirstChild<Tag>()) 
          where (tag != null) 
          select new 
          { 
           SdtElem = sdt, 
           TagName = tag.GetAttribute("val", W).Value 
          }; 

मुझे यह कोड कहीं और से मिला है लेकिन इस समय कहां याद नहीं है; पूरा क्रेडिट उनके पास जाता है।

क्वेरी सिर्फ एक अज्ञात प्रकार का एक आईनेमरेबल बनाता है जिसमें सामग्री नियंत्रण और उसके संबंधित टैग गुण होते हैं। हैंडी!

10

कोड का यह टुकड़ा किसी मौजूदा दस्तावेज़ से सभी भागों को एक नए में कॉपी करना चाहिए।

using (var mainDoc = WordprocessingDocument.Open(@"c:\sourcedoc.docx", false)) 
using (var resultDoc = WordprocessingDocument.Create(@"c:\newdoc.docx", 
    WordprocessingDocumentType.Document)) 
{ 
    // copy parts from source document to new document 
    foreach (var part in mainDoc.Parts) 
    resultDoc.AddPart(part.OpenXmlPart, part.RelationshipId); 
    // perform replacements in resultDoc.MainDocumentPart 
    // ... 
} 
+1

मैं उस मेमोरीस्ट्रीम व्यवसाय के साथ घंटों के घंटों तक दीवार के खिलाफ अपने सिर को टक्कर लगी हूं ... यह बहुत अच्छा काम करता है और यह बहुत संक्षिप्त है। बहुत धन्यवाद! – lukiffer

+0

क्या एक समान काम करने का कोई तरीका है, केवल एक ही अंतर यह है कि 'मुख्य दस्तावेज़' में मौजूद सामग्री को किसी मौजूदा दस्तावेज़ के अंत में जोड़ना आवश्यक है? –

+0

हां, हालांकि अधिक कठिन है, क्योंकि दोनों दस्तावेजों के हिस्सों से बहुत सारे डेटा को विलय करने की आवश्यकता है। शुक्र है, [एरिक व्हाइट] (http://ericwhite.com/blog/) ने [PowerXools for OpenXML] का एक सेट बनाया है (http://ericwhite.com/blog/category/open-xml/powertools/) जो हैंडल यह आपके लिए अन्यथा चुनौतीपूर्ण कार्य है। विशेष रूप से, [DocumentBuilder] (http://openxmldeveloper.org/wiki/w/wiki/documentbuilder.aspx) पर एक नज़र डालें, जिसे मैंने पहले एक दस्तावेज़ को दूसरे में जोड़ने के लिए उपयोग किया था। एक जादू की तरह काम किया! – bernhof

संबंधित मुद्दे