最近因为客户的要求,需要做一个关于项目具体信息导出到word的功能。java处理word已经存在很多种方法了,但是用起来都不是那么方便,而且不太灵活,而使用xml的方法可以做到非常灵活,你可以先建好模板,然后往里面填数,模板怎么建,填出来的效果就是怎么样的。首先说说word和xml的关系,每个word它都对应着一个xml文件,也就是说你修改了xml,对应的word文件也就跟着修改了。通过word的保存功能可以将一个word文件保存为xml文件,该文件虽然是.xml格式的,但是直接双击打开的话还是使用word打开,所以你只能用txt将它打开,用txt打开之后将里面的一句话:<?mso-application progid="Word.Document"?>去掉,然后保存,接着就可以双击直接打开了,这样使用的就是IE打开的,你这样就可以查看里面的节点具体的构造。
最上面的主节点是<w:wordDocument>(如果不是的话,相信你将word文件保存成xml的时候使用的是07word,选择的是:word xml文档(*.xml),你可以选择word 2003 xml文档(*.xml)试试);该主节点下面有大致8个节点,其中我们要操作的就是<w:body>节点,该节点是word的正文节点,其他的节点没有去研究;<w:body>下面包含的节点可能会有:<w:p>段落节点、<w:tbl>表格节点。
接着要做的就是在java程序中,使用dom来解析编辑xml文件,这里贴出一些代码来供大家参考:
public Document loadXML(String filename){//////////加载xml文件
Document document = null;
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
document=builder.parse(new File(filename));
document.normalize();
}catch (Exception ex){
ex.printStackTrace();
}
return document;
}
public boolean doc2XmlFile(Document document,File targetFile){ ///////回写xml文件
boolean flag = true;
try{
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(targetFile.toURI().getPath());
transformer.transform(source, result);
}catch(Exception ex){
flag = false;
ex.printStackTrace();
}
return flag;
}
String void function(){///////////程序入口
String rootPath=ServletActionContext.getServletContext().getRealPath("/excelTemplate")+"\\";
try{
Document document=loadXML(rootPath+"projectModel.xml");
Element root = document.getDocumentElement();
NodeList rootList=root.getChildNodes();
Node bodyNode=null;///////w:body
for(int i=0;i<rootList.getLength();i++){////////找到<w:body>节点
bodyNode=rootList.item(i);
if("w:body".equals(bodyNode.getNodeName())){
break;
}
}
NodeList nodeList=bodyNode.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
Node node=nodeList.item(i);
if("w:tbl".equals(node.getNodeName())){
dealWithTableNode(document,node);
}else if("w:p".equals(node.getNodeName())){
dealWithWPNode(document,node);
}
}
File destFile = File.createTempFile("project", ".xml");
doc2XmlFile(document,destFile);///////回写
inputStream = new FileInputStream(destFile);/////////生成流,用于下载
fileName=URLEncoder.encode(project.getProjectName(),"utf-8")+".doc";
}catch(Exception e){
e.printStackTrace();
}
}
注意:
1、在解析编辑xml文件的时候一定好看好节点的位置,比如一般的文本内容的话可能是在<w:p>节点下的<w:r>节点下的<w:t>里设置,使用的是getTextContent()方法来获取它的内容,setTextContent()来设置它的参数
2、对于图片如何插入呢?首先最好在模板中插入一张图片,主要用于定下图片的那些格式,然后图片必须用java转成base64的字符串,这里也提供一个方法:
private String toBASE64codeFile(File file){
String codeString="";
try{
FileInputStream fis=new FileInputStream(file);
BASE64Encoder encoder=new BASE64Encoder();
byte[] b=new byte[228];
int count=-1,n=0;
while((count=fis.read(b))!=-1){
codeString+=encoder.encode(b);
}
return codeString;
}catch(Exception e){
e.printStackTrace();
return "";
}
}
然后找到<w:pict>节点:一般如果图片是在table里的话,该节点就是在<w:tbl>-<w:tr>-<w:tc>-<w:p>-<w:r>节点下面,不在table里的话就是:<w:p>-<w:r>,建议仿照用IE打开的xml对照一下。然后将该节点下的<w:binData>的内容置成你所要插入的图片的base64码即可。
分享到:
相关推荐
java 实现 word 文档的在线预览,资源包含代码和jar包,下载放入项目既可以使用
Java通过word编辑为xml和ftl格式的模板创建导出word文档。.zip
1.1 文档转换:Word转PDF/图片/XPS/XML/RTF/HTML/TIFF/ 1.2 文档操作:超链接添加、编辑、删除、读取;文档修订、合并、拆分、复制、比较、加密;分页符、分节符;添加、删除、读取内容开年;OLE对象插入、读取;...
将编辑好占位符的文档另存为XML格式Word 2003 XML文档,并重命名,用英文命名 利用文本编辑器打开该XML文件检查,搜索第二步编辑的占位符,遇到$和 { } 分离的情况则进行修改。检查完毕后保存退出。 将检查完成的XML...
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java 来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制...
java利用freemarker生成word文档,可根据需求生成多行数据,压缩包内附freemarker.jar,foxe_CHS.exe(xml编辑器)以及整个生成过程步骤代码
xml编辑器,Java导出Word辅助工具。 Word导出,firstobject + freemarker
先创建一个word文档,按照需求在word中填好一个模板,然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档(这里直接使用eclipse自带的编辑工具),把对应的数据换成变量${xxx},使用Freemarker读取...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
使用方法:将以下代码复制到pom.xml文件中 <groupId>com.aspose</groupId> <artifactId>aspose-words <version>23.6 <scope>system ${basedir}/src/main/resources/lib/words-23.6-jdk17.jar </dependency>
Word从2003开始支持XML格式,用XML+Freemarder还做就很简单了,大致的思路是先用office2003或者2007编辑好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。...
黎明编辑器(LimEditor)是由JAVA语言编写,仿EditorPlus界面,实现了文件的新建、打开、保存、另存为、退出、撤消、重做、设置字体(包括颜色和字号、风格等)、剪切、复制、粘贴、删除、查找(及查找下一个)、替换(替换...
Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法: 可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,...
Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法: 可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,...
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出‘.doc’ word文档。经测试这样方式生成的word文档完全符合office标准,...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
而且, 还可以使用 Java 读取和创建 MS Word 和 MSPowerPoint 文件。Apache POI 提供 Java 操作 Excel 解决方案(适用于 Excel97-2008)。 2 Apache POI的组件 Apache POI包含用于MS-Office的所有OLE2复合文档的类和...
编辑word模板时,${string} 标签最好是手动一次性输入完毕,或者使用记事本统一将整个${string}编辑好之后,粘贴至word里边。 也就是说,不要在word里首先打完 ${ } 之后,又从其它地方把 string 字符串粘贴至 { } ...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...