weixin_42510680
王壮实
2014-10-23 00:40

用freemarker生成word文档,文档打开报错,求高手`

已采纳

我用freemarker生成word文档,文档打开报错,用UE打开文档后发现文档没有写完,如下:
文件测试/w:t
/w:r
/w:p








<w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="

写到color那就没了,为什么?
这个是java代码:
[code="java"]package com.feifei.test;

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

import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class CreateWordDemo {

    private Configuration configuration = null;

    public CreateWordDemo() {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
    }

    public void createDoc() {
        //要填入模本的数据文件
        Map dataMap=new HashMap();
        getData(dataMap);
        //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
        //这里我们的模板是放在com.havenliu.document.template包下面
        configuration.setClassForTemplateLoading(this.getClass(), "/com/feifei/test/template");
        Template t=null;
        try {
            //test.ftl为要装载的模板
            t = configuration.getTemplate("test.ftl");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //输出文档路径及名称
        File outFile = new File("D:/tmp/outFile.doc");
        Writer out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            t.process(dataMap,out,ObjectWrapper.BEANS_WRAPPER);
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 注意dataMap里存放的数据Key值要与模板中的参数相对应
     * @param dataMap
     */
     private void getData(Map dataMap)
      {

          dataMap.put("remark", "这是测试备注信息");
          List table=new ArrayList();

          PersonEntity p1 = new PersonEntity();
          p1.setName("yaofeihu");
          p1.setXingzuo("tianxie");

          table.add(p1);

          dataMap.put("table", table);

      }  

     public static void main(String[] args) {
        CreateWordDemo c = new CreateWordDemo();
        c.createDoc();
    }

}

[/code]

下面这个是模板文件
[code="java"]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>



feihu yao/o:Author
feihu yao/o:LastAuthor
2/o:Revision
1/o:TotalTime
2014-10-22T14:55:00Z/o:Created
2014-10-22T14:55:00Z/o:LastSaved
1/o:Pages
8/o:Words
46/o:Characters
Hewlett-Packard Company/o:Company
1/o:Lines
1/o:Paragraphs
53/o:CharactersWithSpaces
12/o:Version
/o:DocumentProperties








/w:font







/w:font







/w:font






/w:font






/w:font
/w:fonts












































































































































/w:latentStyles







/w:pPr






/w:rPr
/w:style



/w:style






/w:rPr







/w:tblCellMar
/w:tblPr
/w:style



/w:style









/w:pBdr



/w:tabs


/w:pPr




/w:rPr
/w:style








/w:rPr
/w:style










/w:tabs


/w:pPr




/w:rPr
/w:style








/w:rPr
/w:style







/w:rPr









/w:tblBorders





/w:tblCellMar
/w:tblPr
/w:style
/w:styles




/o:shapelayout
/w:shapeDefaults



















/w:hdrShapeDefaults





/w:r
/w:p
/w:footnote




/w:r
/w:p
/w:footnote
/w:footnotePr





/w:r
/w:p
/w:endnote




/w:r
/w:p
/w:endnote
/w:endnotePr













/w:compat
wsp:rsids








/wsp:rsids
/w:docPr





/w:rPr
中国银行新一代印鉴管理系统/w:t
/w:r
/w:p






/w:rPr
java/w:t
/w:r




/w:rPr
生成/w:t
/w:r



/w:rPr
word/w:t
/w:r




/w:rPr
文件测试/w:t
/w:r
/w:p












/w:tblBorders

/w:tblPr



/w:tblGrid




/w:tcPr





/w:rPr
/w:pPr




/w:rPr
姓名/w:t
/w:r
/w:p
/w:tc



/w:tcPr





/w:rPr
/w:pPr




/w:rPr
星座/w:t
/w:r
/w:p
/w:tc
/w:tr
<#list table as person>




/w:tcPr





/w:rPr
/w:pPr




/w:rPr
${person.name}/w:t
/w:r
/w:p
/w:tc



/w:tcPr





/w:rPr
/w:pPr




/w:rPr
${person.xingzuo}/w:t
/w:r
/w:p
/w:tc
/w:tr
</#list>
/w:tbl







/w:rPr
备注:/w:t
/w:r




/w:rPr
${remark}/w:t
/w:r



/w:rPr
1/w:t
/w:r
/w:p





/w:sectPr
/w:body
/w:wordDocument[/code]

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • xierui4056 rayxie120 7年前

    java代码第57行输出流处理完后要调用flush把内容刷新上去,并关闭输出流.试试
    out.flush();
    out.close();

    点赞 评论 复制链接分享
  • jiangchao419 jiangchao419 7年前

    [code="java"]

    //替换为word格式,xml中以下符号要特殊处理
    str = str.replaceAll("&", "&");//转换成Unicode
    str = str.replaceAll(">", ">");
    str = str.replaceAll("<", "<");

    [/code]

    点赞 评论 复制链接分享

相关推荐