使用模板生成Word文档

时间:2015-12-30 19:05:33

标签: .net vb.net openxml

我有一个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

2 个答案:

答案 0 :(得分:1)

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

然而,您将会遇到的一个问题是,您将无法像示例代码那样可靠地阅读内容并使用RegEx。原因在于,在底层的Word Open XML文本中,运行可以(通常是)通过直接格式化命令,拼写错误,语言格式以及无数其他内容来分解。

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

答案 1 :(得分:0)

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