许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  导出Word常见问题及解决方法(一)

导出Word常见问题及解决方法(一)

阅读数 1
点赞 0
article_banner

导出最多的就是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的作用大家都很清楚那就是拿来塞值的。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空