C#:编辑/保存/发送 docx 文档 [英] C# : Editing/saving/Sending a docx document

查看:23
本文介绍了C#:编辑/保存/发送 docx 文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一直在努力解决很多问题.在 ASP.NET Core 服务器上使用 OpenXML,我想基于模板创建一个新的 docx 文档.完全保存此文档后,我希望将其发送给我的客户,以便他可以直接下载.这是我的代码:

Been strugling with a lot of problems. Using OpenXML on a ASP.NET Core server, I want to create a new docx document based on a template one. Once this document is fully saved, I want it to be sent to my client so he can download it directly. Here's my code :

public IActionResult Post([FromBody] Consultant consultant)
    {
            using (Stream templateStream = new MemoryStream(Properties.Resources.templateDossierTech))
            using (WordprocessingDocument template =
                WordprocessingDocument.Open(templateStream, false))
            {

                string fileName = environment.WebRootPath + @"Resources"+ consultant.FirstName + "_" + consultant.LastName + ".docx";
                WordprocessingDocument dossierTechniqueDocument =
                    WordprocessingDocument.Create(fileName,
                        WordprocessingDocumentType.Document);
                foreach (var part in template.Parts)
                {
                    dossierTechniqueDocument.AddPart(part.OpenXmlPart, part.RelationshipId);
                }

                var body = dossierTechniqueDocument.MainDocumentPart.Document.Body;
                var paras = body.Elements();

                foreach (var para in paras)
                {
                    foreach (var run in para.Elements())
                    {
                        foreach (var text in run.Elements())
                        {
                            if (text.InnerText.Contains("{{prenom}}"))
                            {
                                var t = new Text(text.InnerText.Replace("{{prenom}}", consultant.FirstName));
                                run.RemoveAllChildren<Text>();
                                run.AppendChild(t);
                            }

                        }
                    }
                }
                dossierTechniqueDocument.MainDocumentPart.Document.Save();
                dossierTechniqueDocument.Close();
                var cd = new System.Net.Mime.ContentDisposition
                {
                    FileName = consultant.FirstName + "_" + consultant.LastName + ".docx",
                    Inline = true
                };

                Response.Headers.Add("Content-Disposition", cd.ToString());

                Response.Headers.Add("X-Content-Type-Options", "nosniff");
                return File(System.IO.File.ReadAllBytes(fileName),"application/vnd.openxmlformats-officedocument.wordprocessingml.document","Dossier Technique");
        }
    }

乍一看,它看起来保存得很好,但是当我尝试在 word 上打开它时,它说由于某种原因它已损坏.当我尝试发送它时,这也是同样的问题.一旦发送,我的客户端就不会下载它(Ajax 查询).你们中有人知道如何修复它吗?

As a first look, it looks like is saving well but when I try to open it on word, it says that it is corrupted for some reason. That's the same problem when I try to send it. Once it's sent my client doesn't download it (Ajax query). Do anyone of you have any idea how to fix it ?

推荐答案

这是从模板创建文档的函数:

Here is the function which creates a document from a template:

static void GenerateDocumentFromTemplate(string inputPath, string outputPath)
    {
        MemoryStream documentStream;
        using (Stream stream = File.OpenRead(inputPath))
        {
            documentStream = new MemoryStream((int)stream.Length);
            CopyStream(stream, documentStream);
            documentStream.Position = 0L;
        }

        using (WordprocessingDocument template = WordprocessingDocument.Open(documentStream, true))
        {
            template.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
            MainDocumentPart mainPart = template.MainDocumentPart;
            mainPart.DocumentSettingsPart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate",
               new Uri(inputPath, UriKind.Absolute));

            mainPart.Document.Save();
        }


        File.WriteAllBytes(outputPath, documentStream.ToArray());
    }

这篇关于C#:编辑/保存/发送 docx 文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆