导出最多的就是Excel了,头一次碰到导出Word,心里那个懵,现在献上具体的导出方法及步骤!

第一步:首先拿到Word模板,你就会想用什么方法来实现?如图所示:

导出word报错out of system resources_xml文件

把要填写的内容区域用${}来进行插值操作,不要以为这样写就可以了,那你就太天真了!

比如第一个:${QYMC},这些都是英文状态下的字符,因为Word模板是有固定格式的,那么你在生成xml文件时,最后把xml文件的内容复制到后缀名为.ftl的文件里,生成的格式就会出现问题,问题描述是:${QYMC 与 }是分开的状态,这样你在获值塞进去 的时候就会报错!正确的代码格式如下:

<w:r w:rsidRPr="0048700A">
  <w:rPr>
      <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
         <w:color w:val="333333"/>
         <w:kern w:val="0"/>
         <w:szCs w:val="21"/>
  </w:rPr>
  <w:t>${QYMC}</w:t>
</w:r>

关键步骤:把Word中所有的插值如${QYMC}必须要:::剪切---->粘贴(至文本文档txt中,为啥是这个里面,那是因为txt文本是无格式的)!操作顺序如下:Ctrl+X,Ctrl+V,Ctrl+S,Ctrl+A,Ctrl+X,Ctrl+V。头尾两个操作是在Word模板中操作,中间全部是在txt文本文档中操作!

只有按照上述步骤操作,你生成的代码内容,插值字段是一个整体的,不会是拆散的(拆散的就会导致对应的值插不到对应的位置或者导出Word直接报错)!

大家就会想:怎么生成代码???

Word 对应的字段全部填充好时,最后直接把Word重命名,重命名的文件后缀是.xml文件,打开xml文件把里面生成好的代码全部复制要粘贴到一个后缀是.ftl的文件中,这个ftl文件是在你开发的环境中新建一个空文件,命名方式是**.ftl。。。

这才是模板最终要的环节,如果模板生成的代码格式全部乱了,直接导致你插入的值获取不到,导出Word操作直接报错!!!!

第二步:那就是后端的代码实现!!

@BLH("XjrExitWordBLH")
@Mapping("/XjrExitWordBLH")
public class XjrExitWordBLH {

    @Resource
    IExportWordService exportWordService;

    @Mapping("/getData")
    public IZrarResponse getData(IZrarRequest req) throws Exception {
        IZrarResponse res = new ZrarResponse();
        Map dataMap = new HashMap();
        //获取id
        String id = req.getParameter("id");
        ZxqyXjrqysqVO vo = exportWordService.getVo(id);

        dataMap.put("QYMC", vo.getQymc()); //企业名称
        dataMap.put("SZSFMC", vo.getSzsfmc()); //所在省份
        dataMap.put("TXDZ", vo.getTxdz()); //所在省份
        dataMap.put("YB", vo.getYb()); //所在省份
        dataMap.put("FDDBR", vo.getFddbr()); //所在省份
        dataMap.put("FDDBRDH", vo.getFddbrdh()); //所在省份
        dataMap.put("FDDBRSJ", vo.getFddbrsj()); //所在省份
        dataMap.put("LXR", vo.getLxr()); //所在省份
        dataMap.put("LXRDH", vo.getLxrdh()); //所在省份
        dataMap.put("LXRSJ", vo.getLxrsj()); //所在省份
        dataMap.put("CZ", vo.getCz());//传真
        dataMap.put("EMAIL", vo.getEmail());//E-Mail
        dataMap.put("ZCSJ", vo.getZcsj());//注册时间
        dataMap.put("ZCZB", vo.getZczb());//注册资本
        dataMap.put("TYSHXYDM", vo.getTyshxydm());//统一社会信用代码

        File file = exitWord(req.getRealPath("\\"), "ftl", "exportWordFtl", "导出Word模板", dataMap);
        res.addStream(file,"导出Word模板.doc");// file 文件对象,fileName 下载时所提示文件名称
        return res;
    }

 下面的方法就是导出Word的模板方法,这个方法很重要,请好好分析下!!

/**
     * ftl类型文件导出word模板方法
     *
     * @param realPath
     * @param path
     * @param ftlName
     * @param docAsName
     * @param dataMap
     * @return
     */

    public static File exitWord(String realPath, String path, String ftlName, String docAsName, Map<String, Object> dataMap) {
        Configuration config = new Configuration();
        File file = null;
        Writer out = null;
        try {
            if (!path.startsWith("/")) {
                path += "/";
            }
            if (!path.endsWith("/")) {
                path = path + "/";
            }
            //realPath = req.getRealPath("\\") + "WEB-INF";
            realPath = realPath + path;
            realPath = realPath.replace("\\", "/");
            config.setDirectoryForTemplateLoading(new File(realPath));
            config.setDefaultEncoding("UTF-8");
            config.setObjectWrapper(new DefaultObjectWrapper());
            Template template = config.getTemplate(ftlName + ".ftl", "UTF-8");
            //ftl转doc文书保存的地址
            //String dir = PropertyManager.getProperty("CommonUploadFileUrl");
            String dir = PropertyManager.getProperty("CommonUploadFileUrl", new String[0]);
            dir = dir.replace("\\", "/");
            if (dir.lastIndexOf("/") == dir.length() - 1) {
                dir = dir + "temp/";
            } else {
                dir = dir + "/temp/";
            }

            File folder = new File(dir);
            if ((folder.exists()) || (folder.mkdirs())) {
                file = new File(folder, docAsName + ".doc");
                file.createNewFile();
            }

            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            template.process(dataMap, out);
            out.flush();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }

一个是塞数据的方法,另一个就是导出Word的方法!细心的朋友会发现,里面使用了接口来实现!接口方法如下:

public interface IExportWordService {

    ZxqyXjrqysqVO getVo(String id) throws Exception;

}
@Service("exportWordService")
public class ExportWordService implements IExportWordService {
    @Resource
    private IBaseZrarDao dao;

    @Override
    public ZxqyXjrqysqVO getVo(String id) {
        String sql = "select QYMC,SZSFMC,TXDZ,YB,FDDBR,FDDBRDH,FDDBRSJ,LXR,LXRDH,LXRSJ,CZ,EMAIL,ZCSJ,ZCZB,TYSHXYDM"+
                "from ZXQY_ZJTXXJR where id = ?";
        ZxqyXjrqysqVO vo = dao.getBean(sql, ZxqyXjrqysqVO.class, id);
        return vo;
    }

}

接口的方法就是为了查询出所有使用的字段数据,返回的结果就是一个VO,VO的作用大家都很清楚那就是拿来塞值的。