利用Aspose.Words.dll导出Word代替NPOI

许久没来写博客了,已至于登录博客园的密码都忘却了。

时间过的真快,最近再做一个招聘管理系统,其中用到了导出Word文档的功能,尝试了各种方法,遇到了各种问题。不过最后还是解决了导出Word的问题。

一、针对导出Word文档的功能,采用的几个方案:

 1.预置好Word文档模板,采用加载替换文档内容标签的方式实现。
 
  采用这种方案可以借助两个第三方组件来实现,分别如下:

  (1)、借助Microsoft.Office.Interop.Word组件实现。
  (2)、借助NPOI实现。
  (3)、借助Aspose.Words实现。

 2.绘制方案,即利用第三方组件现实Word文件的绘制。
 
  绘制方案的难点如下:
  (1)、段落、表格的处理。
  (2)、样式的处理。

二、实现

  方案选择:最终权衡利弊,还是采用替换的方式更为合理,由于导出功能的使用量并不大,而且并发导出的情况也极少发生。所以在可行性方面,该方案可行。

  1.首先采用的是借助Microsoft.Office.Interop.Word组件实现。
     
    采用此方案实现的相关代码网上有很多很多,大家可以搜下。利用此方法我实现了替换导出,但是问题来了,由于服务器上由于盗版审查,不允许安装盗版软件,而且Microsoft.Office.Interop.Word是需要在服务器上安装Office的,所以被系统管理员Pass,经多方沟通后,还是不允许安装。无奈只能另想办法。


  2.借NPOI实现。
    NPOI是开源的框架,免费,但是由于对.net开发来说,NPOI对Excel的支持那是相当的强大的,唯独对Word的支持还不是那么强大,而且最新NPOI2.1的说明文档和案例又少之又少。不过还是硬着头皮利用NPOI分别实现了下模板标签替换和word绘制,最终都以失败告终。替换后导出的word怎么也打不找,提示错误。绘制的方法成功的导出的Word,但是样式实在是整不了。

  3.借助Aspose.Words实现
    在经过上述尝试和实现后,思维陷入了崩溃的境地,好在同事提醒,说有个Aspose.Words可以一试。查了下Aspose.Words,发现了收费的,可然在还是有破解版的。考虑到是内部用的,而且不是商业用途,所以试着实现了下。

    利用Aspose.Words实现官网上有相关的案例,支持各种输出。大家可以百度下。

    我这里要强调的是模板的制做,我采用的是替换 “文档部件”来实现的。

    具体操作见图:
    (1).模板制做


   

    插入文档部件,仔细看,你会在图的最右侧看到 “文档部件”

  

   选择“域”项 

    

    域名选择“MergeField”

 

    

    域名置为"UserName"。

      

   

     上图就是模板的效果,当然,你可以自己美化和调整,到此我们的模板就制做完成了,接下来就是写程序执行替换了。

 

     (2).替换

   

private void ExportByAsPose(string vouchId)
        {
            try
            {
		//模板路径
                string tempPath = ConfigurationManager.AppSettings["RmaApplyTemplate"];
                string outputPath = "D:/招聘需求申请表.doc";
                var doc = new Document(tempPath); //载入模板
                //提供数据源
                String[] fieldNames = new String[] { 
                    "UserName"
                 };


				Object[] fieldValues = new Object[] { "Jerry" };
                

                //合并模版,相当于页面的渲染
                doc.MailMerge.Execute(fieldNames, fieldValues);



                //保存合并后的文档
                //doc.Save(outputPath);
                //在WebForm中,保存文档到流中,使用Response. BinaryWrite输出该文件
                var docStream = new MemoryStream();
                doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
                Response.ContentType = "application/msword";
                Response.AddHeader("content-disposition", "attachment;  filename=招聘需求申请表.doc");
                Response.BinaryWrite(docStream.ToArray());
                Response.End();
                //File.Delete("D:/招聘需求申请表.docx");                 //清除服务端生成的word文件
            }
            catch (Exception e)
            {
                Response.Write(e.Message + "  请联系管理员!");
            }



        }

 

  好了,到此完成了Word文档的导出。 给自己留个印象,特此小记。

     希望对大家有所帮助。

   

posted @ 2015-06-29 15:32  jerry-Tom  阅读(4359)  评论(4编辑  收藏  举报