word模板内容替换

Word模板内容替换

需求介绍

需要对Word文档中的内容做动态替换,其中包括图片、特殊符号,字符串,并且要求样式一直

解决思路

本方案采用spire.doc.free替换word书签的方式,word添加书签

  • 将需要替换的内容加上书签
替换结果

原模板替换后的模板

引入依赖
        <!-- word文档替换依赖 -->
		<dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.doc.free</artifactId>
            <version>3.9.0</version>
        </dependency>

如果使用的是自己的私库,请在pom文件添加下面仓库地址

	<!-- DOC依赖的仓库 -->
	<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>
创建Word文档的工具类

下面就是Word文档替换书签的工具类WordDocument.class

package com.cloud.office.service;

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.Section;
import com.spire.doc.documents.BookmarksNavigator;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.TextBodyPart;
import com.spire.doc.fields.TextRange;
import org.apache.commons.lang.StringUtils;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * <p>
 * word文档
 * </p>
 *
 * @author Administrator
 */
public class WordDocument {
    /**
     * word
     */
    private Document doc = new Document();
    /**
     * 书签
     */
    private BookmarksNavigator bookmarkNavigator;
    /**
     * 字体大小
     */
    public static float FONTSZIE6 = 6.5f;
    /**
     * 字体大小
     */
    public static float FONTSZIE10 = 10.5f;
    /**
     * 字体大小
     */
    public static float FONTSZIE12 = 12f;

    /**
     * 构造函数
     *
     * @param filePath 路径
     */
    public WordDocument(String filePath) {
        this.doc.loadFromFile(filePath);
        bookmarkNavigator = new BookmarksNavigator(doc);
    }

    /**
     * 替换word的文本内容
     *
     * @param bookSign    书签
     * @param replaceText 替换内容
     */
    public WordDocument replaceWordText(@NotBlank String bookSign, String replaceText) {
        return replaceWordText(bookSign, replaceText, false);
    }

    /**
     * 替换word的文本内容
     *
     * @param bookSign       书签
     * @param replaceText    替换内容
     * @param saveFormatting 是否保存格式
     */
    public WordDocument replaceWordText(@NotBlank String bookSign, String replaceText, boolean saveFormatting) {
        if (StringUtils.isBlank(bookSign)) {
            return this;
        }
        if (StringUtils.isBlank(replaceText)) {
            return this;
        }
        //定位书签
        bookmarkNavigator.moveToBookmark(bookSign);
        //用新的内容替换上下文
        bookmarkNavigator.replaceBookmarkContent(replaceText, saveFormatting);
        return this;
    }

    /**
     * 替换word的图片
     *
     * @param bookSign  书签
     * @param imagePath 替换内容
     */
    public WordDocument replaceWordImage(@NotBlank String bookSign, @NotNull String imagePath) {
        if (StringUtils.isBlank(bookSign)) {
            return this;
        }
        if (StringUtils.isBlank(imagePath)) {
            return this;
        }
        //添加图片,替换原有书签内容
        bookmarkNavigator.moveToBookmark(bookSign);
        Paragraph para = new Paragraph(doc);
        para.appendPicture(imagePath);
        TextBodyPart bodyPart = new TextBodyPart(doc);
        bodyPart.getBodyItems().add(para);
        bookmarkNavigator.replaceBookmarkContent(bodyPart);
        return this;
    }

    /**
     * 替换word的特殊符号
     *
     * @param bookSign 书签
     * @param fontSzie 字体大小
     */
    public WordDocument replaceWordCheck(@NotBlank String bookSign, float fontSzie) {
        if (StringUtils.isBlank(bookSign)) {
            return this;
        }
        bookmarkNavigator.moveToBookmark(bookSign);
        // 样式 "\uF052 \uF0FE"   ✓
        Section sec = doc.addSection();

        //在这个section上添加一个段落
        Paragraph para = sec.addParagraph();
        // para.appendText("这是一个打勾的复选框:");

        //在段落之后追加一个打勾的复选框,这个符号的十六进制是"\u0052",
        //也可以用十进制(char)82).ToString()来表示它。 打勾的复选框
        TextRange textRange = para.appendText(String.valueOf(((char) 82)));

        //设置字体,可以在word中查看对应的符号是什么字体,这里打勾的复选框是Wingdings2字体
        textRange.getCharacterFormat().setFontName("Wingdings 2");

        textRange.getCharacterFormat().setFontSize(fontSzie);
        TextBodyPart bodyPart = new TextBodyPart(doc);
        bodyPart.getBodyItems().add(para);
        bookmarkNavigator.replaceBookmarkContent(bodyPart, false, false);
        doc.getSections().remove(sec);
        return this;
    }

    /**
     * 替换word的图片
     *
     * @param filePath 保存路径
     */
    public void saveToFile(@NotBlank String filePath) {
        this.doc.saveToFile(filePath, FileFormat.Docx);
    }
}

查看word文档特殊符号对应的字符代码

字符代码查看步骤

插入–>符号–>其他符号–>选择字体(Wingdings 2)–>选择自己的特殊符号–>字符代码

选择字体(Wingdings 2),选择自己特殊符号所在的字体,如图:

在这里插入图片描述

更多支持在官网e-iceblue-doc官网

首先当然是定义word模板,在需要替换的地方加上标签。 菜单-插入-书签,输入属性名,如year,date,pic1,voList等等。 打印页面: 需要把打印的数据从后台取出,以单个vo(一个对象)为一组,或以voList(对象的列表集合)为一组 组织好页面上 再得到这些数据后进行替换。 数据组织形式如下: <div id="export2word"> <form id="singleVo" name="singleVo"> <textarea name="jcxcrs" style="display:none"><c:out value="${zywstjfxbgVO.jcxcrs }"/></textarea> <textarea name="xcjhl" style="display:none"><c:out value="${zywstjfxbgVO.xcjhl }"/></textarea> <textarea name="tbjcxcrs" style="display:none"><c:out value="${tbjcxcrs }"/></textarea> <textarea name="tptest" style="display:none">../zwgl/zw008-ZwMkjbxxCTRL-showWxytp.png?xh=3041</textarea> </form> <c:forEach var="mxvo" items="${jgList}" varStatus="s"> <form name="mxvoForm"> <!-- 注:这里的宽度设置为表格单元格宽度(厘米*100)--> <textarea name="tbjcmcrs" style="width:349;display:none"><c:out value="${mxvo.tbjcmcrs }"/></textarea> <textarea name="tbjcmcrsbl" style="width:270;display:none"><c:out value="${mxvo.tbjcmcrsbl }"/></textarea> <textarea name="tbjcxcrs" style="width:477;display:none"><c:out value="${mxvo.tbjcxcrs}"/></textarea> <textarea name="tbjcxcrsbl" style="display:none"><c:out value="${mxvo.tbjcxcrsbl }"/></textarea> </form> </c:forEach> </div> 使用: <input type="button" id="select2" name="select2" class="button" value="导出数据" onclick="print2doc();"> <script type="text/javascript" src="../public/scripts/export2word.js"></script> <script type="text/javascript"> function print2doc(){ //参数为模板(与页面的相对)路径 var word = new WordApp("test.doc"); //参数为form名,vo中需要添加的属性(为空时form里所有属性) var vo = word.getSingleVo("singleVo",["jcxcrs","xcjhl","tbjcxcrs"]); //var vo = word.getSingleVo("singleVo"); //组织成的图片vo var tpvo = word.getSingleVo("singleVo",["tptest"]); //参数为 form名,需要添加的属性(顺序为生成表格列的顺序,为空时form里的所有属性和顺序) var voList = word.getVoList("mxvoForm",["tbjcmcrs","tbjcmcrsbl","tbjczsrs"]); //var voList = word.getVoList("mxvoForm"); //替换普通书签 word.replaceBookmarkUsevo(vo); //替换图片书签 word.replaceBookmarkUsepicvo(tpvo); //替换书签jgList,画出表格形成多行数据。 word.replaceBookmarkUsevolist("jgList",voList); //文档可见 word.wordObj.visible=true; //word.closeApp(); } </script> 注意: 替换图片的值需要解释一下: 1.可以设为相对本页面的路径如../zbgl/abc.png 2.如果是输出流,则需要把请求输出流的url映射成以图片格式结尾的。如/.../abc.do?id=123换成/../abc.png?id=123 可以在web.xml里配一个servlet,如以*.png的请求转成.do的。如: public class PngDispatcherServlet extends HttpServlet { private static final long serialVersionUID = 6230740581031996144L; public void init() throws ServletException { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //StringBuffer url = request.getRequestURL(); StringBuffer url = new StringBuffer(request.getRequestURI()); if(request.getQueryString() != null) { url.append('?'); url.append(request.getQueryString()); } String newUrl = url.toString().replaceAll(".png", ".do"); ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(newUrl); //定向的页面 rd.forward(request, response); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值