java 生成 word 文档的多种方法(二)

本文介绍如何使用Freemarker技术生成加密的Word文档,包括制作XML模板、编辑参数及使用Java代码进行文档生成与加密的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章给大家介绍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文档的生成。敬请关注!!!如有疑问,大家留言,一定帮大家及时解决!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值