代码之家  ›  专栏  ›  技术社区  ›  Nicolas S.

C:编辑/保存/发送docx文档

  •  0
  • Nicolas S.  · 技术社区  · 6 年前

    被很多问题缠住了。在ASP.NET核心服务器上使用OpenXML,我希望基于模板创建一个新的docx文档。一旦这个文档被完全保存,我希望它被发送到我的客户机,这样他可以直接下载它。这是我的代码:

    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查询)。 你们中有人知道怎么修吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Michael Daniloff    6 年前

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

    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());
        }