使用jsp实现word、excel格式报表打印

使用jsp实现word、excel格式报表打印
http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=8444
evan 原创  (参与分:35753,专家分:640)   发表:2003-8-14 下午3:14   更新:2003-8-21 上午12:49   版本:1.0   阅读:9045

title: 使用JSP实现WORD、EXCEL格式报表打印

author: evan

email: evan_zhao@hotmail.com

date: 2003-08-21


因为ms word和excel的文档都支持html文本格式,因此可以先用word或excel做好模版,另存为Web页,然后将该html改成jsp,将数据部分动态填入即可,不用很辛苦的调整格式
 
word页面只要在jsp头设置如下指令:
<%@page contentType="application/msword;charset=GBK" %>
 
excel如下:
<%@page contentType="application/vnd.ms-excel;charset=GBK" %>

使用这种方式客户端必须安装有office软件,用户访问时将在ie中直接用word或excel打开该页面。

此方法优势是模板设计、调整方便,无需在服务器端使用复杂的POI或jxl技术,也无需在客户端使用ActiveX控件技术,更安全、方便,轻松实现较好的打印效果。 

microsoft关于服务器端动态创建office文档的资料(asp示例): 
http://support.microsoft.com/default.aspx?scid=KB;en-us;301044&
 
简单示例

使用word建立一文档,画表格如下:
----------------------------
| 用户名 | 真实姓名 | 性别 |
----------------------------
| guest  | 路人甲   | 男   |
----------------------------
保存为Web页test.htm, 将test.htm改名为test.jsp,修改其中guest、路人甲、男为从数据库动态查询,如下:

  1. <%@ page contentType="application/msword;charset=GBK" %>
  2. <%@ page import="java.sql.*" %>
  3. <html xmlns:o="urn:schemas-microsoft-com:office:office"
  4. xmlns:w="urn:schemas-microsoft-com:office:word"
  5. xmlns="http://www.w3.org/TR/REC-html40">
  6. <head>
  7. <meta http-equiv=Content-Type content="text/html; charset=GB2312">
  8. <meta name=ProgId content=Word.Document>
  9. <meta name=Generator content="Microsoft Word 9">
  10. <meta name=Originator content="Microsoft Word 9">
  11. <title>用户信息</title>
  12. <!--[if gte mso 9]><xml>
  13.  <o:DocumentProperties>
  14.   <o:Author>evan zhao</o:Author>
  15.   <o:LastAuthor>evan zhao</o:LastAuthor>
  16.   <o:Revision>1</o:Revision>
  17.   <o:TotalTime>1</o:TotalTime>
  18.   <o:Created>2003-08-20T16:26:00Z</o:Created>
  19.   <o:LastSaved>2003-08-20T16:27:00Z</o:LastSaved>
  20.   <o:Pages>1</o:Pages>
  21.   <o:Company>taiping</o:Company>
  22.   <o:Lines>1</o:Lines>
  23.   <o:Paragraphs>1</o:Paragraphs>
  24.   <o:Version>9.2812</o:Version>
  25.  </o:DocumentProperties>
  26. </xml><![endif]--><!--[if gte mso 9]><xml>
  27.  <w:WordDocument>
  28.   <w:PunctuationKerning>
  29.   <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  30.   <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  31.   <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  32.   <w:Compatibility>
  33.    <w:SpaceForUL>
  34.    <w:BalanceSingleByteDoubleByteWidth>
  35.    <w:DoNotLeaveBackslashAlone>
  36.    <w:ULTrailSpace>
  37.    <w:DoNotExpandShiftReturn>
  38.    <w:AdjustLineHeightInTable>
  39.    <w:UseFELayout>
  40.   </w:Compatibility>
  41.  </w:WordDocument>
  42. </xml><![endif]-->
  43. <style>
  44. <!--
  45.  /* Font Definitions */
  46. @font-face
  47.     {font-family:宋体;
  48.     panose-1:2 1 6 0 3 1 1 1 1 1;
  49.     mso-font-alt:SimSun;
  50.     mso-font-charset:134;
  51.     mso-generic-font-family:auto;
  52.     mso-font-pitch:variable;
  53.     mso-font-signature:3 135135232 16 0 262145 0;}
  54. @font-face
  55.     {font-family:"\@宋体";
  56.     panose-1:2 1 6 0 3 1 1 1 1 1;
  57.     mso-font-charset:134;
  58.     mso-generic-font-family:auto;
  59.     mso-font-pitch:variable;
  60.     mso-font-signature:3 135135232 16 0 262145 0;}
  61.  /* Style Definitions */
  62. p.MsoNormal, li.MsoNormal, div.MsoNormal
  63.     {mso-style-parent:"";
  64.     margin:0cm;
  65.     margin-bottom:.0001pt;
  66.     text-align:justify;
  67.     text-justify:inter-ideograph;
  68.     mso-pagination:none;
  69.     font-size:10.5pt;
  70.     mso-bidi-font-size:12.0pt;
  71.     font-family:"Times New Roman";
  72.     mso-fareast-font-family:宋体;
  73.     mso-font-kerning:1.0pt;}
  74.  /* Page Definitions */
  75. @page
  76.     {mso-page-border-surround-header:no;
  77.     mso-page-border-surround-footer:no;}
  78. @page Section1
  79.     {size:595.3pt 841.9pt;
  80.     margin:72.0pt 90.0pt 72.0pt 90.0pt;
  81.     mso-header-margin:42.55pt;
  82.     mso-footer-margin:49.6pt;
  83.     mso-paper-source:0;
  84.     layout-grid:15.6pt;}
  85. div.Section1
  86.     {page:Section1;}
  87. -->
  88. </style>
  89. </head>
  90. <body lang=ZH-CN style='tab-interval:21.0pt;text-justify-trim:punctuation'>
  91. <div class=Section1 style='layout-grid:15.6pt'>
  92. <table border=1 cellspacing=0 cellpadding=0 style='border-collapse:collapse;
  93.  border:none;mso-border-alt:solid windowtext .5pt;mso-padding-alt:0cm 5.4pt 0cm 5.4pt'>
  94.  <tr>
  95.   <td width=189 valign=top style='width:142.0pt;border:solid windowtext .5pt;
  96.   padding:0cm 5.4pt 0cm 5.4pt'>
  97.   <p class=MsoNormal><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
  98.   mso-hansi-font-family:"Times New Roman"'>用户名</span></p>
  99.   </td>
  100.   <td width=189 valign=top style='width:142.05pt;border:solid windowtext .5pt;
  101.   border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  102.   <p class=MsoNormal><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
  103.   mso-hansi-font-family:"Times New Roman"'>真实姓名</span></p>
  104.   </td>
  105.   <td width=189 valign=top style='width:142.05pt;border:solid windowtext .5pt;
  106.   border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  107.   <p class=MsoNormal><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
  108.   mso-hansi-font-family:"Times New Roman"'>性别</span></p>
  109.   </td>
  110.  </tr>
  111. <%
  112. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
  113. String url="jdbc:odbc:mydb";
  114. //连接mydb数据库
  115. Connection con=DriverManager.getConnection (url, """"); 
  116. try{
  117.   Statement stmt=con.createStatement(); 
  118.   //查询employee表
  119.   ResultSet rs=stmt.executeQuery("select user_name, real_name, gender from employee ");
  120.   while(rs.next()){
  121. %>
  122.  <tr>
  123.   <td width=189 valign=top style='width:142.0pt;border:solid windowtext .5pt;
  124.   border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  125.   <p class=MsoNormal><span lang=EN-US><%=rs.getString("user_name")%></span></p>
  126.   </td>
  127.   <td width=189 valign=top style='width:142.05pt;border-top:none;border-left:
  128.   none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
  129.   mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  130.   padding:0cm 5.4pt 0cm 5.4pt'>
  131.   <p class=MsoNormal><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
  132.   mso-hansi-font-family:"Times New Roman"'><%=rs.getString("real_name")%></span></p>
  133.   </td>
  134.   <td width=189 valign=top style='width:142.05pt;border-top:none;border-left:
  135.   none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
  136.   mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  137.   padding:0cm 5.4pt 0cm 5.4pt'>
  138.   <p class=MsoNormal><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
  139.   mso-hansi-font-family:"Times New Roman"'><%=rs.getString("gender")%></span></p>
  140.   </td>
  141.  </tr>
  142. <%
  143.   } // end while
  144.   
  145.   rs.close();
  146.   stmt.close();
  147. finally {
  148.   con.close();
  149. }
  150. %> 
  151.  
  152. </table>
  153. <p class=MsoNormal><span lang=EN-US><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p>
  154. </div>
  155. </body>
  156. </html>


相关链接:
在良好的J2EE程序中数据库查询可能写在专门的DAO(Data Access Object)中, 如何方便的查询数据并传递列表至JSP页面请参考:
JSP页面查询显示常用模式

本文参考:WEB应用中报表打印的实现

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     2       0
作者其它文章: 作者全部文章
  评论人:tangzh    参与分: 6    专家分: 0 发表时间: 2003-8-25 下午1:16
谈谈自己的感受:
    对打印报表方面使用该方法,感觉没有什么价值,如:表格中特殊符号(斜杆)不能处理,分页不能自动、每页中页表头表尾不能自动添加。。。
    但如果用PDF打印,就能体现打印报表的优势。
  评论人:FetchPro    参与分: 15    专家分: 0 发表时间: 2003-9-1 下午5:43
同意楼上的意见!WORD 做报表不适宜.
我使用org.faceless.pdf的软件包,做出PDF报表还可以使用adobe reader的功能。

  评论人:evan    参与分: 35753    专家分: 640    来自: Shanghai
发表时间: 2003-9-3 下午1:40
这只是简单的解决办法,适合没有保表工具的轻量及应用。word里可以使用页眉页脚,也可以用分页符控制分页。excel里可以嵌入公式等方便业务部门操作,并且用户可以在这个结果上再加工
使用pdf打印最大的问题是如何设计页面布局、字体等,如果有一个方便的可视化编辑器做模版就好了

想做专业报表还是需要专业保表工具,可以方便的生成各种文件格式
  评论人:wanglaobie    参与分: 9    专家分: 0 发表时间: 2004-5-18 上午10:47
用这种方法报表会变形,请问有没有一种方法将报表输出到word中同时保证报表不变形?

posted on 2005-01-31 13:42  笨笨  阅读(14617)  评论(5编辑  收藏

导航