love_Saber_Archer
lin185
采纳率50%
2019-12-11 16:29

为什么我用freemarker导出word文档,导出的里面全是ftl文字内容,而不是正确的格式呢?找了好久了都没找出来问题。。。

java代码:

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import lombok.extern.slf4j.Slf4j;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.util.*;

@Slf4j
public class WordReporter {

    private static final String ENCODING = "UTF-8";
    private static Configuration cfg = new Configuration();

    //初始化cfg
    static {
        //设置模板所在文件夹
        try {
            cfg.setDirectoryForTemplateLoading(new File("D:/"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码
        cfg.setEncoding(Locale.getDefault(), ENCODING);
        // 设置对象的包装器
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        // 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

    }

    //获取模板对象
    public static Template getTemplate(String templateFileName) throws IOException {
        return cfg.getTemplate(templateFileName, ENCODING);
    }

    /**
     * 据数据及模板生成文件
     * @param data             Map的数据结果集
     * @param templateFileName ftl模版文件名
     * @param outFilePath      生成文件名称(可带路径)
     */
    public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {
        Writer out = null;
        File outFile = new File(outFilePath);
        try {
            // 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
            Template template = getTemplate(templateFileName);
            if (!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }
            out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);
            // 处理模版
            template.process(data, out);
            out.flush();
            log.info("由模板文件" + templateFileName + "生成" + outFilePath + "成功.");
        } catch (Exception e) {
            log.error("由模板文件" + templateFileName + "生成" + outFilePath + "出错");
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                log.error("关闭Write对象出错", e);
                e.printStackTrace();
            }
        }
        return outFile;
    }

    public static void main(String[] args) {
        try {
            Map<String, Object> data = new HashMap<String, Object>();
            List<Map<String, String>> newsList = new ArrayList<Map<String, String>>();
            for(int i=1;i<=5;i++){
                Map<String, String> map=new HashMap<String, String>();
                map.put("stName", "字段姓名"+i);
                newsList.add(map);
            }
            data.put("list",newsList);
            crateFile(data, "a.ftl", "D:/aaa.docx");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ftl文件内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" mc:Ignorable="w14 w15 wp14">
    <w:body>
        <#list list as data>
        <w:tbl>
            <w:tblPr>
                <w:tblStyle w:val="4"/>
                <w:tblW w:w="0" w:type="auto"/>
                <w:tblInd w:w="0" w:type="dxa"/>
                <w:tblBorders>
                    <w:top w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                    <w:left w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                    <w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                    <w:right w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                    <w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                    <w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                </w:tblBorders>
                <w:tblLayout w:type="autofit"/>
                <w:tblCellMar>
                    <w:left w:w="108" w:type="dxa"/>
                    <w:right w:w="108" w:type="dxa"/>
                </w:tblCellMar>
            </w:tblPr>
            <w:tblGrid>
                <w:gridCol w:w="2840"/>
                <w:gridCol w:w="2841"/>
                <w:gridCol w:w="2841"/>
            </w:tblGrid>
            <w:tr>
                <w:tblPrEx>
                    <w:tblBorders>
                        <w:top w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                        <w:left w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                        <w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                        <w:right w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                        <w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                        <w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0"/>
                    </w:tblBorders>
                    <w:tblCellMar>
                        <w:left w:w="108" w:type="dxa"/>
                        <w:right w:w="108" w:type="dxa"/>
                    </w:tblCellMar>
                </w:tblPrEx>
                <w:tc>
                    <w:tcPr>
                        <w:tcW w:w="2840" w:type="dxa"/>
                    </w:tcPr>
                    <w:p>
                        <w:pPr>
                            <w:rPr>
                                <w:rFonts w:hint="eastAsia" w:eastAsiaTheme="minorEastAsia"/>
                                <w:vertAlign w:val="baseline"/>
                                <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                            </w:rPr>
                        </w:pPr>
                        <w:r>
                            <w:rPr>
                                <w:rFonts w:hint="eastAsia"/>
                                <w:vertAlign w:val="baseline"/>
                                <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                            </w:rPr>
                            <w:t>1</w:t>
                        </w:r>
                    </w:p>
                </w:tc>
                <w:tc>
                    <w:tcPr>
                        <w:tcW w:w="2841" w:type="dxa"/>
                    </w:tcPr>
                    <w:p>
                        <w:pPr>
                            <w:rPr>
                                <w:rFonts w:hint="eastAsia" w:eastAsiaTheme="minorEastAsia"/>
                                <w:vertAlign w:val="baseline"/>
                                <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                            </w:rPr>
                        </w:pPr>
                        <w:r>
                            <w:rPr>
                                <w:rFonts w:hint="eastAsia"/>
                                <w:vertAlign w:val="baseline"/>
                                <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                            </w:rPr>
                            <w:t>1</w:t>
                        </w:r>
                    </w:p>
                </w:tc>
                <w:tc>
                    <w:tcPr>
                        <w:tcW w:w="2841" w:type="dxa"/>
                    </w:tcPr>
                    <w:p>
                        <w:pPr>
                            <w:rPr>
                                <w:rFonts w:hint="default" w:eastAsiaTheme="minorEastAsia"/>
                                <w:vertAlign w:val="baseline"/>
                                <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                            </w:rPr>
                        </w:pPr>
                        <w:r>
                            <w:rPr>
                                <w:rFonts w:hint="eastAsia"/>
                                <w:vertAlign w:val="baseline"/>
                                <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                            </w:rPr>
                            <w:t>${data.stName}</w:t>
                        </w:r>
                    </w:p>
                </w:tc>
            </w:tr>
        </w:tbl>
        </#list>
        <w:p>
            <w:bookmarkStart w:id="0" w:name="_GoBack"/>
            <w:bookmarkEnd w:id="0"/>
        </w:p>
        <w:sectPr>
            <w:pgSz w:w="11906" w:h="16838"/>
            <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
            <w:cols w:space="425" w:num="1"/>
            <w:docGrid w:type="lines" w:linePitch="312" w:charSpace="0"/>
        </w:sectPr>
    </w:body>
</w:document>

图片说明

导出的文件里面全是ftl文件里的文字内容

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

2条回答

  • VICTOR_fusheng VICTOR_fusheng 2年前

    什么意思?name没取出来?集合的话用这样取值试试

        <#list list as attr>
        <w:t>${attr.stName}</w:t>
        </#list>
    
    点赞 评论 复制链接分享
  • qq_40067407 qq_40067407 2天前

    大佬,解决了吗?我也遇到了,一下子懵了,找了很多都没找到怎么解决

    点赞 评论 复制链接分享