知识大全 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中导出数据 以下文字资料是由(全榜网网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 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!现象使用
MySQL数据库导出SQL出现乱码解决 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 环境Nav
知识大全 以Oracle为例说明如何通过ODBC将数据库中的指定表导出到MDB数据库
以Oracle为例说明如何通过ODBC将数据库中的指定表导出到MDB数据库 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我
oracle数据库导出并重新导入 一导出数据库?将数据库TEST完全导出用户名scott密码tiger导出到D:\\testDBdmp中[plain]expscott/tiger@TESTf