导出最多的就是Excel了,头一次碰到导出Word,心里那个懵,现在献上具体的导出方法及步骤!
第一步:首先拿到Word模板,你就会想用什么方法来实现?如图所示:

把要填写的内容区域用${}来进行插值操作,不要以为这样写就可以了,那你就太天真了!
比如第一个:${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的作用大家都很清楚那就是拿来塞值的。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删