यह मेरा पहली बार DocumentFormat.OpenXml का उपयोग कर रहा है, इसलिए मेरे पास एक नोब प्रश्न/समस्या है।

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

मैं एक छोटे से वेब एप्लिकेशन के लिए Asp.Net Core 3.1 का उपयोग कर रहा हूं।

byte[] result;
//source file
var path = Path.Combine(_webHostingEnvironment.WebRootPath, "templates\\MyReport.docx");
string documentText;

byte[] byteArray = System.IO.File.ReadAllBytes(path);
using (MemoryStream stream = new MemoryStream())
{
    stream.Write(byteArray, 0, (int)byteArray.Length);
    using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
    {
        using (StreamReader reader = new StreamReader(doc.MainDocumentPart.GetStream()))
        {
            documentText = reader.ReadToEnd();
        }

    documentText = documentText.Replace("company", "My Company ltd.");
    }
    result = stream.ToArray();
}

//download new file
return File(result, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "MyReport.docx");

मुझे दो समस्याएं आ रही हैं:

  1. डाउनलोड की गई फ़ाइल बिल्कुल स्रोत वर्ड फ़ाइल के समान है। ऐसा लगता है कि documentText.Replace का फ़ाइल के डाउनलोड होने पर कोई प्रभाव नहीं पड़ा है
  2. जब मैं स्रोत वर्ड फ़ाइल के भीतर थोड़ा और "जटिल" टैग का उपयोग करना चाहता हूं, उदा। {company} यह documentText में अलग-अलग शब्दों में "विभाजित" हो जाता है...

मैं क्या गलत कर रहा हूं?

1
TheMixy 27 अक्टूबर 2020, 19:36

1 उत्तर

सबसे बढ़िया उत्तर

WordprocessingDocument के भीतर StreamReader का स्पष्ट रूप से उपयोग करना गलत था। यदि कोई अन्य समान समाधान की तलाश में है, तो यहां एक कार्यशील उदाहरण दिया गया है (इस आलेख की सहायता से: OfficeTalk: इन-मेमोरी ओपन XML दस्तावेज़ों के साथ कार्य करना):

public virtual IActionResult ExportWord()
{
    byte[] result;

    // path to where your template is stored
    var path = Path.Combine(_webHostingEnvironment.WebRootPath, "files\\template.docx");

    // key-value pairs of what you want to change
    Dictionary<string, string> dict = new Dictionary<string, string>
    {
        { "key1", "value1" },
        { "key2", "value2" },
        { "key3", "value3" },
        // etc.
    };

    // read template into stream
    byte[] byteArray = System.IO.File.ReadAllBytes(path);
    using (MemoryStream mem = new MemoryStream())
    {
        mem.Write(byteArray, 0, (int)byteArray.Length);
        using (WordprocessingDocument doc = WordprocessingDocument.Open(mem, true))
        {
            // Modify the document as necessary.
            var body = doc.MainDocumentPart.Document.Body;
            var paras = body.Elements<Paragraph>();

            foreach (var para in paras)
            {
                foreach (var run in para.Elements<Run>())
                {
                    foreach (var text in run.Elements<Text>())
                    {
                        foreach (var item in dict)
                        {
                            if (text.Text.Contains(item.Key))
                            {
                                text.Text = text.Text.Replace(item.Key, item.Value);
                            }
                        }
                    }
                }
            }
        }

        // At this point, the memory stream contains the modified document.
        result = mem.ToArray();
    }

    return File(result, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "modified.docx");
}

0
TheMixy 1 नवम्बर 2020, 10:33