知识大全 Java中根据模板导出数据到word的解决方案

Posted 文件

篇首语:一盏一直亮着的灯,你不会去注意,但是如果它一亮一灭,你就会注意到。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中根据模板导出数据到word的解决方案相关的知识,希望对你有一定的参考价值。

Java中根据模板导出数据到word的解决方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Java中根据模板导出数据到word的解决方案我们需求如下 给你一个模板 里面有一个表格 标题已经给好 程序主要就是完成把数据填写到word中并提供给用户下载

  网上找了很久 发现主要两种开源包 POI和Jacob Jacob首先被否决掉了 因为他最后必须运行在windows平台上 Excel导入导出我就是用的POI 但是POI中的word操作实在不行 读取还可以 写入数据远不能满足项目的需要 后面尝试诸如生成PDF然后转Word 生成XML转Word 生成Html转word 生成rtf转word 这些都是可行的办法 但是网上开源包的功能有限 iText对PDF操作是很强 但是对PDF内容的解析不行

  最后这个事情拖了四天 我看文档的时候想到mht文件 于是我把Word模板导出成mht文件 然后查看其源码 其实就是代码 我想这样可以用velocity填写数据 然后直接导出成doc格式的文档 后来这样基本满足我们项目的需要

  #foreach($bean in $beanList)

  <tr style= D mso yfti irow: ;mso yfti lastrow:yes;page break inside:avoid;

  height: pt >

  <td width= D % style= D width: %;border:solid windowtext pt;borde=

  r top:

  none;mso border top alt:solid windowtext pt;mso border alt:solid window=

  text pt;

  padding: cm pt cm pt;height: pt >

  <p class= DMsoNormal align= Dcenter style= D text align:center ><span style= D mso bidi font size: pt;font family:SimSun >$bean seqNo<o:p></o:p></span=

  ></p>

  </td>

  <td width= D % style= D width: %;border top:none;border left:none;

  border bottom:solid windowtext pt;border right:solid windowtext pt;

  mso border top alt:solid windowtext pt;mso border left alt:solid window=

  text pt;

  mso border alt:solid windowtext pt;padding: cm pt cm pt;height: =

   pt >

  <p class= DMsoNormal align= Dcenter style= D text align:center ><span

  style= D mso bidi font size: pt;font family:SimSun >$bean name<span

  lang= DEN US><o:p></o:p></span></span></p>

  </td>

  </tr>

  #end

  上面是用mht源码改写成vm文件的部分代码 就和生成一般的文本文件一摸一样 这儿如果直接把汉字 特殊字符什么的传给模板(当然英文不会) 会出现乱码 导致根据模板导出的word文件这个都是乱码 关于乱码的详细解释可以参考 也就是说导出时需要把带汉字的字符串都进行转码 这儿给出一些方法

  /**

  * 把给定的str转换为 进制表示的unicode 格式为 姨

  * 目前只是用于mht模板的转码

  * @param str

  * @return

  */

  public static String encode HtmlUnicode(String str)

  if(str == null) return ;

  StringBuilder sb = new StringBuilder(str length() * );

  for (int i = ; i < str length(); i++)

  sb append(encode HtmlUnicode(str charAt(i)));

  

  return sb toString();

  

  public static String encode HtmlUnicode(char character)

  if (character > )

  return &# + (character & xffff) + ; ;

   else

  return String valueOf(character);

  

  

  public static String encode HtmlUnicode(Character character)

  if(character == null) return null;

  return encode HtmlUnicode(character charValue());

  

  public static void encode HtmlUnicode(String[] value)

  if(value == null || value length < ) return;

  for(int i = ; i < value length; i ++)

  value[i] = encode HtmlUnicode(value[i]);

  

  

  上面的这些方法在项目中可以通过递归来对bean进行转码 当然我在项目中只是针对String和Character两种数据类型进行转码

  static Object encodeStringAndCharacter(Object value)

  if(value instanceof String)

  return StringUtils replaceNullString(EncodeUtils encode HtmlUnicode((String) value));

   else if(value instanceof Character)

  return StringUtils replaceNullString(EncodeUtils encode HtmlUnicode((Character) value));

  

  return null;

  

  static void encodeExceptStringAndCharacter(Object value) throws Exception

  if(value instanceof String[])

  EncodeUtils encode HtmlUnicode((String[]) value);

   else if(value instanceof List)

  encode HtmlUnicode((List) value);

   else if(value instanceof Form)

  encode HtmlUnicode((Form) value);

   else if(value instanceof Form[])

  encode HtmlUnicode((Form[]) value);

  

  

  @SuppressWarnings( unchecked )

  static void encode HtmlUnicode(List value) throws Exception

  if(value == null || value size() < ) return;

  for(int i = ; i < value size(); i ++)

  Object ele = value get(i);

  Object result = encodeStringAndCharacter(ele);

  if(result != null)

  value set(i result);

   else

  encodeExceptStringAndCharacter(ele);

  

  

  

  static void encode HtmlUnicode(Form[] value) throws Exception

  if(value == null) return;

  for(int i = ; i < value length; i ++)

  encode HtmlUnicode(value[i]);

  

  

  static void encode HtmlUnicode(Form value) throws Exception

  if(value == null) return;

  PropertyDescriptor[] pds = PropertyUtils getPropertyDescriptors(value getClass());

  if(pds == null) return;

  for(int i = ; i < pds length; i ++)

  PropertyDescriptor pd = pds[i];

  Object fieldValue = PropertyUtils getProperty(value pd getName());

  Class fieldType = pd getPropertyType();

  if(String class isAssignableFrom(fieldType))

  PropertyUtils setProperty(value

  pd getName()

  StringUtils replaceNullString(EncodeUtils encode HtmlUnicode((String) fieldValue)));

   else if(List class isAssignableFrom(fieldType))

  encode HtmlUnicode((List) fieldValue);

   else if(Form class isAssignableFrom(fieldType))

  encode HtmlUnicode((Form) fieldValue);

   else if(Form[] class isAssignableFrom(fieldType))

  encode HtmlUnicode((Form[]) fieldValue);

  

  

  

  上面的Form类型不需要关心 就是一个Bean接口 这样在传到模板之前进行上述转码 就基本上可以避免乱码问题

  导出结束后 只需要把OutputStream导出到* doc文件中即可 下载的话只要设置

  response setHeader( Content disposition attachment; filename= + URLEncoder encode( *** doc DEFAULT_WEB_ENCODING));

  项目还有一个需求 对于一些飞机零件或者领导名字要求是图片显示 这个不难 但模板做起比较繁琐 因为mht模板和难控制 一般都是通过word另存的 而且里面汉字有时ascii格式 所以需要显示图片的地方都事先放一个图片 然后再在mht代码中替换一下

  #if($manager)

  <! [if gte vml =

   ]><v:shape

  id= D _x _i type= D #_x _t style= D width: pt;height: pt >

  <v:imagedata src= D file files/image gif o:title= D />

  </v:shape><![endif] ><![if !vml]><img width= D height= D

  src= D file files/image gif v:shapes= D _x _i ><![endif]>

  #end

  

  #if($manager)

   =_NextPart_ C E B AE C C

  Content Location: file:///C:/C D /file files/image gif

  Content Transfer Encoding: base

  Content Type: image/gif

  $manager

  #end

  在mht文件中 图片都是以base 码来存储的 所以在存取之前 必须把二进制的图片进行base 编码

  static BASE Encoder base Encoder = new BASE Encoder();

  /**

  * 把给定的二进制流变成base 码

  * @param in

  * @return

  * @throws IOException

  */

  public static synchronized String base Encode(InputStream in) throws IOException

  byte[] img = new byte[in available()];

  in read(img);

  return base Encode(img);

  

  public static synchronized String base Encode(String in) throws IOException

  return base Encode(in getBytes());

  

  public static synchronized String base Encode(byte[] in) throws IOException

  return base Encoder encode(in);

  

  转换成String以后在传到模板文件中显示则可 关于任何格式 布局等等等的调整你可以事先在word里先全部调整好再另存 导出效果如下图

  上面的 编号 表格数据 横线上的都是填写的

cha138/Article/program/Java/hx/201311/25981

相关参考

知识大全 在.NET环境下将报表数据导出Excel和Word[2]

在.NET环境下将报表数据导出Excel和Word[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 在.NET环境下将报表数据导出Excel和Word[1]

在.NET环境下将报表数据导出Excel和Word[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Delphi向Word中导出数据

Delphi向Word中导出数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据导出到wor

知识大全 .NET导出Gridview到excel 带模板列显示

.NET导出Gridview到excel带模板列显示  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 如何将 Access 数据导出到 Oracle 数据库中

如何将Access数据导出到Oracle数据库中?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 利用SQL*Loader将 Excel 数据导出到 Oracle 数据库中

利用SQL*Loader将Excel数据导出到Oracle数据库中  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一

知识大全 解决Oracle数据库10g导出错误6550

解决Oracle数据库10g导出错误6550  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!现象使用

知识大全 MySQL 数据库导出SQL出现乱码解决

MySQL数据库导出SQL出现乱码解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  环境Nav

知识大全 以Oracle为例说明如何通过ODBC将数据库中的指定表导出到MDB数据库

以Oracle为例说明如何通过ODBC将数据库中的指定表导出到MDB数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我

知识大全 oracle数据库如何导出并重新导入

oracle数据库导出并重新导入 一导出数据库?将数据库TEST完全导出用户名scott密码tiger导出到D:\\testDBdmp中[plain]expscott/tiger@TESTf