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、做项目中不断严格要求,这样技术才能精益求精。

0 0
原创粉丝点击