设为首页 加入收藏

TOP

FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】(一)
2019-08-30 23:49:26 】 浏览:46
Tags:FreemarkerJavaDemo Android 表单 数据 生成 Word 文档 方案 之一 基于 freemarker2.3.28 只能 java

版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

这个方案只能在java中运行,无法在Android项目中运行。所以此方案是:APP将表单数据发送给后台,后台通过freemarker将表单数据根据模板ftl文件生成Word文件,然后返回给APP,由APP进行展现。

前期准备

1、下载freemarker.jar文件

官网下载地址:https://freemarker.apache.org/freemarkerdownload.html

 

后续将freemarker.jar文件添加到项目中。

2、制作模板ftl文件

(1)先用office2003或更高版本word软件编辑好word模版文件【版本要2003以上,2003以下的不支持另存为xml格式功能】

注意:

  • 在word模板中写入相对真实的数据【注意,不要使用英文,尽量使用中文、数字,见附录1】;
  • 对于对勾样式的数据,在word模板文件中统一用安卓代替(后续需要通过java代码传入带有对勾样式的数据);
  • 需要设置图片的话,需要在word模板文件中放入真实的图片占位;请尽量选择小于50K的图片,并且把图片的大小和位置调整好。选择小图片的原因是避免xml文件过大导致打开时缓慢甚至卡死。

例子:

 

(2)另存为Word 2003 XML文档

对于Word2016,另存为后会自动打开xml文件,所以需要先关闭xml文件,然后再使用FirstObject XML Editor软件打开xml文件!

(3)下载FirstObject XML Editor软件

 下载FirstObject XML Editor软件(免安装版):下载地址:http://www.firstobject.com/dn_editor.htm

   

官网下载的软件打开文件的时候可能会出现崩溃的问题建议使用foxe_CHS.exe软件进行编辑。下载地址见项目Demo下载地址。

(4)使用FirstObject XML Editor软件将xml打开,将真实数据换成FreeMarker标记

首先进行“缩进排版”

查找真实数据,替换成FreeMarker标记,其实就是Map<String, Object>中key,如${writeDate},对应Map的key值就是writeDate。

替换成:

对于文本按照上面的方式进行替换,而对于图片需要这样替换:

图片是以base64编码存在的,且这些编码放在<w:binData>标签之中。将这些base64编码使用占位符代替,然后java代码中将图片生成base64编码,传入值就能正常显示了。

替换成

(5)然后保存,直接将文件后缀修改为.ftl(FreeMarker模板)

 

注意:一定不要用word打开ftl模板文件查看,否则xml内容会发生变化,导致前面的工作白做了;可以使用EditPlus打开查看。

使用步骤

一、项目组织结构图

二、导入步骤

1、在项目中引入freemarker.jar

2、将制作的模板文件leaveTemplet.ftl和图片资源复制到D:/temp目录下

3、将DocumentHandler.java文件复制到项目中

package com.why.main;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;

/**
 * 生成Doc文档
 */
public class DocumentHandler {

    //测试
    public static void main(String[] args) {
        DocumentHandler documentHandler = new DocumentHandler();
        documentHandler.createDoc();
    }

    // 配置实例:只需要一个实例(单例模式)
    private Configuration configuration = null;

    private String tempDirPath = "D:/temp";

    public DocumentHandler() {
        // 通过Freemaker的Configuration读取相应的ftl
        configuration = new Configuration(Configuration.VERSION_2_3_28);
        configuration.setDefaultEncoding("UTF-8");// 设置默认编码方式
    }

    /**
     * 生成DOC文档
     */
    public void createDoc() {
        // 要填入模本的数据文件
        Map<String,Object> dataMap = new HashMap<String,Object>();
        getData(dataMap);
        // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
        // 如果模板是放在程序代码的包下面
        //configuration.setClassForTemplateLoading(this.getClass(),"../");
        //如果放到服务器目录中,则使用下面的代码
        try {
            configuration.setDirectoryForTemplateLoading(new File(tempDirPath));
        } catch (IOException e2) {
            e2.printStackTrace();
        }
        //这里要设置取消使用Local语言环境
        configuration.setLocalizedLookup(false);
        Template template = null;
        try {
            // leaveTemplet.ftl为要装载的模板
            te
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android6.0 源码修改之 Contacts.. 下一篇Adreno OpenCL坑——bool转int

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目