这篇文章给大家介绍docx 格式的word 文档,即加密的word文档。它是采用原生的xml模版,生成word文档,此word 文档的格式是offi2007以上版本。
一、首先制作生成模版,先本地新建一个docx格式的word文档,然后把 .docx改成 .zip ,如图所示:
二、双击zip文件,出现下图所示;然后单击word文件夹,找到document.xml 文件,复制出来。这就是原生的xml模板,打开此xml文件,编辑里面的参数,参数编写和上一篇文章一样,可以参考一下
模板微调后举例如下:
三、下面给大家上测试代码,如下:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* @author:
* @version:
* @Date: Created in 2018年11月30日
*
*/
public class BoKeWordDocx {
public static void main(String[] args) throws Exception {
freemarkerDocxTest( );
}
public static String freemarkerDocxTest( ) throws Exception{
Configuration configuration = new Configuration();
//data.xml的生成路径
String fileDirectory = "E://template/";
configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
Template template = configuration.getTemplate("document.xml");
Map<String,String> dataMap = new HashMap<>();
dataMap.put("fullName"," 南道");
dataMap.put("number","20");
dataMap.put("language","java,php");
dataMap.put("example","Hello World!");
/** 指定输出word文件的路径 **/
String outFilePath = "E://template/data.xml";
File docFile = new File(outFilePath);
FileOutputStream fos = new FileOutputStream(docFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos);
Writer out = new BufferedWriter(new OutputStreamWriter(fos),10240);
template.process(dataMap,out);
if(out != null){
out.close();
}
//以下代码 主要用来加密已经生成的xml文件,把xml文件正式转换成加密的word文档
// 包装输入流
ZipInputStream zipInputStream = wrapZipInputStream(new FileInputStream(new File("E://template/default.zip")));
//包装输出流
ZipOutputStream zipOutputStream = wrapZipOutputStream(new FileOutputStream(new File("E://template/default.docx")));
String itemname = "word/document.xml";
//正式加密替换成docx格式文档
replaceItem(zipInputStream, zipOutputStream, itemname, new FileInputStream(new File("E://template/data.xml")));
System.out.println("加密成功!");
return null;
}
public static ZipInputStream wrapZipInputStream(InputStream inputStream){
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
return zipInputStream;
}
public static ZipOutputStream wrapZipOutputStream(OutputStream outputStream){
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
return zipOutputStream;
}
public static void replaceItem(ZipInputStream zipInputStream,ZipOutputStream zipOutputStream, String itemName,InputStream itemInputStream){
if(null == zipInputStream){return;}
if(null == zipOutputStream){return;}
if(null == itemName){return;}
if(null == itemInputStream){return;}
ZipEntry entryIn;
try {
while((entryIn = zipInputStream.getNextEntry())!=null){
String entryName = entryIn.getName();
ZipEntry entryOut = new ZipEntry(entryName);
// 只使用 name
zipOutputStream.putNextEntry(entryOut);
// 缓冲区
byte [] buf = new byte[8*1024];
int len;
if(entryName.equals(itemName)){
// 使用替换流
while((len = (itemInputStream.read(buf))) > 0) {
zipOutputStream.write(buf, 0, len);
}
} else {
// 输出普通Zip流
while((len = (zipInputStream.read(buf))) > 0) {
zipOutputStream.write(buf, 0, len);
}
}
// 关闭此 entry
zipOutputStream.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//e.printStackTrace();
close(itemInputStream);
close(zipInputStream);
close(zipOutputStream);
}
}
private static void close(InputStream inputStream){
if (null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void close(OutputStream outputStream){
if (null != outputStream){
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四、此代码亲测有效,加密方法是我在网上找的,微调了一下,可以用。再此基础上大家可以继续优化。怎样证明此文档是加密的呢?用notepad 打开如下图所示:
五、次加密文档适用于offic2007以上版本。大家应该注意到生成此文档的技术依然是当前流行的freemarker技术,下篇文章我们将介绍用POI技术实现word文档的生成。敬请关注!!!如有疑问,大家留言,一定帮大家及时解决!