批量生成Word 要是一个个的填写,工作量还真是很大,而且以后每年都要这样填写,实在是太麻烦了。

好了,这应该是一个很简单的问题,假设数据都准备好了(事实上这部分也是一团糟,尽管比较简单),我们可以考虑使用报表设计器做一个报表,但是其中报表的细节比较麻烦(比如答辩委员会的成员可能只有7个,而不是图示的8个,一般的报表设计器不是很好处理)。再考虑直接用程序生成WORD文档吧,嗯,WORD的对象模型可以参考,但生成这种格式还是比较麻烦的,我们可以考虑一种变通的方法——使用HTML文件作为中转:
先使用Dreamweaver等HTML生成工具,生成上图所示的表格,保存为一个html文件。用WORD打开这个html文件,看一下效果(使用“页面”视图),除了表格线好像太粗了,其它的CSS样式应用效果还是很好的。现在,我们就可以考虑像ASP时代开发的时候使用代码循环为每一个学生那样生成这个表格了。另外,还有一个需求需要满足,就是每个学生的审核表应该占一页,也就是说每次循环都应该插入一个分页符。HTML文件中没有分页的概念,我们可以先在WORD中插入一个分页符,然后将这个WORD文档另存为HTML文件,然后查看其源文件,可以看到,分页符是这样的:
至于细线表格,当然可以在CSS样式中加以定义,也可以按照上面分页符的方式查看其源代码:
OK,下面的代码就可以为所有学生一次生成审核表了:
好了,这应该是一个很简单的问题,假设数据都准备好了(事实上这部分也是一团糟,尽管比较简单),我们可以考虑使用报表设计器做一个报表,但是其中报表的细节比较麻烦(比如答辩委员会的成员可能只有7个,而不是图示的8个,一般的报表设计器不是很好处理)。再考虑直接用程序生成WORD文档吧,嗯,WORD的对象模型可以参考,但生成这种格式还是比较麻烦的,我们可以考虑一种变通的方法——使用HTML文件作为中转:
先使用Dreamweaver等HTML生成工具,生成上图所示的表格,保存为一个html文件。用WORD打开这个html文件,看一下效果(使用“页面”视图),除了表格线好像太粗了,其它的CSS样式应用效果还是很好的。现在,我们就可以考虑像ASP时代开发的时候使用代码循环为每一个学生那样生成这个表格了。另外,还有一个需求需要满足,就是每个学生的审核表应该占一页,也就是说每次循环都应该插入一个分页符。HTML文件中没有分页的概念,我们可以先在WORD中插入一个分页符,然后将这个WORD文档另存为HTML文件,然后查看其源文件,可以看到,分页符是这样的:
CODE:
<br clear=all style=\'page-break-before:always\'>
至于细线表格,当然可以在CSS样式中加以定义,也可以按照上面分页符的方式查看其源代码:
CODE:
<table width=\'610\' border=\'1\' cellpadding=\'0\' cellspacing=\'0\' bordercolor=\'#000000\' style=\'border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt; mso-yfti-tbllook:480;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext\'></table>
OK,下面的代码就可以为所有学生一次生成审核表了:
CODE:
string strFilePath = Application.StartupPath + @"\wordfile.doc";
2
3 System.IO.StreamWriter sw = new System.IO.StreamWriter(strFilePath, false, System.Text.Encoding.GetEncoding("gb2312"));
4 sw.WriteLine("<html><head><meta http-equiv=\'Content-Type\' content=\'application/msword; charset=gb2312\'><title>学位论文答辩委员会成员审核表</title>");
5 sw.WriteLine("<style type=\'text/css\'><!--.STYLE1 { font-family: \'宋体\'; font-size: 18pt; font-weight: bold; } .STYLE2 { font-family: \'宋体\'; font-size: 11pt; font-weight: bold; } --> </style>");
6 sw.WriteLine("</head>");
7 sw.WriteLine("<body>");
8
9 System.Data.OleDb.OleDbDataAdapter odda = new System.Data.OleDb.OleDbDataAdapter("SELECT 研究生.编号, 研究生.姓名, 研究生.学科专业, 研究生.导师, 研究生.论文题目 FROM 研究生 ORDER BY 研究生.编号", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Windows.Forms.Application.StartupPath + @"\database.mdb");
10
11 System.Data.DataSet dsStudent = new DataSet();
12
13 odda.Fill(dsStudent);
14
15 for (int i = 0; i < dsStudent.Tables[0].Rows.Count; i++)
16 {
17
18 sw.WriteLine("<div align=\'center\' class=\'STYLE1\'><u> 硕 </u>士学位论文答辩委员会成员审核表</div>");
19
20 sw.WriteLine("<table width=\'610\' border=\'1\' cellpadding=\'0\' cellspacing=\'0\' bordercolor=\'#000000\' style=\'border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt; mso-yfti-tbllook:480;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext\'>");
21
22 sw.WriteLine("<tr><td width=\'68\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>研究生<br />姓 名</td>");
23 sw.WriteLine("<td width=\'93\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["姓名"].ToString() + "</td>");
24 sw.WriteLine("<td width=\'68\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>专 业</td>");
25 sw.WriteLine("<td colspan=\'3\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["学科专业"].ToString() + "</td></tr>");
26
27
28 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>导 师<br />姓 名</td>");
29 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["导师"].ToString() + "</td>");
30 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>论 文<br />题 目</td>");
31 sw.WriteLine("<td colspan=\'3\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["论文题目"].ToString() + "</td></tr>");
32
33 sw.WriteLine("<tr><td rowspan=\'8\' align=\'center\' valign=\'middle\' class=\'STYLE2\'>答<br /><br />辩<br /><br />委<br /><br />员<br /><br />会<br /><br />成<br /><br />员</td>");
34 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>姓 名</td>");
35 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>职 称</td>");
36 sw.WriteLine("<td width=\'204\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>工 作 单 位</td>");
37 sw.WriteLine("<td width=\'100\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>在委员会中<br />担任的职务</td>");
38 sw.WriteLine("<td width=\'63\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>备 注</td></tr>");
39
40 System.Data.OleDb.OleDbDataAdapter oddaT = new System.Data.OleDb.OleDbDataAdapter("SELECT 答辩老师小组.顺序, 答辩老师.姓名, 答辩老师.职称, 答辩老师.单位, 答辩老师小组.答辩职务, 答辩老师.备注 FROM 答辩老师 INNER JOIN (答辩老师小组 INNER JOIN (答辩小组 INNER JOIN 研究生小组 ON 答辩小组.编号 = 研究生小组.小组) ON 答辩老师小组.小组编号 = 答辩小组.编号) ON 答辩老师.编号 = 答辩老师小组.答辩老师编号 WHERE (((研究生小组.研究生)=" + dsStudent.Tables[0].Rows[i]["编号"].ToString() + ")) ORDER BY 答辩老师小组.顺序", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Windows.Forms.Application.StartupPath + @"\database.mdb");
41
42 System.Data.DataSet dsTeacher = new DataSet();
43 oddaT.Fill(dsTeacher);
44
45 for (int j = 0; j < 7; j++)
46 {
47 if (j < dsTeacher.Tables[0].Rows.Count)
48 {
49 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["姓名"].ToString() + "</td>");
50 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["职称"].ToString() + "</td>");
51 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["单位"].ToString() + "</td>");
52 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["答辩职务"].ToString() + "</td>");
53 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["备注"].ToString() + "</td></tr>");
54 }
55 else
56 {
57 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
58 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
59 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
60 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
61 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td></tr>");
62 }
63 }
64
65 dsTeacher.Dispose();
66
67 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\'>分学<br />科学<br />位评<br />定委<br />员会<br />意见</td>");
68 sw.WriteLine("<td colspan=\'5\' class=\'STYLE2\'><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p>");
69 sw.WriteLine("<p> 分委员会主席(签字) 2006年06月10日</p></td></tr>");
70
71 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\'>校学<br />位评<br />定委<br />员会<br />审批<br />意见</td>");
72 sw.WriteLine("<td colspan=\'5\' class=\'STYLE2\'><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p>");
73 sw.WriteLine("<p> 2006年06月10日</p></td></tr></table>");
74
75 sw.WriteLine("<br clear=all style=\'page-break-before:always\'>");
76 }
77
78 dsStudent.Dispose();
79
80 sw.WriteLine("</body></html>");
81
82 sw.Close();
83
84 System.Diagnostics.Process.Start(strFilePath);
2
3 System.IO.StreamWriter sw = new System.IO.StreamWriter(strFilePath, false, System.Text.Encoding.GetEncoding("gb2312"));
4 sw.WriteLine("<html><head><meta http-equiv=\'Content-Type\' content=\'application/msword; charset=gb2312\'><title>学位论文答辩委员会成员审核表</title>");
5 sw.WriteLine("<style type=\'text/css\'><!--.STYLE1 { font-family: \'宋体\'; font-size: 18pt; font-weight: bold; } .STYLE2 { font-family: \'宋体\'; font-size: 11pt; font-weight: bold; } --> </style>");
6 sw.WriteLine("</head>");
7 sw.WriteLine("<body>");
8
9 System.Data.OleDb.OleDbDataAdapter odda = new System.Data.OleDb.OleDbDataAdapter("SELECT 研究生.编号, 研究生.姓名, 研究生.学科专业, 研究生.导师, 研究生.论文题目 FROM 研究生 ORDER BY 研究生.编号", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Windows.Forms.Application.StartupPath + @"\database.mdb");
10
11 System.Data.DataSet dsStudent = new DataSet();
12
13 odda.Fill(dsStudent);
14
15 for (int i = 0; i < dsStudent.Tables[0].Rows.Count; i++)
16 {
17
18 sw.WriteLine("<div align=\'center\' class=\'STYLE1\'><u> 硕 </u>士学位论文答辩委员会成员审核表</div>");
19
20 sw.WriteLine("<table width=\'610\' border=\'1\' cellpadding=\'0\' cellspacing=\'0\' bordercolor=\'#000000\' style=\'border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt; mso-yfti-tbllook:480;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext\'>");
21
22 sw.WriteLine("<tr><td width=\'68\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>研究生<br />姓 名</td>");
23 sw.WriteLine("<td width=\'93\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["姓名"].ToString() + "</td>");
24 sw.WriteLine("<td width=\'68\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>专 业</td>");
25 sw.WriteLine("<td colspan=\'3\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["学科专业"].ToString() + "</td></tr>");
26
27
28 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>导 师<br />姓 名</td>");
29 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["导师"].ToString() + "</td>");
30 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>论 文<br />题 目</td>");
31 sw.WriteLine("<td colspan=\'3\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'50pt\'>" + dsStudent.Tables[0].Rows[i]["论文题目"].ToString() + "</td></tr>");
32
33 sw.WriteLine("<tr><td rowspan=\'8\' align=\'center\' valign=\'middle\' class=\'STYLE2\'>答<br /><br />辩<br /><br />委<br /><br />员<br /><br />会<br /><br />成<br /><br />员</td>");
34 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>姓 名</td>");
35 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>职 称</td>");
36 sw.WriteLine("<td width=\'204\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>工 作 单 位</td>");
37 sw.WriteLine("<td width=\'100\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>在委员会中<br />担任的职务</td>");
38 sw.WriteLine("<td width=\'63\' align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>备 注</td></tr>");
39
40 System.Data.OleDb.OleDbDataAdapter oddaT = new System.Data.OleDb.OleDbDataAdapter("SELECT 答辩老师小组.顺序, 答辩老师.姓名, 答辩老师.职称, 答辩老师.单位, 答辩老师小组.答辩职务, 答辩老师.备注 FROM 答辩老师 INNER JOIN (答辩老师小组 INNER JOIN (答辩小组 INNER JOIN 研究生小组 ON 答辩小组.编号 = 研究生小组.小组) ON 答辩老师小组.小组编号 = 答辩小组.编号) ON 答辩老师.编号 = 答辩老师小组.答辩老师编号 WHERE (((研究生小组.研究生)=" + dsStudent.Tables[0].Rows[i]["编号"].ToString() + ")) ORDER BY 答辩老师小组.顺序", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Windows.Forms.Application.StartupPath + @"\database.mdb");
41
42 System.Data.DataSet dsTeacher = new DataSet();
43 oddaT.Fill(dsTeacher);
44
45 for (int j = 0; j < 7; j++)
46 {
47 if (j < dsTeacher.Tables[0].Rows.Count)
48 {
49 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["姓名"].ToString() + "</td>");
50 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["职称"].ToString() + "</td>");
51 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["单位"].ToString() + "</td>");
52 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["答辩职务"].ToString() + "</td>");
53 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'>" + dsTeacher.Tables[0].Rows[j]["备注"].ToString() + "</td></tr>");
54 }
55 else
56 {
57 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
58 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
59 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
60 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td>");
61 sw.WriteLine("<td align=\'center\' valign=\'middle\' class=\'STYLE2\' height=\'36\'> </td></tr>");
62 }
63 }
64
65 dsTeacher.Dispose();
66
67 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\'>分学<br />科学<br />位评<br />定委<br />员会<br />意见</td>");
68 sw.WriteLine("<td colspan=\'5\' class=\'STYLE2\'><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p>");
69 sw.WriteLine("<p> 分委员会主席(签字) 2006年06月10日</p></td></tr>");
70
71 sw.WriteLine("<tr><td align=\'center\' valign=\'middle\' class=\'STYLE2\'>校学<br />位评<br />定委<br />员会<br />审批<br />意见</td>");
72 sw.WriteLine("<td colspan=\'5\' class=\'STYLE2\'><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p>");
73 sw.WriteLine("<p> 2006年06月10日</p></td></tr></table>");
74
75 sw.WriteLine("<br clear=all style=\'page-break-before:always\'>");
76 }
77
78 dsStudent.Dispose();
79
80 sw.WriteLine("</body></html>");
81
82 sw.Close();
83
84 System.Diagnostics.Process.Start(strFilePath);