如果在使用docx4j的过程中有一些效果自己不会写,上网也没搜索到答案,怎么解决呢?
可以把word 2007解压,word 2007解压后是很多xml,docx4j的sample例子上面有解压word的代码,如下:
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import org.apache.commons.io.IOUtils; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.io3.Load3; import org.docx4j.openpackaging.io3.Save; import org.docx4j.openpackaging.io3.stores.UnzippedPartStore; import org.docx4j.openpackaging.io3.stores.ZipPartStore; import org.docx4j.openpackaging.packages.OpcPackage; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; public class Word_解压_Unzip_S3_Test { public static void main(String[] args) throws Exception { Word_解压_Unzip_S3_Test t = new Word_解压_Unzip_S3_Test(); //t.unzipWord("f:/saveFile/temp/test_t.docx","f:/saveFile/temp/Unzip_3"); t.unzipWord("f:/saveFile/temp/img_word.docx","f:/saveFile/temp/Unzip_8"); //t.zipXml("f:/saveFile/temp/Unzip_2", "f:/saveFile/temp/test_t2.docx"); } public void unzipWord(String fileName,String outFilePath) throws Exception { WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(new java.io.File(fileName)); File baseDir = new File(outFilePath); baseDir.mkdir(); UnzippedPartStore ups = new UnzippedPartStore(baseDir); ups.setSourcePartStore(wordMLPackage.getSourcePartStore()); Save saver = new Save(wordMLPackage, ups); saver.save(null); } public void zipXml(String inputfilepath, String outFilePath) throws Exception { System.out.println(inputfilepath); // Load the docx File baseDir = new File(inputfilepath); UnzippedPartStore partLoader = new UnzippedPartStore(baseDir); final Load3 loader = new Load3(partLoader); OpcPackage opc = loader.get(); // Save it zipped ZipPartStore zps = new ZipPartStore(); zps.setSourcePartStore(opc.getSourcePartStore()); Save saver = new Save(opc, zps); FileOutputStream fos = null; try { fos = new FileOutputStream(new File(outFilePath)); saver.save(fos); } catch (FileNotFoundException e) { throw new Docx4JException("Couldn't save " + outFilePath, e); } finally { IOUtils.closeQuietly(fos); } } }
里面的内容为:
和excel 2007解压的内容差不多。
word内容在document.xml,页眉页脚在header.xml和footer.xml中,想要什么效果粗暴点就是把xml内容替换掉,后面会讲到这方面的内容,也可以这样做,先把原word解压一份,在word上面添加自己想要的效果,在解压,对比2份文件对应的xml内容就知道要修改那些类了,如下:
想要好看点就先格式化xml,如下:
图中就是设置页眉底部的边框xml代码部分,位置在p-->ppr->pbdr下面,名字叫between,相应的代码可以这么写:
P p = factory.createP(); PPr pPr = p.getPPr(); if (pPr == null) { pPr = factory.createPPr(); } PBdr pBdr=pPr.getPBdr(); if(pBdr==null){ pBdr=factory.createPPrBasePBdr(); } CTBorder value=new CTBorder(); value.setVal(STBorder.SINGLE); value.setColor("000000"); value.setSpace(new BigInteger("0")); value.setSz(new BigInteger("3")); pBdr.setBetween(value); pPr.setPBdr(pBdr);
setBetween的时候就知道里面是什么类型的变量了,其他的差不多也可以这么做。
在使用docx4j的过程中,有种感觉就是docx4j其实是在拼xml,再压缩为word,有种自己替换变量制作word的冲动,这个想法已经有人写过了,他的做法如下,
1)制作一份模版word,变量名用${}括起来
2)解压word为xml,替换xml内容,再压缩为word
代码如下:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; import org.apache.commons.io.FileUtils; /** * * @author eg */ public class ZipHelper { private static final int BUFFER = 1024; public void zipFolder(String folderToZip, String destZip, boolean includeInitialFolder) throws Exception { zipFolder(new File(folderToZip), new File(destZip), includeInitialFolder); } public void zipFolder(String folderToZip, String destZip) throws Exception { zipFolder(new File(folderToZip), new File(destZip)); } public static void zipFolder(File folderToZip, File destZip) throws Exception { zipFolder(folderToZip, destZip, true); } public static void zipFolder(File folderToZip, File destZip, boolean includeInitialFolder) throws Exception { ZipFolderHelper helper = new ZipFolderHelper(); helper.setIncludeInitialFolder(includeInitialFolder); helper.process(folderToZip, destZip); } public static void unzip(String inFile, String outFolder) throws IOException { unzip(new File(inFile), new File(outFolder)); } /** * @param zipFile * @param dest */ public static void unzip(File in, File dest) throws ZipException, IOException { FileUtils.deleteDirectory(dest); ZipFile zipFile = new ZipFile(in); Enumeration<?> files = zipFile.entries(); File f = null; FileOutputStream fos = null; while (files.hasMoreElements()) { try { ZipEntry entry = (ZipEntry) files.nextElement(); InputStream eis = zipFile.getInputStream(entry); byte[] buffer = new byte[BUFFER]; int bytesRead = 0; f = new File(dest.getAbsolutePath() + File.separator + entry.getName()); if (entry.isDirectory()) { f.mkdirs(); continue; } else { f.getParentFile().mkdirs(); f.createNewFile(); } fos = new FileOutputStream(f); while ((bytesRead = eis.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { // ignore } } } } } }
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * * @author eg */ class ZipFolderHelper { private boolean includeInitialFolder; public ZipFolderHelper() { } public void setIncludeInitialFolder(boolean includeInitialFolder) { this.includeInitialFolder = includeInitialFolder; } public void process(File folderToZip, File destZip) throws Exception { if (destZip.exists()) { destZip.delete(); } ZipOutputStream zip = null; FileOutputStream fileWriter = null; fileWriter = new FileOutputStream(destZip); zip = new ZipOutputStream(fileWriter); addFolderToZip("", folderToZip.getPath(), zip); zip.flush(); zip.close(); } private void addFileToZip(String path, String srcFile, ZipOutputStream zip) throws Exception { File folder = new File(srcFile); if (folder.isDirectory()) { addFolderToZip(path, srcFile, zip); } else { FileInputStream in = null; try { byte[] buf = new byte[1024]; int len; in = new FileInputStream(srcFile); String zeName = path + "/" + folder.getName(); if (!includeInitialFolder) { int idx = zeName.indexOf("/"); zeName = zeName.substring(idx + 1); } zip.putNextEntry(new ZipEntry(zeName)); while ((len = in.read(buf)) > 0) { zip.write(buf, 0, len); } } finally { if (in != null) { in.close(); } } } } private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception { File folder = new File(srcFolder); for (String fileName : folder.list()) { if (path.equals("")) { addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip); } else { addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip); } } } }
package com.test; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; /** * * @author eg */ public class DocxTemplater { private File unzipFolder; private File contentXmlFile; private String placeholderBefore = "${"; private String placeholderAfter = "}"; private static final String PATH_TO_CONTENT = "word/document.xml"; public DocxTemplater(String pathToDocx, String before, String after) { this(new File(pathToDocx), before, after); } public DocxTemplater(String pathToDocx) { this(new File(pathToDocx)); } public DocxTemplater() { } public DocxTemplater(File unzipFolder) { this.unzipFolder = unzipFolder; } public DocxTemplater(File unzipFolder, String before, String after) { this.unzipFolder = unzipFolder; this.placeholderBefore = before; this.placeholderAfter = after; } public void process(String destDocx, Map<String, Object> params) { process(new File(destDocx), params); } private void setup(File destDocx) throws IOException { ZipHelper.unzip(destDocx, unzipFolder); contentXmlFile = new File(unzipFolder, PATH_TO_CONTENT); } public void process(File destDocx, Map<String, Object> params) { try { setup(destDocx); if (!unzipFolder.exists()) { unzipFolder.mkdir(); } if (!contentXmlFile.exists()) { throw new FileNotFoundException( contentXmlFile.getAbsolutePath()); } String template = FileUtils.readFileToString(contentXmlFile, "UTF-8"); for (Map.Entry<String, Object> entry : params.entrySet()) { template = StringUtils.replace(template, placeholderBefore + entry.getKey() + placeholderAfter, String.valueOf(entry.getValue())); } String destDocxString = destDocx.getPath(); String noExtPathString = destDocxString.substring(0, destDocxString.lastIndexOf(".")) + "_bak"; File noExtPath = new File(noExtPathString); destDocx.delete(); FileUtils.deleteDirectory(noExtPath); FileUtils.copyDirectory(unzipFolder, noExtPath); FileUtils.writeStringToFile(new File(noExtPath, PATH_TO_CONTENT), template, "UTF-8"); ZipHelper.zipFolder(noExtPath, destDocx, false); FileUtils.deleteDirectory(noExtPath); } catch (Exception e) { throw new RuntimeException(e); } } }
package com.test; import java.io.File; import java.util.HashMap; //例子来自Github,原地址忘了,代码被我改过一部分 public class DocxTemplater_Test { public static void main(String[] args) { DocxTemplater templater = new DocxTemplater("f:/saveFile/temp/test_c"); File f = new File( "f:/saveFile/temp/doc_template.docx"); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("TITLE", "这是替换后的文档"); map.put("XUHAO", "1"); map.put("NAME", "梅花"); map.put("NAME2", "杏花"); map.put("WORD", "问世间情为何物"); map.put("DATA", "2014-9-28"); map.put("BOSS", "Github"); templater.process(f, map); } }
效果如下:
缺点:页眉页尾没替换,除非自己替换header.xml和footer.xml中的变量,对表格无效,想要替换变量制作表格,可以搜索下iteye的博文,以前有哥们写过,其实就是拿到table,然后自己往里面塞数据。
全文完。
相关推荐
今天,我们将详细介绍如何使用docx4j操作Word文档。 1. Docx4j介绍 docx4j是一个开源的Java类库,官方主页为http://www.docx4java.org/trac/docx4j。该类库提供了创建、读取和操作Word文档的功能,支持Word 2007...
使用docx4J技术操作word的读写,使用docx4J技术操作word的读写,
下面是一个简单的示例,演示如何使用`docx4j`根据书签替换Word文档中的内容。首先,你需要在你的项目中引入`docx4j`库,可以通过Maven或者Gradle等构建工具添加依赖。 ```xml <groupId>org.docx4j <artifactId>...
2. **创建新文档**:使用`org.docx4j.jaxb.Context`类初始化上下文,然后通过`org.docx4j.Docx4J.createDocument()`方法创建一个新的Word文档。 3. **操作文档内容**:可以使用`org.docx4j.model.content.Body`和`...
最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用docx4j生成word文档。里面包括完整代码和所需jar包。
本文将深入探讨如何使用docx4j来操作Word 2007(即.docx)文件,以及这个过程中的关键知识点。 1. **docx4j简介** docx4j是一个开源项目,其目标是提供一套强大的API,用于处理Open XML文档。它支持读取、写入和...
最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master...
4. **执行转换**:然后,使用`Docx4J`提供的方法将Word文档转换为PDF。 ```java OutputStream os = new FileOutputStream("path_to_output_pdf.pdf"); PdfWriterHelper.write(wordMLPackage, os); os.close(); ``` ...
- 在使用docx4j时,确保你的项目已经正确地添加了所有必要的jar包,包括docx4j的主库和任何额外的转换模块。 - 由于docx4j依赖于OpenJDK的JavaFX库来进行PDF和HTML的生成,所以你需要确认Java环境配置正确且包含这些...
html模板填充生成pdf和word
《docx4j 动态生成表格(一)》这篇博文主要探讨了如何使用docx4j库在Java环境中动态创建Word文档中的表格。docx4j是一个强大的开源Java库,它允许开发者对OpenXML格式(如.docx、.xlsx等)进行深度操作,包括创建、...
总之,docx4j是一个强大且灵活的工具,能够帮助开发者高效地处理`.docx`文档,无论是简单的文本替换还是复杂的文档操作,都能轻松应对。通过深入理解和熟练使用docx4j,可以大大提升文档处理的自动化水平,降低手动...
用docx4j,jar出去word书签,在word书签中插入文本 源码可以通过以下链接查看: https://github.com/xulp-mzl/xlp-core https://github.com/xulp-mzl/xlp-third ...实例: public static void main(String[] args) ...
以下是一个简单的示例,演示如何使用docx4j在现有Word文档中添加文本: ```java import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML....
使用docx4j时,开发者可以通过创建和操作`org.docx4j.model`包下的对象来构建或修改文档内容。例如,可以使用`WordprocessingMLPackage`来处理.docx文件,`MainDocumentPart`来获取或设置文档的主要内容,`Paragraph...
5. **测试和示例**:压缩包中可能还包括了测试用例和示例代码,帮助开发者理解和使用docx4j,例如`docx4j-samples.jar`。 在实际开发中,将这些jar包添加到项目的类路径(classpath)是至关重要的,这样才能确保...
《docx4j-3.3.3:Java处理Word文档的强大工具》 在Java开发中,处理Microsoft Office格式的文档是一项常见的需求,尤其是docx格式。为了方便开发者,一个名为docx4j的开源库应运而生,它允许程序员以编程方式创建、...
《docx4j及其依赖的jar包:实现高效文档处理》 在信息技术领域,文档处理是日常工作中不可或缺的一部分。docx4j是一个强大的Java库,专门用于处理Microsoft Office Open XML (OOXML)格式的文件,如.docx和.xlsx。这...
赠送jar包:docx4j-3.3.5.jar; 赠送原API文档:docx4j-3.3.5-javadoc.jar; 赠送源代码:docx4j-3.3.5-sources.jar; 赠送Maven依赖信息文件:docx4j-3.3.5.pom; 包含翻译后的API文档:docx4j-3.3.5-javadoc-API...