利用(freemarker模板引擎)实现xml模板生成word文档

模板word

1.先把这个模板word转化为xml(这个太简单就不做介绍了)

2.利用freemarker模板引擎,java代码实现xml转化word

引入依赖

        <dependency>
            <groupId>freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.8</version>
        </dependency>

代码实现

package com.dc.esb.Word;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.util.ResourceUtils;

import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

/**
 * @auther zhanggt
 */
public class XMLtoWord {
    /**
     * 读取文件
     *
     * @param path
     * @return
     * @throws IOException
     */
    private static String ReadFile(String path) throws IOException {
        File file = new File(path);
        FileInputStream fis = null;
        StringBuffer sb = new StringBuffer();
        byte[] bytes = new byte[1024];
        try {
            fis = new FileInputStream(file);
            int len;
            while ((len = fis.read(bytes)) != -1) {
                sb.append(new String(bytes, 0, len, Charset.defaultCharset()));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                fis.close();
            }
        }
        return sb.toString();
    }

    /**
     * 写入文件
     *
     * @param content
     * @param path
     */
    private static void WriteFile(String content, String path) {
        File file = new File(path);
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            fos = new FileOutputStream(file, false);
            bos = new BufferedOutputStream(fos);
            bos.write(content.getBytes(Charset.defaultCharset()));
            bos.flush();
        } catch (FileNotFoundException e) {
            System.err.println("文件写入错误");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                if (bos != null) {
                    bos.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 生成word文件
     * @param tempPath
     * @param tempName
     * @param newWordPath
     * @throws IOException
     * @throws TemplateException
     */
    private static void generateWord(String tempPath, String tempName, String newWordPath) throws IOException, TemplateException {
        Writer outWriter = null;
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding(Charset.defaultCharset().toString());
        try {
            configuration.setDirectoryForTemplateLoading(new File(tempPath));
            Template template = configuration.getTemplate(tempName, Charset.defaultCharset().toString());
            outWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(newWordPath)),Charset.defaultCharset().toString()));
            template.process(new HashMap<String,String>(),outWriter);
        } catch (IOException e) {
            throw e;
        } catch (TemplateException e1) {
            throw e1;
        }finally {
            if(outWriter!=null){
                outWriter.close();
            }
        }
    }
}

测试代码

 public static void main(String[] args) throws Exception {
        String file = ReadFile(new File("").getCanonicalPath()+"//src//main//resources//xmmb.xml");
        file = file.replaceAll("<w:t>Project</w:t>","<w:t>"+"测试项目"+"</w:t>");
        WriteFile(file,new File("").getCanonicalPath()+"//src//main//resources//xmmbtemp.xml");
        generateWord(new File("").getCanonicalPath()+"//src//main//resources//","xmmbtemp.xml",new File("").getCanonicalPath()+"//src//main//resources//结果.doc");
    }

展示结果:(这里我们只改了project)

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现XML填充到Word模板中,可以使用Apache POI和FreeMarker这两个Java库。 下面是一个简单的步骤: 1. 创建Word模板文件并将其保存为XML格式。 2. 使用FreeMarker创建一个XML数据模型,其中包含要填充到Word模板中的数据。 3. 使用Apache POI加载Word模板,并使用FreeMarker将数据填充到模板中。 4. 将填充后的Word文档保存到磁盘上。 以下是示例代码: ```java import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHdrFtrRef; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr; import freemarker.template.Configuration; import freemarker.template.Template; public class WordXml { public static void main(String[] args) throws Exception { // 加载Word模板 XWPFDocument doc = new XWPFDocument(WordXml.class.getClassLoader().getResourceAsStream("template.xml")); CTDocument1 document = doc.getDocument(); // 获取主体内容 CTBody body = document.getBody(); // 获取所有段落 CTP[] paragraphs = body.getPArray(); // 创建FreeMarker配置 Configuration cfg = new Configuration(Configuration.VERSION_2_3_28); cfg.setClassLoaderForTemplateLoading(WordXml.class.getClassLoader(), "templates"); cfg.setDefaultEncoding("UTF-8"); // 加载数据模型 Map<String, Object> model = new HashMap<>(); model.put("name", "Tom"); model.put("age", 18); // 处理所有段落 for (CTP paragraph : paragraphs) { // 获取段落文本 String text = paragraph.newCursor().getTextValue(); // 如果文本中包含FreeMarker标记,则进行替换 if (text.contains("${")) { XmlCursor cursor = paragraph.newCursor(); // 获取文本所在的位置 int pos = cursor.getSelectionStart(); // 清空文本 paragraph.setT(""); // 将FreeMarker标记解析为文本 Template template = cfg.getTemplate("paragraph.ftl"); template.process(model, new XmlObjectWrapper(paragraph)); // 设置光标位置 cursor.toStartDoc(); cursor.toOffset(pos); } } // 保存Word文档 File file = new File("output.docx"); FileOutputStream out = new FileOutputStream(file); doc.write(out); out.close(); } } class XmlObjectWrapper implements freemarker.template.TemplateModel { private XmlObject obj; public XmlObjectWrapper(XmlObject obj) { this.obj = obj; } public void set(String key, Object value) { XmlCursor cursor = obj.newCursor(); cursor.toFirstChild(); cursor.insertElementWithText(key, value.toString()); } } ``` 在上面的示例代码中,我们首先使用XWPFDocument加载Word模板,然后使用FreeMarker创建一个数据模型。接下来,我们使用Apache POI和FreeMarker将数据填充到模板中,并将填充后的Word文档保存到磁盘上。 注意:在示例代码中,我们使用了一个名为“paragraph.ftl”的FreeMarker模板来处理段落文本。这个模板可以根据实际需求进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一人荡江湖@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值