ASP.NET生成动态Word文档






2.77/5 (13投票s)
2006 年 5 月 1 日
7分钟阅读

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 ##.
- 成绩单
姓名:##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
************************************************************************************
优点
- 易于维护 – 模板中的更改可以轻松进行和更新。
- 只需几行代码。