导出Word遇到的坑及解决⽅法(⼀)!
导出最多的就是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直接报错)!
mkdirs方法⼤家就会想:怎么⽣成代码
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 = Parameter("id");
ZxqyXjrqysqVO vo = Vo(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 = RealPath("\\"), "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 (!dsWith("/")) {
path = path + "/";
}
//realPath = RealPath("\\") + "WEB-INF";
realPath = realPath + path;
realPath = place("\\", "/");
config.setDirectoryForTemplateLoading(new File(realPath));
config.setDefaultEncoding("UTF-8");
config.setObjectWrapper(new DefaultObjectWrapper());
Template template = Template(ftlName + ".ftl", "UTF-8");
//ftl转doc⽂书保存的地址
//String dir = Property("CommonUploadFileUrl");
String dir = Property("CommonUploadFileUrl", new String[0]);
dir = place("\\", "/");
if (dir.lastIndexOf("/") == dir.length() - 1) {
dir = dir + "temp/";
} else {
dir = dir + "/temp/";
}
File folder = new File(dir);
if ((ists()) || (folder.mkdirs())) {
file = new File(folder, docAsName + ".doc");
}
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 = Bean(sql, ZxqyXjrqysqVO.class, id);
return vo;
}
}
接⼝的⽅法就是为了查询出所有使⽤的字段数据,返回的结果就是⼀个VO,VO的作⽤⼤家都很清楚那就是拿来塞值的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论