续上一期的更新内容 ,导出的是单张图片,直接在路径的src 里面填写对应的占位符,就可以了,随着需求的变化,那么今天我们继续往下写一个循环导出多张图片到word里面。
使用FreeMarker导出word文档(支持导出单张图片)
首先我们需要进行在word 里面把对应的模版设置好。
设置好点击另存为,目前我用的html 格式的,网上也有很多xml 形式的,每种写法还不一样
接着我们用记事本进行打开,第一步一定要先修改编码格式为utf-8的
然后我们将html 中head中的标签全部,如果编码不修改,head标签不删除,将来导出的时候就是乱码,这个坑是很深的,排查了好长时间才解决。
这些都修改好后,我们点击另存为将这个模版改成后缀为ftl形式的
接下来我们就开始编写代码
@Override
public void exporttdYsdWord(HttpServletRequest request,
HttpServletResponse response, String objId, String gllx) {
List<Map<String, String>> list = null;
List<Map<String, String>> list3 = null;
List<Map<String, String>> list5 = null;
String ysdName = "";
String ysdSql = "";
String zpSql = "";
String sdsgfa = "";
String ysgjjd = "";
String sdsgfaEname = "";
if ("0".equals(gllx)) {
sdsgfa = "sdsgfa";
ysgjjd = "ysgjjd";
sdsgfaEname = "sczbjys_sczbjys_sdsgfa";
ysdName = "中间环节验收报告";
ysdSql = "select t.gcmc,t.jgdw,t.jgdwfzr,t.jgdwfzrdh,"
+ "t.tdsgdw,t.tdsgdwlxr,t.tdsgdwlxrdh,to_char(t.sqyssj,'yyyy-MM-dd') sqyssj,"
+ "t.czwt, (select a.username from gw_yhgl_user a where a.id = t.yxbzrm) yxbzrm, (select h.value from gw_limit_enums h where h.enumName like '%sczbjys_sczbjys_yxbz%' and h.key = t.yxbz) yxbz,(select t.value from gw_limit_enums t where t.enumName like '%sczbjys_sczbjys_ysgjjd%' and t.key=ysgjjd) ysgjjd from GW_SCZBJYS_ZLC t where t.OBJ_ID = ?";
}
list = this.hibernateDao
.queryForListWithSql(ysdSql,new String[]{objId});
Map<String, String> map0 = new HashMap<String, String>();
Map<String, Object> map = new HashMap<String, Object>();
StringBuilder sb = new StringBuilder();
String aa="";
zpSql="select t.ipath ,t.dpt from gw_pig_address_rw t where t.taskid=? and t.ipath is not null and t.dpt='问题照片' and t.dpt is not null and t.ipath not like '%dat%'" ;
list3 = this.hibernateDao
.queryForListWithSql(zpSql,new String[]{objId});
String zpSqla="select t.ipath ,t.dpt from gw_pig_address_rw t where t.taskid=? and t.ipath is not null and t.dpt is not null and t.ipath not like '%dat%'" ;
list5 = this.hibernateDao
.queryForListWithSql(zpSqla,new String[]{objId});
if(list3.size()>0){
for (Map<String, String> stringObjectMap : list3) {
if (stringObjectMap.get("DPT").equals("问题照片")) {
// map.put("PSZP", "" + PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH"));
// aa= String.valueOf(sb.append(PlatformConfigUtil.getString("TASK_PIC_ADDRESS")+ stringObjectMap.get("IPATH")).append(","));
// aa= String.valueOf(sb.append(" <img width=249 height=273\" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")).append(">").append(","));
aa= String.valueOf(sb.append("<img width=\"249\" height=\"273\" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")+"\">").append(","));
}
}
}else{
for (Map<String, String> stringObjectMap : list5) {
if (!stringObjectMap.get("DPT").equals("问题照片")) {
// map.put("PSZP", "" + PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH"));
// aa= String.valueOf(sb.append(PlatformConfigUtil.getString("TASK_PIC_ADDRESS")+ stringObjectMap.get("IPATH")).append(","));
String hh="<img width=\"249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802155008.jpg\",<img width=\"249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802154952.jpg\"";
aa= String.valueOf(sb.append("<img width=\"249\" height=\"273\" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")+"\">").append(","));
}
}
}
if(aa.length()>0){
String a1 = aa.substring(0, aa.length() - 1);
map.put("PSZP", a1);
}else{
if(aa.length()>0){
String a1 = aa.substring(0, aa.length() - 1);
map.put("PSZP", a1);
}else{
map.put("PSZP", "");
}
}
if (!Tool.isEmptyList(list)) {
map0 = list.get(0);
if (Tool.isEmptyStr(map0.get("gcmc"))) {
map.put("GCMC", "");
} else {
map.put("GCMC", map0.get("gcmc"));
}
if (Tool.isEmptyStr(map0.get("jgdw"))) {
map.put("JGDW", "");
} else {
map.put("JGDW",
getEnumsValueFromEnumDB("sczbjys_sczbjys_jgdw",map0.get("jgdw")));
}
if (Tool.isEmptyStr(map0.get("tdsgdw"))) {
map.put("TDSGDW", "");
} else {
map.put("TDSGDW", map0.get("tdsgdw"));
}
if (Tool.isEmptyStr(map0.get("tdsgdwlxr"))) {
map.put("TDSGDWLXR", "");
} else {
map.put("TDSGDWLXR", map0.get("tdsgdwlxr"));
}
if (Tool.isEmptyStr(map0.get("tdsgdwlxrdh"))) {
map.put("TDSGDWLXRDH", "");
} else {
map.put("TDSGDWLXRDH", map0.get("tdsgdwlxrdh"));
}
if (Tool.isEmptyStr(map0.get("yxbz"))) {
map.put("YXBZ", "");
} else {
map.put("YXBZ", map0.get("yxbz"));
}
if (Tool.isEmptyStr(map0.get("yxbzrm"))) {
map.put("YXBZRM", "");
} else {
map.put("YXBZRM", map0.get("yxbzrm"));
}
if (Tool.isEmptyStr(map0.get("ysgjjd"))) {
map.put("YSGJJD", "");
} else {
map.put("YSGJJD", map0.get("ysgjjd"));
}
if (Tool.isEmptyStr(map0.get("sqyssj"))) {
map.put("SQYSSJ", "");
} else {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String string = map0.get("sqyssj");
Date parse = null;
try {
parse = simpleDateFormat.parse(string);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String format = simpleDateFormat.format(parse);
StringBuilder myName = new StringBuilder(format);
myName.setCharAt(4, '年');
myName.setCharAt(7, '月');
myName.append("日");
System.out.println(myName);
// 时间变成 年月日形式
map.put("SQYSSJ", myName.toString());
}
if (Tool.isEmptyStr(map0.get("czwt"))) {
map.put("CZWT", "");
} else {
map.put("CZWT", map0.get("czwt"));
}
map.put("SJDW", "设计单位");
map.put("JLDW", "监理");
map.put("BD", "121");
map.put("SDJG", "结构好");
map.put("CD", "长度1");
map.put("JCJ", "井口1");
String hh="<img width=\"249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802155008.jpg\",<img width=\"249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802154952.jpg\"";
map.put("TFT", "");
// map.put("PSZP", hh);
// map.put("YSGJJD", "飒飒");
} else {
map.put("SJDW", "");
map.put("JLDW", "");
map.put("BD", "");
map.put("SDJG", "");
map.put("CD", "");
map.put("JCJ", "");
map.put("TFT", "");
}
try {
WordUtils.exportWorde(request, response, map, "scbzjystd.ftl",
ysdName);
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
}
图片的格式高宽度提前在代码里面设置好,然后我们在模版里面用一个占位符来进行替代就可以了。
设置下载格式
public static void exportWorde(HttpServletRequest request,
HttpServletResponse response, Map<String, Object> map,
String templateName, String fileName) throws IOException {
String pathString = request.getSession().getServletContext().getRealPath("/WEB-INF/templete/");
logger.info("获取到的模板路径是:templetePath------->" + pathString);
configuration.setDirectoryForTemplateLoading(new File(pathString));
Template freemarkerTemplate = configuration.getTemplate(templateName);
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类的createDoc方法生成Word文档
file = createDoce(map,freemarkerTemplate);
fin = new FileInputStream(file);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
fileName = fileName + DateUtil.currentDateToString() + ".doc";
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
out = response.getOutputStream();
byte[] buffer = new byte[512]; // 缓冲区
int bytesToRead = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} finally {
if(fin != null) fin.close();
if(out != null) out.close();
if(file != null) file.delete(); // 删除临时文件
}
}
设置编码:
private static File createDoce(Map<String, Object> dataMap, Template template) {
String name = ".doc";
File f = new File(name);
Template t = template;
try {
// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
t.process(dataMap, w);
w.close();
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return f;
}
导出效果
若本文对你有所帮助,请一键三连,说不定后期工作中就用到了。