zoukankan      html  css  js  c++  java
  • 基于模板和XML在BS结构应用中生成word文件

    现在的各类应用系统中时常会需要动态生成Word文件,解决比较常见的两种方法是:

     1.       利用Word提供的COM自动化接口控制Word生成文档

     2.       利用Wordhtml的支持,制作html文件,并设置其contentType"application/msword",使浏览器调用word打开

    第一种方法靠Word进程实际完成文件生成工作,而Word并为设计为在服务器端处理并发调用,所以这种方法只适合单机应用。另外,如果要生成比较复杂的word文件,相应的代码会非常烦琐,排版和调试也需要花大量时间。

    第二种方法的致命问题是html文档中无法保存二进制数据,比如图片,如果在服务器端生成一堆文件,即难以在浏览器中显示,也无法让用户直接下载。

     比较完善的解决办法是基于WordML来生成word文件。WordML是微软为Word设计的xml架构,其完整语法可以在MSDN找到。按照这个语法生成xml文件,可以在文档中随意得到各种word支持的格式。特别需要指出的是可以方便的在文件中内嵌图片,其语法基本是这样:

     

     

    其关键是图片的实际数据以base64编码之后放在<w:binData></w:binData>标记之间。

     如果你看了MSDNWordML语法,会发现它非常复杂。这不奇怪,因为Word有非常多的功能,但要写程序根据这么多定义来生成文档就比较费事了。不过我们可以利用模板文件来解决这个问题。

     同我们动态生成网页一样,要动态生成的word文件也有相当多部分是固定不变的,并且复杂的版面、格式一般都在这些固定不变的部分中。所以借用生成网页的思路,我们可以在word中先根据需要的版面和格式,结合一些虚拟的数据做出模板文件,然后将这个模板文件保存为xml格式,再在xml文件中找到那些虚拟的数据对应的文本,将它们替换为将采用的后台处理技术的数据处理指令,这样我们就可以在服务器端结合模板文件和数据库查询,生成word文件了。

     下面举一个例子。假设我们采用JSP进行word文件生成,首先制作模板文件如下:

     个人简历

    本人概况

    姓名


    出生日期


    相片

    性别

    证件类型

    身份证

    学历


    证件号码


    婚姻状况

    已婚

    期望月薪

    面议

    户口所在地

     

     

     

    然后将这个文件保存为xml格式,我们将得到如下内容的xml文件:

     

    接下来首先将这个文件按照xml格式进行排版,然后在其中找到需要动态生成的文字部分(WordML中文字以<w:t></w:t>标记起始),将其替换为从后台取数据生成文字的JSP指令,再在文件头部添加JSP控制指令,得到如下的xml文件:

     

    将这个文件以jsp后缀保存,就可以在J2EE系统中配合后台程序生成word文件了。如果你需要浏览器提示保存这个文件,而不是在浏览器中打开,需要在文件头部加入这句:
    response.setHeader("Content-Disposition", "attachment; filename=resume.doc");
    有很多免费的第三方库可以用于生成图片文件的BASE64编码,JDK中也有BASE64 Encoder。

    更简单的方法是在用word制作模板文件时直接在需要动态生成的部分输入jsp指令,然后再保存为xml文件,但要注意检查word保存为xml文件后有没有将jsp指令拆散或插入格式标记。

     以上以JSPJSTL为例,换成其它后台技术,比如Velocity,或者ASPPHP,原理也是相同的。

    实际上,在需要生成Word文件的应用中,多数时候需要套用固定的格式,这样本文所解释的方法就更加合适。

    本文转自:http://java.ccidnet.com/art/3737/20040722/454095_1.html

  • 相关阅读:
    Spring Boot下的一种导入Excel文件的代码框架
    Spring Boot下的一种导出CSV文件的代码框架
    Spring Boot下的一种导出Excel文件的代码框架
    使用系统参数表,提升系统的灵活性
    折纸效果! Cocos Creator 3.0
    弹性跟随相机!3D入门教程!
    dotnet OpenXML 读取 PPT 主序列进入退出强调动画
    dotnet C# 调用委托的 GetInvocationList 的对象分配
    WPF 下拉框选项做鼠标 Hover 预览效果
    WPF 后台代码做 TranslateTransform 的动画
  • 原文地址:https://www.cnblogs.com/daichangya/p/12960147.html
Copyright © 2011-2022 走看看