使用模板生成Word文档

Use template to generate Word document

我在服务器上存储了一个 Word 文档,我想将其用作模板。我需要用数据库中的数据替换某些文本。

我遇到的两个问题是: 服务器上没有办公室可以使用Microsoft.Office.Interop,而且我无法将任何文档保存到服务器。

我认为我在正确的轨道上,但无法提出可行的解决方案。我在想我最好的方法是读入内存并使用字节数组来允许用户保存文件。

我正在做这样的事情,但现在很困惑。

Dim path As String = HttpContext.Current.Request.PhysicalApplicationPath & "Letters\Test.docx"
        Dim docBA As Byte() = File.ReadAllBytes(path)

        Dim wordDoc As WordprocessingDocument = WordprocessingDocument.Open(path, True)
        Using (wordDoc)
            Dim docText As String = Nothing
            Dim sr As StreamReader = New StreamReader(wordDoc.MainDocumentPart.GetStream)

            Using (sr)
                docText = sr.ReadToEnd
            End Using

            Dim regexText As Regex = New Regex("FIRST_NAME")
            docText = regexText.Replace(docText, "TESTING!!!")

            Dim sw As StreamWriter = New StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))
            Dim modBA As Byte()
            Using (sw)
                sw.Write(docText)
                modBA = sw.Encoding.GetBytes(sw.BaseStream, 0, sw.BaseStream.Length)
                HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename= DownloadSample.docx")
                HttpContext.Current.Response.ContentType = "application/octectstream"
                HttpContext.Current.Response.BinaryWrite(modBA)
                HttpContext.Current.Response.End()
            End Using

您在正确的轨道上,使用 Open XML 文件格式,而不是尝试在服务器环境中的 Word 应用程序中编辑文档。

但是,您将遇到的一个问题是您无法像示例代码那样可靠地阅读内容并使用 RegEx。原因是,在底层的 Word Open XML 中,文本运行可能(通常)被直接格式化命令、拼写错误、语言格式化和无数其他事情打断。

由于您选择 RegEx 的目的是将数据写入 "placeholders",更好的方法是使用内容控件(std 元素)作为 "targets"。这些可以直接定位并将数据写入其中。内容控件甚至可以绑定到文档中嵌入的自定义 XML 部分中的节点,以便您可以编辑该 XML 文件,而不是 Word 文档。 MSDN 上有这方面的示例,MSDN 和其他论坛中也有讨论。

正如其他人所建议的那样,您可以使用 Open XML SDK 来解析文档并通过创建您自己的 find/replace 引擎来修改它,该引擎在 Open XML SDK 之上运行。您还应该考虑使用标签(内容控件、合并字段、书签)来标记动态部分并创建将搜索这些标签而不是文本的搜索逻辑。我会说内容控件是最佳选择,因为它们最容易解析并在设计模板文档时提供最佳用户体验。不过,如果您的预算允许,请看看这个 commercial .NET library,它已经完全满足您的需求(可能更多)。