MVC之单个信函打印
来源:互联网 发布:淘宝拍图片要多少钱 编辑:程序博客网 时间:2024/04/29 17:26
需求介绍
系统当中有一个Word模板,每个人的具体信息不同,需要填充到Word模板的数据也就不同。所以需要针对不同的人具体情况,填充好模板后返回到客户端Word文件。如图所示:
系统界面:
----------------------------------------------------------------------------------------------------------------------------------------------------------
需求分析
----------------------------------------------------------------------------------------------------------------------------------------------------------
难点分析
1、如何向Word模板中填充数据?
2、服务器如何向客户端浏览器输出文件?
------------------------------------------------------------------------------------------------------
难点解析
1、Aspose.Words是一个商业.NET类库,可以使得应用程序处理大量的文件任务。Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XPS,EPUB和其他格式。使用Aspose.Words可以在不使用Microsoft.Word的情况下生成、修改、转换和打印文档。(下载地址)
2、可以使用Response对象,执行下载操作
------------------------------------------------------------------------------------------------------
项目实践
添加Aspose.Words的引用
View:
----------------------------------------------------------------------------------------------------------------------------------------------------------
<script type="text/javascript">
$(function () {
//提交表单
$("#btnSave").click(function () {
$("#myForm").submit();
}
});
</script>
@model TalentServiceCenterFileManage.ViewModel.FamilyPlanInfoViewModel
<body>
<div>
@using (Html.BeginForm("GetExcel", "FamilyPlanInfo", FormMethod.Post, new { @id = "myForm" }))
{
<table width="100%" border="0">
<tr>
<td width="15%">
<!--人事信息浮动窗口-->
档案编号:<br/>
@Html.TextBoxFor(u => u.ID)<br/>
姓名:
@Html.TextBoxFor(u => u.name)<br/>
身份证号:<br/>
@Html.TextBoxFor(u => u.idNumber)<br/>
性别:
@Html.TextBoxFor(u => u.sex)<br/>
</td>
<td width="85%">
<table >
<tr>
<td width="152" align="right" valign="middle"style="border:#B6DFFA 1px solid"><span class="STYLE5">计生关系建卡时间:</span></td>
<td >@Html.TextBoxFor(u => u.familysettime)</td>
</tr>
<tr>
<td align="right" valign="middle"style="border:#DFF1FB 1px solid"><span class="STYLE5">卡片编号:</span></td>
<td >@Html.TextBoxFor(u => u.cardnum)</td>
</tr>
<tr>
<td align="right" valign="middle"style="border:#DFF1FB 1px solid"><span class="STYLE5">备注:</span></td>
<td >@Html.TextBoxFor(u => u.state)</td>
</tr>
</table>
</td>
</tr>
<tr>
<td><input type="submit" value="打印信函" id="btnSave" />
</td>
</tr>
</table>
}
</body>
---------------------------------------------------------------------------------------------------------
Controller:
-------------------------------------------------------------------------------------------------------------------------------------------------------------
//通过HttpPost方法取得ViewModel
[HttpPost]
public void GetExcel(FamilyPlanInfoViewModel enFamilyInfo)
{
INumberBll numberInfo = SpringHelper.GetObject<INumberBll>("NumberBll");
//获取模板的路径
var path = Server.MapPath("../Document/2初婚未育调查报告.doc");
//获取充填数据后Word存放的目录
var ouputPath = Server.MapPath("../Document/");
Document doc = new Document(path);
DocumentBuilder builder = new DocumentBuilder(doc);
//获取用户编号,用于填充模板
string strUserID = "001";
if (strUserID.Length < 4)
{
strUserID = "0" + strUserID;
}
//获取信函编号,用于填充模板
//string strCardNo = numberInfo.GetNumber();
string strCardNo = "1111";
if (strCardNo.Length < 4)
{
strCardNo = "0" + strCardNo;
}
//获取documentID参数,用于填充模板
string strDocumentID = "LFRC" + strUserID + "No." + strCardNo;
//设置生成的文件名称
var fileName = "初婚未育调查报告(" + DateTime.Now.ToString("yyyy-MM-ddHH-mm-ss") + ").doc";
//获取模板中设定好的字段
String[] fieldNames = new String[] { "documentID", "name", "sex", "year", "month", "date", "marryyear", "marrymonth", "marrydate", "spouseworkplace", "spousename" };
//取得需要填充到模板的数据
Object[] fieldValues = new Object[] { strDocumentID, enFamilyInfo.name, enFamilyInfo.sex, enFamilyInfo.idNumber.Substring(6, 4), enFamilyInfo.idNumber.Substring(10, 2), enFamilyInfo.idNumber.Substring(12, 2), "", "", "", enFamilyInfo.spouseworkplace, enFamilyInfo.spousename };
//合并模版,相当于页面的渲染
doc.MailMerge.Execute(fieldNames, fieldValues);
ouputPath = ouputPath + fileName;
//保存合并后的文档,生成的文档存放到服务器硬盘中
doc.Save(ouputPath);
//通过response对象,执行下载操作
System.IO.FileInfo file = new System.IO.FileInfo(ouputPath);
if (file.Exists)//判断文件是否存在
{
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.AddHeader("content-disposition", "attachment;filename=" + file.Name);
Response.AddHeader("cintent_length", "attachment;filename=" + HttpUtility.UrlDecode(file.Name));
Response.AddHeader("cintent_length", file.Length.ToString());
//设定输入文件的类型
Response.ContentType = "application.vnd.ms-word";
Response.WriteFile(file.FullName);
Response.Flush();
Response.End();
//从服务器硬盘中删除刚生成的Word文件
System.IO.File.Delete(ouputPath);
}
}
----------------------------------------------------------------------------------------------------
注意:
这里View向Controller中提交表单的方式不能使用Ajax技术,因为Ajax技术得到的DataType中没有文件。也就是说Ajax得到的只能是数据,即便是调用了返回文件的Controller但是返回给Ajax的仍然是字符串。所以上述代码采用普通Form表单提交。
----------------------------------------------------------------------------------------------------------------------------------------------------------
总结思考
1、做项目中要及时总结经验。做项目中通过巨大的毅力才克服的一个技术难关,一定要及时总结反思。找到自己在解决问题的时候哪里出现了问题,然后不断进步。
2、写博客是用文字记录生命。不断用文字记录自己努力的成果,在写博客中找到学习的乐趣。
3、做项目中不断严格要求,这样技术才能精益求精。
- MVC之单个信函打印
- MVC之多个信函打印
- 单个循环打印九九乘法表
- 单个循环打印菱形
- 字符串单个打印
- 单个变量打印九九乘法表
- 信函语
- Spring MVC 上传单个文件
- Spring MVC 单个文件上传
- spring mvc打印信息
- struts2之单个文件上传
- struts2之单个文件上传
- struts2之单个文件上传
- struts2之单个文件上传
- struts2之单个文件上传
- struts2之单个文件上传
- struts2之单个文件上传
- struts2之单个文件上传
- 频道发布与消息订阅
- 布线问题
- phalapi改动的地方
- Effective C++ 改善程序与设计的55个具体做法 二周目笔记01
- sass 安装使用杂记
- MVC之单个信函打印
- Warez出品的精品动画,近25万倍的压缩,大小仅有64K的
- 树中走N步求获得的最大金币数 树形DP SRM 666 div2 problem999
- 关于Android开发中Java对象序列化的一次测试
- Stretch Key Dimensions to See What Breaks
- nyoj 327 亲和串 【kmp(好题)】
- If You Design It, You Should Be Able to Code It
- JUnit软件测试技术(工具)----注意事项
- 图片轮播器[ScrollView,PageControl]