基于模板和XML在BS结构应用中生成word文件 :: 瞬间

来源: BlogBus 原始链接: http://floe.blogbus.com:80/logs/2005/05/1189189.html 存档链接: https://web.archive.org/web/20060128053421id_/http://floe.blogbus.com:80/logs/2005/05/1189189.html


瞬间 无数个一瞬间连成线 << 网页中嵌入内容块的几种方式 | Top | 纪念卫国战争胜利六十周年 >> 基于模板和XML在BS结构应用中生成word文件 Time:2005-05-16 现在的各类应用系统中时常会需要动态生成 Word 文件,解决比较常见的两种方法是: 1. 利用 Word 提供的 COM 自动化接口控制 Word 生成文档 2. 利用 Word 对 html 的支持,制作 html 文件,并设置其 contentType 为 "application/msword" ,使浏览器调用 word 打开 第一种方法靠 Word 进程实际完成文件生成工作,而 Word 并为设计为在服务器端处理并发调用,所以这种方法只适合单机应用。另外,如果要生成比较复杂的 word 文件,相应的代码会非常烦琐,排版和调试也需要花大量时间。 第二种方法的致命问题是 html 文档中无法保存二进制数据,比如图片,如果在服务器端生成一堆文件,即难以在浏览器中显示,也无法让用户直接下载。 比较完善的解决办法是基于 WordML 来生成 word 文件。 WordML 是微软为 Word 设计的 xml 架构,其完整语法可以在 MSDN 上 找到。按照这个语法生成 xml 文件,可以在文档中随意得到各种 word 支持的格式。特别需要指出的是可以方便的在文件中内嵌图片,其语法基本是这样: <w:pict> <v:shapetype id="_x0000_t75" ...> ... VML shape template definition ... </v:shapetype> <w:binData w:name="wordml://02000001.jpg">/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2JlAGTAAAAAAf/b AIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxsc ... 更多 Base6 编码的图片文件数据 </w:binData> <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width: 212.4pt ;height: 159pt "> <v:imagedata src="wordml://02000001.jpg" o:title="Image title"/> </v:shape> </w:pict> 其关键是图片的实际数据以 base64 编码之后放在 <w:binData></w:binData> 标记之间。 如果你看了 MSDN 上 的 WordML 语法,会发现它非常复杂。这不奇怪,因为 Word 有非常多的功能,但要写程序根据这么多定义来生成文档就比较费事了。不过我们可以利用模板文件来解决这个问题。 同我们动态生成网页一样,要动态生成的 word 文件也有相当多部分是固定不变的,并且复杂的版面、格式一般都在这些固定不变的部分中。所以借用生成网页的思路,我们可以在 word 中先根据需要的版面和格式,结合一些虚拟的数据做出模板文件,然后将这个模板文件保存为 xml 格式,再在 xml 文件中找到那些虚拟的数据对应的文本,将它们替换为将采用的后台处理技术的数据处理指令,这样我们就可以在服务器端结合模板文件和数据库查询,生成 word 文件了。 下面举一个例子。假设我们采用 JSP 进行 word 文件生成,首先制作模板文件如下: 连宋个人简历 本人概况 姓名 连宋 出生日期 1937 年 7 月 7 日 性别 男 证件类型 身份证 学历 大学本科 证件号码 41043219700707011 婚姻状况 已婚 期望月薪 面议 户口所在地 然后将这个文件保存为 xml 格式,我们将得到如下内容的 xml 文件:

<w:wordDocument xmlns:w=" http://schemas.microsoft.com/office/word/2003/wordml " xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl=" http://schemas.microsoft.com/schemaLibrary/2003/core " xmlns:aml=" http://schemas.microsoft.com/aml/2001/core " xmlns:wx=" http://schemas.microsoft.com/office/word/2003/auxHint " xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C 2F 41010-65B3-11d1-A 29F -00AA 00C 14882" xmlns:st1="urn:schemas-microsoft-com:office:smarttags" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><o:SmartTagType o:namespaceuri="urn:schemas-microsoft-com:office:smarttags" o:url="" o:name="chsdate"/><o:DocumentProperties><o:Title> 个人简历 </o:Title> ... ... <w:rPr><w:rFonts w:hint="fareast"/><wx:font wx:val=" 宋体 "/></w:rPr

<w:t> 连宋个人简历 </w:t> </w:r><w:proofErr w:type="gramStart"/><w:r><w:rPr><w:rFonts w:hint="fareast"/><wx:font wx:val=" 宋体 "/></w:rPr> ... ... <w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path=" m@4@5l@4@11@9@11@9@5xe " filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype <w:binData w:name="wordml://02000001.jpg">/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2JlAGTAAAAAAf/b ... ... </w:binData> <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width: 75pt ;height: 75pt "><v:imagedata src="wordml://02000001.jpg" o:title="cathy"/></v:shape></w:pict> ... ... </w:sectPr></wx:sub-section></wx:sect></w:body></w:wordDocument> 接下来首先将这个文件按照 xml 格式进行排版,然后在其中找到需要动态生成的文字部分( WordML 中文字以 <w:t></w:t> 标记起始),将其替换为从后台取数据生成文字的 JSP 指令,再在文件头部添加 JSP 控制指令,得到如下的 xml 文件: <%@ page language="java" errorPage="/error.jsp" pageEncoding="GBK" contentType="application/msword;charset=UTF-8" %><%response.setHeader("Content-Disposition", "attachment; filename=resume.doc");%> <%@ taglib uri=" http://java.sun.com/jstl/core " prefix="c" %> <%@ taglib uri=" http://java.sun.com/jstl/fmt " prefix="fmt" %>

<w:wordDocument xmlns:w=" http://schemas.microsoft.com/office/word/2003/wordml " xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl=" http://schemas.microsoft.com/schemaLibrary/2003/core " xmlns:aml=" http://schemas.microsoft.com/aml/2001/core " xmlns:wx=" http://schemas.microsoft.com/office/word/2003/auxHint " xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C 2F 41010-65B3-11d1-A 29F -00AA 00C 14882" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"> <o:DocumentProperties> <o:Title> 个人简历 </o:Title> ... ... <w:body> wx:sect wx:sub-section <w:p> <w:pPr> <w:pStyle w:val="a5"/> <w:rPr> <w:rFonts w:hint="fareast"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:hint="fareast"/> <wx:font wx:val=" 宋体 "/> </w:rPr> <w:t><c:out value="${command.name}"/> 个人简历 </w:t> </w:r> </w:p> ... ... <w:pict> <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path=" m@4@ 5l @4@11@9@11@9@5xe " filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype> <w:binData w:name="wordml://02000001.jpg"><c:out value="${command.portraitBASE64}"/></w:binData> <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width: 75pt ;height: 75pt "> <v:imagedata src="wordml://02000001.jpg" o:title="portrait"/> </v:shape> </w:pict> ... ... </w:body> </w:wordDocument> 将这个文件以 jsp 后缀保存,就可以在 J2EE 系统中配合后台程序生成 word 文件了。如果你需要浏览器提示保存这个文件,而不是在浏览器中打开,需要在文件头部加入这句: response.setHeader("Content-Disposition", "attachment; filename=resume.doc"); 有很多免费的第三方库可以用于生成图片文件的 BASE64 编码, JDK 中也有 BASE64 Encoder 。 更简单的方法是在用 word 制作模板文件时直接在需要动态生成的部分输入 jsp 指令,然后再保存为 xml 文件,但要注意检查 word 保存为 xml 文件后有没有将 jsp 指令拆散或插入格式标记。 以上以 JSP + JSTL 为例,换成其它后台技术,比如 Velocity ,或者 ASP 、 PHP ,原理也是相同的。 实际上,在需要生成 Word 文件的应用中,多数时候需要套用固定的格式,这样本文所解释的方法就更加合适。 floe Posted at 2005-05-16 16:55:00 Edit | Trackback(0) Comments [url=http://www.szxdx.com.cn]筛网,冲孔网,筛网厂[/url] [url=http://www.1688sp.com]韩国饰品[/url] [url=http://www.szxdx.99168.cn]筛网,冲孔网,筛网厂[/url] [url=http://www.szfully.com]铭板[/url] url=http://www.yq18.cn]东莞饮食服务,饭堂承包,膳食管理[/url] url=http://www.dghonley.com ]珍珠棉,胶袋,保护膜[/url] [url=http://www.todaygd.com]今日广东/url] [url=http://www.sztr.99168.cn]超声波熔接[/url] [url=http://szlwb.0033.cn]雨刷片,雨刮片,汽车用品,汽车配件[/url] [url=http://www.gdhongcheng.com]绝缘套管,铁氟龙电线,东莞电线,东莞扎带[/url] [url=http://www.xinkeda.com]木制工艺品[/url] url=http://www.688.99168.cn]雨刮片,雨刷片[/url] [url=http://www.szhs.99168.cn]不锈钢弹簧拉丝机[/url] [url=http://www.petnw.com]耐伟企业有限公司,中国宠物制品[/url] [url=http://www.szyy.99168.cn]易云,个人主页,个人网站,企业服务[/url] [url=http://www.918.99168.cn]雨刷片,雨刮片,汽车用品,汽车配件[/url] Posted by asdasd ( ) at 2006-01-07 14:22:15 随着互联网技术的发展和网民人口的壮大,如何充分利用互联网的优势推广产品和服务是摆在每个企业面前最主要的问题。根据艾瑞市场咨询iResearch的统计,2003年中国网络广告市场规模已达到10.8亿元,比2002年的4.9亿元增长120%。iResearch同时预测未来3年中国网络广告市场规模将达到18亿元、27亿元和40亿元,前景一片光明。专家预见,未来的网络广告将与电视广告占有同等地位的市场份额,目前谁先做好网络广告,谁即将成为同行的领先者,获得更多的商机。 陌生的访客80%-90%以上都是通过搜索引擎查找到您的网站的,所以网站在知名搜索引擎上的排名直接影响到你的网站功效,特别是Google(全球最大的搜索引擎)、百度(国内最大的搜索引擎)上的排名。网站优化的目的是用合理的手段(不是作弊),对网站源代码进行优化,使之对搜索引擎更友好,更符合排名规则,从而迅速提高排名,扩大网站影响力。 以下就是我们的部分成功案例: [url=http://www.szlichuang.cn]工艺礼品激光雕刻[/url] [url=http://www.xt168.com]网络摄像机指纹门禁VOD机顶盒[/url] [url=http://www.szhenjia.com]中兴轴承[/url] [url=http://www.sz-tianyicn.com]baby bibs[/url] [url=http://www.datangid.com]大唐产品设计工业设计医疗器械设计[/url] [url=http://www.yuebing.com]月饼[/url] [url=http://www.xinkeda.com]木制工艺品[/url] [url=http://www.arosson.com]螺丝螺母车床件[/url] [url=http://www.sz-cj.com]印刷商标[/url] [url=http://www.jiaju88.com]实验室家具[/url] [url=http://www.huataix.net]华泰鑫公司酒店门锁售饭机门禁机[/url] [url=http://www.szbeiyang.net]条码打印机标签打印机条码标签打印机POS打印机[/url] [url=http://www.5588866.com.cn]深圳占新彩色名片彩色印刷[/url] [url=http://www.dgdb.com.cn]布碎包装材料[/url] [url=http://www.jiliforklift.com]深圳叉车[/url] [url=http://www.p-vi.com]深圳市伏安动力科技有限公司--开关电源逆变器电源适配器[/url] [url=http://www.hopeful.cc]超薄数字功放[/url] [url=http://www.szhjc.net]室内环境检测,室内环境污染检测,室内空气检测,室内甲醛检测[/url] [url=http://www.szjyhk.com]机票预订深圳机票深圳特价机票深圳打折机票[/url] [url=http://www.karwee.com.tw]網站設計程式設計專案開發平面設計系統整合[/url] [url=http://www.sz-lovo.com]深圳网络公司深圳网站建设深圳网站优化深圳网站推广[/url] [url=http://www.oneji.com]深圳网络公司[/url] [url=http://www.oneji.net]深圳网站建设[/url] [url=http://www.light365.com]深圳网络公司网站建设网站优化网站推广深圳企业邮局企业邮箱[/url] [url=http://www.light365.com]深圳网络公司网站策划大型网站建设虚拟主机主机域名注册网站设计[/url] [url=http://www.light365.com]网页设计网站建设深圳专业网站建设深圳网站建设公司深圳网站建设改版[/url] [url=http://www.light365.com]专业网站建设改版网页设计网站建设电子商务解决方案[/url] [url=http://www.light365.com]专业网站建设制作[/url] [url=http://www.sz-lovo.com/host-windows.htm]深圳专业虚拟主机企业邮局[/url] [url=http://www.sz-lovo.com/mail10.htm]深圳企业邮局-深圳企业邮箱-深圳收费邮箱[/url] [url=http://www.sz-lovo.com/mail50.htm]深圳企业邮局-深圳企业邮箱-深圳收费邮箱[/url] [url=http://www.oneji.com]东莞网络公司[/url] [url=http://www.oneji.net]东莞网站建设[/url] [url=http://www.sz-lovo.com]东莞网络公司东莞网站建设东莞网站优化东莞网站推广[/url] [url=http://www.light365.com]东莞网络公司网站建设东莞网站优化网站推广东莞企业邮局企业邮箱虚拟主机[/url] [url=http://www.sz-lovo.com/host-windows.htm]东莞专业虚拟主机企业邮局[/url] [url=http://www.sz-lovo.com/mail10.htm]东莞企业邮局-东莞企业邮箱-东莞收费邮箱[/url] [url=http://www.sz-lovo.com/mail50.htm]东莞企业邮局-东莞企业邮箱-东莞收费邮箱[/url] [url=http://www.sea1688.com]有机玻璃[/url] [url=http://www.qypiano.com]二手钢琴[/url] [url=http://www.hdpj.com]皮具[/url] Posted by dfhgj ( ) at 2005-07-29 12:23:31 Add Comment Updated