65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET生成动态Word文档

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.77/5 (13投票s)

2006 年 5 月 1 日

7分钟阅读

viewsIcon

184479

使用ASP.NET进行Word模板编程

引言

这是我向科技界发表的第一篇文章。

 

本文将帮助程序员使用Word模板动态创建文档,而无需在服务器上生成任何Word对象。

 

背景

 

在某些Web应用程序中,需要动态生成文档,例如给候选人的录用通知书、面试期间使用的其他官方信函或成绩单模板等。

 

在这类文档中,除了少数更改外,大部分内容都是相似的。

我们来看几个例子。

 

1.成绩单:姓名、分数、学号等会因学生而异,但考试名称、专业、大学名称等其他详细信息将保持不变。

 

2. 录用通知书:  姓名、地址、offer日期和入职日期、职位和薪资结构等会因候选人而异。但其他详细信息将保持不变。

 

 

解决方案

 

要为这类需求生成输出,请遵循以下分步过程。

 

步骤1:创建Word模板

 

           为什么选择Word模板?

            

I.                    在Word中生成格式化输出非常容易。

II.                 可以轻松编写下标和上标,例如™。

III.               如果出现更改,可以轻松维护此类文档。

           

 

 

 

 

如何创建模板?

 

例如:

1.  录用通知书:

 

##Address##,                                                              ##DOF##

 

Dear ##Name##,

 

We are glad to appoint you for the designation ## desig ##.

 

  1. 成绩单

 

姓名:##NAME##

 

学号:##Number##

 

Subject1     ##SUB1##          

Subject2     ##SUB2##

Subject3     ##SUB3##

Subject4     ##SUB4##

Subject5     ##SUB5##

 

总分           ##Total##

百分比:##PER##

 

 

在示例1中,我们看到##Address##、##DOF##、##NAME##和##desig##。所有这些都将被用户选择的动态数据替换。而静态数据将保持不变。

 

同样在示例2中,对于成绩单

##SUB1##、##SUB2## 、##SUB3##      等将是动态的。

 

这些动态数据可以从数据库中获取。

 

按照上述指南在Word中格式化模板文件后,保存文件。为文件提供适当的名称。

 

注意:保存格式应为富文本格式(RTF)。点击“文件” – 选择“另存为”,然后选择路径并将文件保存为.rtf扩展名文件。

 

 

 

步骤2:继续下面的代码和说明

 

利用文件脚本对象将模板文件复制到某个临时文件中。

 

注意:临时文件的路径应固定,并且应具有与模板文件相同的.rtf扩展名。

 

‘ 声明一个脚本对象。

Dim td = Server.CreateObject("Scripting.FileSystemObject")

 

‘复制文件

td.CopyFile(Server.MapPath(".") & "Template.rtf", Server.MapPath(".") & "Temporary.rtf")

 

‘ 将文件路径设置到字符串变量中。

            strFilePath = Server.MapPath(".") & "Temporary.rtf"

 

 

 

‘现在以读取模式打开临时文件。

Dim fs2 As New FileStream(strFilePath, FileMode.Open, FileAccess.Read)

 

'声明d作为流读取器

            Dim d As New StreamReader(fs2)

 

Dim swrtarget As String

 

'将流读取器d初始化到文件的开头。

            d.BaseStream.Seek(0, SeekOrigin.Begin)

            swrtarget = d.ReadToEnd '一次性读取文件从头到尾。

            d.Close() ' 关闭流读取器

 

 

声明字符串变量,例如,

Str1ans strvalue1。

现在从数据库获取值。

可以使用select查询和数据读取器获取值。

 

现在将文件路径设置为临时文件

'设置打开临时文件的路径

            strFilePath = Server.MapPath(".") & "Temporary.rtf"

 

‘以读写模式打开临时文件。

Dim fs1 As New FileStream(strFilePath, FileMode.Open, FileAccess.ReadWrite)

 

Dim s As New StreamWriter(fs1) '声明一个StreamWriter。

 

'将值替换为从临时文件读取的字符串中的值。

While myReader.Read

 

Strvalue1= myReader.GetValue(0).ToString()

                Str1= Replace(swrtarget.ToString,##Address##", Trim(strvalue1)

                Strvalue1= myReader.GetValue(1).ToString()

                str1= Replace(str.ToString,##Name##", Trim(strvalue1)

 

同样适用于##DOF##和##desig###。

 

End While

 

关闭读取器。

关闭连接。

 

' 替换所有值后,通过文件写入器(s)将这些值写入file2.rtf。

            s.WriteLine(str)

            '将数据写入流写入器后,必须刷新值。

            s.Flush()

            '关闭流写入器。

            s.Close()

            fs1.Close()

            fs2.Close()

 

 

现在将详细信息复制到最终文件。

此文件可以是.doc文件。

 

Dim td1 = Server.CreateObject("Scripting.FileSystemObject")

        td1.CopyFile(Server.MapPath(".") & "Temporary.rtf", Server.MapPath(".") & "final.doc")

        '在浏览器中打开一个新窗口,并向用户显示final.doc文件。

        strtargetFilepath = " finalletter.doc"

        Response.Write("<script> window.open('" & strtargetFilepath & "') </script>")

 

 主代码片段

******************************************************************************************************************************************************

Public Sub GetOutput()

        Dim strFilePath As String   '声明字符串变量以存储文件路径。

        试试

 

            Dim strvalue As String

            Dim myReader As OleDb.OleDbDataReader

            Dim SqlStr1 As String

            Dim Srefno As String

            Srefno = Nothing

            ' 声明一个文件系统对象td。

            Dim td = Server.CreateObject("Scripting.FileSystemObject")

            ' 将模板文件temp2.rtf复制到file2.rtf。

            td.CopyFile(Server.MapPath(".") & "/temp2.rtf", Server.MapPath(".") & "/file2.rtf")

           

 

            ' 将文件路径设置为file2.rtf。

            strFilePath = Server.MapPath(".") & "file2.rtf"

            ' 获取refno到Srefno变量中。

            Srefno = Session("RefNo")

            Dim strString As String

            Dim cmd As OleDbCommand

            '以读取模式打开file2.rtf。

            Dim fs2 As New FileStream(strFilePath, FileMode.Open, FileAccess.Read)

            '声明d作为流读取器

            Dim d As New StreamReader(fs2)

            '一个字符串变量,用于存储从文件fiel2.rtf接收到的所有值。

            Dim swrtarget As String

            ' 此变量str将存储从第2个到最终的所有值。

            ' 最后,字符串写入器将写入存储在str变量中的值。

            Dim str As String

 

            '将流读取器d初始化到文件的开头。

            d.BaseStream.Seek(0, SeekOrigin.Begin)

            swrtarget = d.ReadToEnd '一次性读取文件从头到尾。

            d.Close() ' 关闭流读取器

 

 

            Dim SqlStr As String

            Dim srno As String

 

 

            SqlStr = " 您的查询在这里"

            clsCon.OpenCon(ConfigurationSettings.AppSettings("strConnection").ToString)

            cmd = New OleDb.OleDbCommand(SqlStr, clsCon.Con)

            myReader = cmd.ExecuteReader

 

 

            '设置打开file2.rtf的路径

            strFilePath = Server.MapPath(".") & "file2.rtf"

            '以读写模式打开file2.rtf文件

            Dim fs1 As New FileStream(strFilePath, FileMode.Open, FileAccess.ReadWrite)

 

            Dim s As New StreamWriter(fs1) '声明一个StreamWriter。

            '现在从数据库(即表--> tblofferletter)中读取值到字符串变量strvalue。

            '用从file2.rtf读取的字符串中的值替换这些值

            While myReader.Read

                strvalue = myReader.GetValue(0).ToString()

                str = Replace(swrtarget.ToString, "##refno##", Trim(strvalue))

                strvalue = myReader.GetValue(1).ToString()

                str = Replace(str.ToString, "##Title##", Trim(strvalue))

                strvalue = myReader.GetValue(2).ToString()

                str = Replace(str.ToString, "##FirstName##", Trim(strvalue))

                strvalue = myReader.GetValue(3).ToString()

                str = Replace(str.ToString, "##LName##", Trim(strvalue))

                strvalue = myReader.GetValue(4).ToString()

               

            End While

            myReader.Close()

            cmd.Dispose()

 

            ' 替换所有值后,通过文件写入器(s)将这些值写入file2.rtf。

            s.WriteLine(str)

            '将数据写入流写入器后,必须刷新值。

            s.Flush()

            '关闭流写入器。

            s.Close()

            fs1.Close()

            fs2.Close()

 

            '将srefno初始化为nothing,以便当请求新报告时,它将具有最新值。

            Srefno = Nothing

 

 

        Catch ex As Exception

            Response.Write("" + ex.Message)

                  Response.Write("")

 

        最后

            ' Response.Write("OFFER LETTER GENERATED SUCCESSFULLY.")

                  clsCon.closeCon()

                 

        End Try

 

    End Sub

 

************************************************************************************

 

优点

 

  1. 易于维护 – 模板中的更改可以轻松进行和更新。
  2. 只需几行代码。
© . All rights reserved.