Java 对Word文件的生成(基于Apache POI)

C# 处理Word自动生成报告 一、概述

Java 对Word文件的生成(基于Apache POI)

Apache POI 是一个开源的跨平台的对Microsoft Office格式档案具有读和写功能工具。
在Github上有一个开源的Word模版引擎poi-tl ,这个模版引擎是基于Apache POI。主要是为了解决下面的问题:

  • java操作word使用apache poi的复杂性
  • 使用freemarker,转化为xml操作word的难度
  • 依赖服务器上安装软件openoffice来调用转化
  • 依赖windows的word lib库,不具有跨平台性

注意!
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。(*.doc),HWPFDocument类
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。(*.docx),XWPFDocument类
因为这个模版引擎是只使用XWPFDocument类,所以只对*.docx文档生效。

常见问题解决方法:

C# 处理Word自动生成报告 二、数据源例子

poi-tl demo

1、MathType 6.0与office 2007兼容问题

C# 处理Word自动生成报告 三、设计模板

调用方法

/*
* datas 是你要渲染的数据
* datas 可以是JavaBean,也可以是Map<String, Object>
*/
XWPFTemplate template = XWPFTemplate.compile("~/file.docx").render(datas);

除了传入模版文件路径,还可以传入模版文件输入流

public static XWPFTemplate compile(InputStream inputStream) {
    .....
    }

由于Office软件安装时默认是不安装公式编辑器的,在安装完MathType 6.0之后,需要将MathType 6.0OfficeSupport目录中的MathType Commands 6 For Word.dot复制到C:Documents andSettings当前用户名Application DataMicrosoftWordSTARTUP目录中,重新打开Office2007Word之后就可以在的“加载项”选项卡中看到Mathtype的快捷按钮了,此时“插入”菜单中的“公式”符号显示为亮色,表示可以使用。

C# 处理Word自动生成报告 四、程序处理

datas TO Map<String, Object>

看看数据类转Map的实现

private static Map<String, Object> convert2Map(Object dataSrouce) {
        Map<String, Object> ret = new HashMap<String, Object>();
        try {
            Class<?> clazz = dataSrouce.getClass();
            while (clazz != Object.class) {
                Field[] fields = clazz.getDeclaredFields();
                PropertyDescriptor pd = null;
                for (Field f : fields) {
                    pd = new PropertyDescriptor(f.getName(), dataSrouce.getClass());
                    Name annotation = f.getAnnotation(Name.class);
                    Object value = pd.getReadMethod().invoke(dataSrouce);
                    ret.put(null == annotation ? f.getName() : annotation.value(), value);
                }
                clazz = clazz.getSuperclass();
            }
        } catch (Exception e) {
            logger.error("Convert datasource failed.", e);
            throw new RenderException("Convert datasource failed.");
        }
        return ret;
    }

利用反射,把datas类和它的父类的字段属性转成Map<String, Object>,Object除外。所以我们传的参数是JavaBean或Map<String, Object>就可以了(传Map参数,会调用同名的的重载方法)。

但是此时也会出现一个问题,在使用Ctrl V粘贴时会提示出错“Only One MathType command can beexecuted at a time.  Please try againlater.”,而只有在
Word的“编辑”菜单中选择“选择性粘贴”才可以将复制的内容粘贴进来。而且插入公式的功能只对word2007格式的文件(后缀名为docx)有效,对之前版本的word文件(doc格式)仍然不能使用公式编辑器。建议:不将MathType6.0作为Word 2007的默认加载项,即删除C:Documents and Settings当前用户名ApplicationDataMicrosoftWordSTARTUP目录中的MathType Commands 6 ForWord.dot文件,而在需要插入公式的使用使用独立的MathType 6.0程序,然后将编辑好的公式粘贴到Word中。 

 

语法

2、MathType 6.0中MT Extra(TrueType)字体问题

现在说一下程序处理部分,有点长

普通文本

在打开MathType6.0时,有时会提示MathType需要安装一个较新版本的MT Extra(TrueType)字体,这是因为你的系统没有MTExtra(TrueType)字体,或此字体的版本太低,缺少某些符号。

本来是想做针对doc和docx的模板两个版本, 后来想到可以在生成的时候saveas里设置格式,

渲染数据为String或者TextRenderData

模版文件中使用:{{template}}

...
Map<String, Object> datas = new HashMap<String, Object>();
datas.put("template", "我是渲染的数据");
// 参数1:颜色 9d55b8;参数2:文本内容
datas.put("title", new TextRenderData("9d55b8", "Deeply in love with the things you love,n just deepoove."));

...         
  • 文本中可用n 来进行换行

解决方法:打开C:WINDOWSFonts,若里面有MTExtra(TrueType)字体或其快捷方式,则将其删除,再把MathType安装目录下MathType6.0FontsTrueType目录里面的MTEXTRA.TTF字体文件复制粘贴到C:WINDOWSFonts 文件夹中(粘贴时会有安装字体提示),完成字体完装。 

本文由糖果派对电玩城发布于营销内容,转载请注明出处:Java 对Word文件的生成(基于Apache POI)

您可能还会对下面的文章感兴趣: