java poi模板导出word后用微软的word打不开,但是wps可以,跪求大牛解决一下,不胜感激。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java poi模板导出word后用微软的word打不开,但是wps可以,跪求大牛解决一下,不胜感激。相关的知识,希望对你有一定的参考价值。
HttpServletResponse response=ServletActionContext.getResponse(); String fileDir; try fileDir = new File(base.getFile(), "../../../../doc/").getCanonicalPath(); //获取模板文件 File demoFile=new File(fileDir+"/applynetwork.doc"); FileInputStream in = new FileInputStream(demoFile); HWPFDocument hdt = new HWPFDocument(in); //替换读取到的word模板内容的指定字段 Range range = hdt.getRange(); Map<String, String> map = new HashMap<String, String>(); //标题 map.put("$user$", applyNetwork.getApplyuser()); map.put("$tel$", applyNetwork.getTel()); map.put("$applydate$", applyNetwork.getApplydate()); for (Map.Entry<String,String> entry:map.entrySet()) range.replaceText(entry.getKey(),entry.getValue()); //输出word内容文件流,提供下载 response.reset(); response.setContentType("application/x-msdownload"); response.addHeader("Content-Disposition", "attachment; filename=\"applynetwork.doc\""); ByteArrayOutputStream ostream = new ByteArrayOutputStream(); ServletOutputStream servletOS = response.getOutputStream(); hdt.write(ostream); servletOS.write(ostream.toByteArray()); servletOS.flush(); servletOS.close(); catch (IOException e) // TODO Auto-generated catch block e.printStackTrace();
楼主你好,首先你检测一下你的word是否正常,方法是:点开始,再点运行,输入winword /safe(注意,/前面有一个空格),看看是否能打开word,如果可以,那么word是正常的,没有问题。那么楼主打不开word可能是通用模板的问题了,通用模板的具体路径为:C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates,把这个文件夹下的内容全部彻底删除,然后再去打开word,它会自动生成一个默认的通用模板,问题应该就能解决了!追问谢谢您的帮助,但是找不到您说的那个路径啊
参考技术A 微软的Word兼容性不好,其他软件编辑的文档一般打不开。追问谢谢你在百忙之中回答问题,那你您知道怎么改吗,因为我们公司的电脑安装的都是微软的word,所以领导要求必须用微软的word打开。
追答在原软件中打开该文件,再将其复制粘贴在微软的word文档中。
参考技术B 是,一般导出的我也是用wps查看Java按照word模板导出下载文档
在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。
导出Word方式多种多样,通常有以下几种方式:
1. 使用第三方Java工具类库Hutool的Word工具类,参考网址为https://www.hutool.cn/docs/#/poi/Word生成-Word07Writer;
2. 利用Apache POI和FreeMarker模板引擎;
3. 第三方报表工具。
上面的几种方式虽然可以实现Word文档的导出,但有以下缺点:
第一种方式操作简单,但也只能生成简单的Word文档,无法生成有表格的Word文档;
第二种方式可以生成复杂的Word文档,但是还要进行Word转xml,xml转ftl的双重转换,不适合内容经常变更的Word文档;
第三种方式有时候不适合对格式要求严格的文档。
那么,有没有既简单又高效的导出Word的方法呢?答案是肯定有的。接下来我就来介绍一种用Java语言实现的,通过XDocReport和FreeMarker模板引擎生成Word文档的方法。
准备环境
开发语言:Java7及以上的版本。
开发工具:Eclipse/Idea。
第三方依赖库:XDocReport、POI、Freemarker。
模板语言:FreeMarker。
Word编辑器:office2016及其他版本较高的Word编辑器。
这里使用Apache POI和FreeMarker模板引擎的方式:
实例模板:
制作模板
Word模板如上图,可以看到模板内容主要是表格。我们在实际的开发过程中生成的报表几乎都是动态生成的,所以模板中的数字和表格里的数据都要替换成我们后台的实际数据。
替换Word模板中的动态变量,我们需要掌握两个知识点:
1.Word文档中的Word域,word域是引导Word在文档中自动插入文字、图形、页码或其他信息的一组代码。在这里我们可以把Word域理解成标识符,这个标识符表示Word文档中要被替换的内容;
2.FreeMarker模板下的变量表达式,比如用$userName替换Word示例模板中的”七里河管理员”。
了解了以上两个概念后,我们就可以动手编辑Word模板了,步骤如下:
1. 首先在Word模板中选中要替换的文本,在这儿拿标题中的”七里河管理员”为例,然后键盘使用 Ctrl + F9 组合键将其设置为域,此时文本会被""包围,接着鼠标右键选择【编辑域(E)...】:
2. 在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式$userName,点击【确定】按钮:
3、重复步骤2,替换全部内容:
转换文件为FreeMarker模板:
将替换好的文件另存为.xml文件格式:代表登记表.xml,然后修改后缀名为.ftl,即代表登记表.ftl;
编写java代码:
ExportController:
ExportWord:
导出方法中包含的几个方法:
1、配置模板路径
2、获取模板
3、导出word文档到客户端
以上是关于java poi模板导出word后用微软的word打不开,但是wps可以,跪求大牛解决一下,不胜感激。的主要内容,如果未能解决你的问题,请参考以下文章
java用poi导出word文档,我要导出一个表格,表格的单元格中还要有一个表格,请问怎么实现