2013-08-06 9 views
16

मैं ओपनएक्सएमएल दस्तावेज़ बनाने के लिए माइक्रोसॉफ्ट की ओपनएक्सएमएल 2.5 लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। जब तक मैं अपने दस्तावेज़ में एक HTML स्ट्रिंग डालने का प्रयास नहीं करता तब तक सबकुछ बढ़िया काम करता है। मैं वेब में घूमते और यहाँ क्या मैं अब तक (बस भाग मैं साथ परेशानी हो रही हूँ करने के लिए कतरना) के साथ आए हैं है हैओपनएक्सएमएल (* .docx) दस्तावेज़ एचटीएमएल स्ट्रिंग जोड़ें

Paragraph paragraph = new Paragraph(); 
Run run = new Run(); 

string altChunkId = "id1"; 
AlternativeFormatImportPart chunk = 
     document.MainDocumentPart.AddAlternativeFormatImportPart(
      AlternativeFormatImportPartType.Html, altChunkId); 
chunk.FeedData(new MemoryStream(Encoding.UTF8.GetBytes(ioi.Text))); 
AltChunk altChunk = new AltChunk { Id = altChunkId }; 

run.AppendChild(new Break()); 

paragraph.AppendChild(run); 
body.AppendChild(paragraph); 

जाहिर है, मैं वास्तव में altChunk इस उदाहरण में शामिल किया है, लेकिन मैंने इसे हर जगह जोड़ने की कोशिश की है - रन, पैराग्राफ, बॉडी इत्यादि। कभी भी, मैं वर्ड 2010 में डॉक्स फ़ाइल खोलने में असमर्थ हूं।

यह मुझे थोड़ा नट बना रहा है क्योंकि ऐसा लगता है यह सीधा होना चाहिए (मैं स्वीकार करूंगा कि मैं AltChunk "चीज़" पूरी तरह से समझ नहीं रहा हूं)। किसी भी मदद की सराहना करेंगे।

साइड नोट: एक चीज़ जो मैंने पाया वह दिलचस्प था, और मुझे नहीं पता कि यह वास्तव में एक समस्या है या नहीं, this response है जो कहता है कि AltChunk मेमोरीस्ट्रीम से काम करते समय फ़ाइल को दूषित करता है। क्या कोई पुष्टि कर सकता है कि यह सच है/है?

+0

क्या आप Word 2010 में जेनरेट की गई डॉक्क्स फ़ाइल खोलने का प्रयास करते समय त्रुटि संदेश प्राप्त करते हैं? – Hans

+0

मैं करता हूं। मुझे एक "फ़ाइल [फ़ाइल नाम] खोला नहीं जा सकता क्योंकि सामग्री के साथ समस्याएं हैं।" मैं इंस्पेक्टर में सामग्री को देखता हूं, लेकिन वास्तव में गलत क्या है इसके संबंध में मुझे कुछ भी स्पष्ट नहीं दिख रहा है। – JasCav

उत्तर

16

मैं त्रुटि पुन: पेश कर सकते हैं वैकल्पिक प्रारूप आयात भाग की सामग्री के रूप में एक अधूरी HTML दस्तावेज़ का उपयोग करके "... वहाँ सामग्री के साथ एक समस्या है।" उदाहरण के लिए यदि आप निम्न HTML स्निपेट <h1>HELLO</h1> का उपयोग करते हैं तो एमएस वर्ड दस्तावेज़ खोलने में असमर्थ है।

नीचे दिया गया कोड दिखाता है कि एक शब्द दस्तावेज़ में AlternativeFormatImportPart कैसे जोड़ें। (मैंने एमएस वर्ड 2013 के साथ कोड का परीक्षण किया है)।

using (WordprocessingDocument doc = WordprocessingDocument.Open(@"test.docx", true)) 
{ 
    string altChunkId = "myId"; 
    MainDocumentPart mainDocPart = doc.MainDocumentPart; 

    var run = new Run(new Text("test")); 
    var p = new Paragraph(new ParagraphProperties(
     new Justification() { Val = JustificationValues.Center }), 
        run); 

    var body = mainDocPart.Document.Body; 
    body.Append(p);   

    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("<html><head></head><body><h1>HELLO</h1></body></html>")); 

    // Uncomment the following line to create an invalid word document. 
    // MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("<h1>HELLO</h1>")); 

    // Create alternative format import part. 
    AlternativeFormatImportPart formatImportPart = 
    mainDocPart.AddAlternativeFormatImportPart(
     AlternativeFormatImportPartType.Html, altChunkId); 
    //ms.Seek(0, SeekOrigin.Begin); 

    // Feed HTML data into format import part (chunk). 
    formatImportPart.FeedData(ms); 
    AltChunk altChunk = new AltChunk(); 
    altChunk.Id = altChunkId; 

    mainDocPart.Document.Body.Append(altChunk); 
} 

w:altChunk तत्व के लिए Office OpenXML, विनिर्देश मान्य पैरेंट तत्वों के अनुसार body, comment, docPartBody, endnote, footnote, ftr, hdr and tc हैं। तो, मैंने शरीर तत्व में w:altChunk जोड़ा है।

w:altChunk तत्व पर अधिक जानकारी के लिए यह MSDN लिंक देखें।

संपादित

के रूप में @ user2945722 से कहा, यह सुनिश्चित करें कि OPENXML पुस्तकालय correctlty UTF-8 के रूप में बाइट सरणी की व्याख्या करने के लिए, आपको UTF-8 प्रस्तावना जोड़ना चाहिए। यह इस तरह से किया जा सकता है:

MemoryStream ms = new MemoryStream(new UTF8Encoding(true).GetPreamble().Concat(Encoding.UTF8.GetBytes(htmlEncodedString)).ToArray() 

यह एक © की, अपने एक ä के रूप में के रूप में प्रदान की वजह से आपकी é के पाएगा, आदि

+0

"... एक अपूर्ण HTML दस्तावेज़ का उपयोग कर ..." - यही समस्या है। इस तरह की एक साधारण बात, अभी तक मेरे लिए बहुत स्पष्ट नहीं है। आपकी सहायता के लिए धन्यवाद. – JasCav

+3

आपको मेमोरीस्ट्रीम में पास करने से पहले बाइट सरणी में यूटीएफ 8 बीओएम जोड़ने पर विचार करना चाहिए। इससे मेरे परिदृश्य में मदद मिली जहां डॉक्स फ़ाइल कुछ यूटीएफ 8 अक्षरों को सही ढंग से नहीं दिखाएगी। इस तरह कुछ - 'बाइट [] utf8Bom = नया यूटीएफ 8 एन्कोडिंग (सत्य) .GetPreamble(); 'और उसके बाद इसे" GetBytes "परिणाम – user2945722

+0

@ user2945722 धन्यवाद! यह मेरे मुद्दे के लिए सही जवाब था। इसे उत्तर में शामिल किया जाना चाहिए। –

1

एक ही समस्या यहाँ था, लेकिन एक पूरी तरह से अलग कारण। स्वीकार्य समाधान मदद नहीं करता है, तो कोशिश करने के लायक है। सहेजने के बाद फ़ाइल बंद करने का प्रयास करें। मेरे मामले में, यह भ्रष्ट और एक स्वच्छ डॉक्क्स फ़ाइल के बीच का अंतर हुआ। विचित्र रूप से, अधिकांश अन्य ऑपरेशंस केवल एक सेव() और प्रोग्राम से बाहर निकलने के साथ काम करते हैं।

String cid = "chunkid"; 
WordprocessingDocument document = WordprocessingDocument.Open("somefile.docx", true); 
Body body = document.MainDocumentPart.Document.Body; 
MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("<html><head></head><body>hi</body></html>")); 
AlternativeFormatImportPart formatImportPart = document.MainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Html, cid); 
formatImportPart.FeedData(ms); 
AltChunk altChunk = new AltChunk(); 
altChunk.Id = cid; 
document.MainDocumentPart.Document.Body.Append(altChunk); 
document.MainDocumentPart.Document.Save(); 
// here's the magic! 
document.Close(); 
+0

मैं एक मेमोरीस्ट्रीम (WordprocessingDocument.Create का उपयोग WordprocessingDocument.Open के बजाय) और दस्तावेज़ के "जादू" का उपयोग करने की कोशिश कर रहा था। क्लोज़() ठीक है जो मुझे लौटने के लिए एक स्वच्छ मेमोरी स्ट्रीम प्राप्त करने के लिए आवश्यक था * IF * मैंने कोशिश की उपयोग कथन के भीतर से लौटें (या एक उपयोग कथन का उपयोग नहीं किया)। उपयोग कथन के बाहर लौटने के लिए इस जादू की आवश्यकता नहीं थी। मुझे संदेह है कि उपयोग कथन प्रभावी रूप से दस्तावेज़ के समान कार्य करता है। ऑब्जेक्ट का निपटान करते समय बंद करें। –

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