`
53873039oycg
  • 浏览: 841790 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]使用docx4j制作简单的word(2007)小结

 
阅读更多

         如果在使用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,然后自己往里面塞数据
     全文完
 

 

  • 大小: 227.1 KB
  • 大小: 189.8 KB
  • 大小: 23.4 KB
  • 大小: 27.5 KB
  • 大小: 32.7 KB
  • 大小: 33 KB
0
0
分享到:
评论

相关推荐

    docx4j操作word

    今天,我们将详细介绍如何使用docx4j操作Word文档。 1. Docx4j介绍 docx4j是一个开源的Java类库,官方主页为http://www.docx4java.org/trac/docx4j。该类库提供了创建、读取和操作Word文档的功能,支持Word 2007...

    使用docx4j 技术操作word的读写

    使用docx4J技术操作word的读写,使用docx4J技术操作word的读写,

    Docx4j office word java

    2. **创建新文档**:使用`org.docx4j.jaxb.Context`类初始化上下文,然后通过`org.docx4j.Docx4J.createDocument()`方法创建一个新的Word文档。 3. **操作文档内容**:可以使用`org.docx4j.model.content.Body`和`...

    docx4j生成word文档

    最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用docx4j生成word文档。里面包括完整代码和所需jar包。

    docx4j操作word2007

    本文将深入探讨如何使用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最新 docx4j-master...

    利用docx4j实现docx转pdf

    4. **执行转换**:然后,使用`Docx4J`提供的方法将Word文档转换为PDF。 ```java OutputStream os = new FileOutputStream("path_to_output_pdf.pdf"); PdfWriterHelper.write(wordMLPackage, os); os.close(); ``` ...

    使用docx4j+docx4j-ImportXHTML实现将html转成word

    html模板填充生成pdf和word

    docx4j及其依赖包

    总之,docx4j是一个强大且灵活的工具,能够帮助开发者高效地处理`.docx`文档,无论是简单的文本替换还是复杂的文档操作,都能轻松应对。通过深入理解和熟练使用docx4j,可以大大提升文档处理的自动化水平,降低手动...

    docx4j项目(javadoc文档、源码及示例)

    以下是一个简单的示例,演示如何使用docx4j在现有Word文档中添加文本: ```java import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML....

    docx4j相关jar包

    5. **测试和示例**:压缩包中可能还包括了测试用例和示例代码,帮助开发者理解和使用docx4j,例如`docx4j-samples.jar`。 在实际开发中,将这些jar包添加到项目的类路径(classpath)是至关重要的,这样才能确保...

    docx4j-3.3.3.zip

    《docx4j-3.3.3:Java处理Word文档的强大工具》 在Java开发中,处理Microsoft Office格式的文档是一项常见的需求,尤其是docx格式。为了方便开发者,一个名为docx4j的开源库应运而生,它允许程序员以编程方式创建、...

    Java结合docx4j生成docx文件

    本篇文章将深入探讨如何使用Java结合docx4j库来创建和操作Microsoft Word的.docx文件。docx4j是一个强大的开源Java库,专门用于读写Open XML格式的文档,包括.docx、.xlsx和.pptx等。 首先,我们来看docx4j的基本...

    docx4j-3.3.5-API文档-中英对照版.zip

    赠送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...

    docx4j-3.3.5-API文档-中文版.zip

    赠送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...

    Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目

    Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目,其主要针对WordXML 同时也可以处理Excel和PPT,比POI要强大很多 . Docx4J基于开源协议ASLv2。 ASL是一个广泛适用于社区开源软件并被开源业界所认可的...

    使用docx4j将图片签名插入到word中书签位置

    压缩包里包含了必要的docx4j.jar、commons-io-1.4.jar、slf4j-api-1.7.17.jar、freemrkker.jar等架包,导入到到项目后重新build path,然后运行InsertPicture.java文件,(ps:文件的参数替换成自己本地的),便可以...

    使用docx4j编程创建复杂的.docx格式的word文档

    这篇博客文章“使用docx4j编程创建复杂的.docx格式的word文档”提供了关于如何使用这个库的详细指南。 docx4j是一个开源项目,它的主要优点在于提供了一套丰富的API,用于操作文档的内容、样式、表格、图表、图片等...

    docx4j 替换文本

    下面是一个简单的示例代码,展示了如何使用docx4j替换文档中的文本: ```java import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.replace.ContentFinder; import org.docx4j....

    docx4j word转pdf

    标题中的"docx4j word转pdf"是指使用docx4j库将Microsoft Word的.docx格式文档转换为PDF格式。docx4j是一个开源Java库,专门用于处理OpenXML格式,如.docx、.pptx和.xlsx。这个库提供了丰富的API,允许开发者在程序...

Global site tag (gtag.js) - Google Analytics