2012-01-11 17 views
30

मैं वर्ड दस्तावेज़ खोलने का प्रयास कर रहा हूं, कुछ टेक्स्ट बदल सकता हूं और फिर नए दस्तावेज़ में परिवर्तनों को सहेज सकता हूं। मैं नीचे दिए गए कोड का उपयोग करके पहली बार किया जा सकता हूं लेकिन मैं यह नहीं समझ सकता कि नए दस्तावेज़ में परिवर्तनों को कैसे सहेजना है (पथ और फ़ाइल नाम निर्दिष्ट करना)।संशोधित WordprocessingDocument को नई फ़ाइल में सहेजें

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using DocumentFormat.OpenXml.Packaging; 
using System.IO; 

namespace WordTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string template = @"c:\data\hello.docx"; 
     string documentText; 

     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(template, true)) 
     { 
      using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
      { 
       documentText = reader.ReadToEnd(); 
      } 


      documentText = documentText.Replace("##Name##", "Paul"); 
      documentText = documentText.Replace("##Make##", "Samsung"); 

      using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
      { 
       writer.Write(documentText); 
      } 
     } 
     } 
    } 
} 

मैं इस पर एक पूर्ण शुरुआत कर रहा हूं, इसलिए मूल प्रश्न को क्षमा करें!

उत्तर

28

आप एक MemoryStream का उपयोग करते हैं आप की तरह एक नई फ़ाइल में परिवर्तन को बचा सकता है यह कई प्रस्तुतियों और नमूना परियोजनाओं दस्तावेजों में हेरफेर करने के है यह:

byte[] byteArray = File.ReadAllBytes("c:\\data\\hello.docx"); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    stream.Write(byteArray, 0, (int)byteArray.Length); 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true)) 
    { 
     // Do work here 
    } 
    // Save the file with the new name 
    File.WriteAllBytes("C:\\data\\newFileName.docx", stream.ToArray()); 
} 
-1

मेरे लिए this ठीक काम किया:

// To search and replace content in a document part. 
public static void SearchAndReplace(string document) 
{ 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true)) 
    { 
     string docText = null; 
     using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
     { 
      docText = sr.ReadToEnd(); 
     } 

     Regex regexText = new Regex("Hello world!"); 
     docText = regexText.Replace(docText, "Hi Everyone!"); 

     using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
     { 
      sw.Write(docText); 
     } 
    } 
} 
+0

जो इसे उसी दस्तावेज़ में सहेजता है और इसलिए सवाल का उत्तर नहीं देता है। –

3

बस स्रोत फ़ाइल को गंतव्य पर कॉपी करें और वहां से परिवर्तन करें।

File.copy(source,destination); 
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(destination, true)) 
    { 
     \\Make changes to the document and save it. 
     WordDoc.MainDocumentPart.Document.Save(); 
     WordDoc.Close(); 
    } 

आशा है कि यह काम करता है।

+2

1. ऐसा लगता है कि आप 'wordDoc.Save() 'लिखना चाहते थे। 2. कोई 'सहेजें() 'विधि नहीं है। तो यह मेरे लिए एक वैध समाधान की तरह प्रतीत नहीं होता है। क्या मुझे कुछ याद आ रही है ?? –

+0

ध्यान दें कि यह कोड 'MainDocumentPart.Document.Save()' पूरे पैकेज/शब्द दस्तावेज़ को सहेज नहीं पाएगा। ऐसे अन्य भाग भी हैं जिन्हें सहेजने की आवश्यकता है (मेरा मुद्दा यह था कि फुटनोट्स सहेज नहीं रहे थे, जो 'MainDocumentPart' के अंतर्गत नहीं हैं)। मैं सहेजने के लिए आवश्यक बिट्स को काम करने की कोशिश करने के बजाय स्वीकार किए गए उत्तर का उपयोग कर समाप्त हुआ। –

+0

उन लोगों के लिए जिन्हें आपने व्यक्तिगत रूप से सहेजा है। –

4

ओपन एक्सएमएल एसडीके 2.5 में:

File.Copy(originalFilePath, modifiedFilePath); 

    using (var wordprocessingDocument = WordprocessingDocument.Open(modifiedFilePath, isEditable: true)) 
    { 
     // Do changes here... 
    } 

wordprocessingDocument.AutoSave डिफ़ॉल्ट तो बंद और निपटान परिवर्तन सहेज लेंगे द्वारा सच है। wordprocessingDocument.Close स्पष्ट रूप से आवश्यक नहीं है क्योंकि उपयोग करने वाला ब्लॉक इसे कॉल करेगा।

इस दृष्टिकोण को पूरी फ़ाइल सामग्री को स्वीकृत उत्तर की तरह स्मृति में लोड करने की आवश्यकता नहीं है। यह छोटी फ़ाइलों के लिए कोई समस्या नहीं है, लेकिन मेरे मामले में मुझे एक ही समय में एम्बेडेड xlsx और पीडीएफ सामग्री के साथ अधिक docx फ़ाइलों को संसाधित करना है ताकि स्मृति उपयोग काफी अधिक हो।

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