精华内容
下载资源
问答
  • word模板内容替换

    2021-05-24 16:32:19
    需要对Word文档中的内容做动态替换,其中包括图片、特殊符号,字符串,并且要求样式一直 解决思路 本方案采用spire.doc.free替换word书签的方式,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官网

    展开全文
  • thinkphp按照模板样式替换内容导出word 场景:有一个模板文件,我们需要从后台导出一个结构和这个模板一模一样的word文档,只是每次导出word文档里的内容不一样。比如导出不同客户的承诺书时,不同的客户姓名,...

    thinkphp按照模板样式替换内容导出word

    场景:有一个模板文件,我们需要从后台导出一个结构和这个模板一模一样的word文档,只是每次导出word文档里的内容不一样。比如导出不同客户的承诺书时,不同的客户姓名,身份证号码等信息都不一样。这里我是用phpword实现的,过程如下。

    一、先创建好word模板文件,格式为docx。如下图为模板文件。${name}为每次导出要替换的变量。将模板文件上传到“http://www.xxx.com/file/”目录下面。
    在这里插入图片描述
    二、利用composer安装phpword,在网站根目录下面运行命令“composer require phpoffice/phpword”,运行结束后,在“www.XXX.com/vendor/”目录下面就会生成一个文件夹“phpoffice”,里面包含“phpword”文件夹。

    三、php代码。

    <?php
    namespace app\admin\controller;
    use think\Controller;
    use PhpOffice\PhpWord\PhpWord;
    
    class Contract extends Controller{
        public function downword(){
            vendor('autoload.php');//注意引入"www.XXX.com/vendor/"下的这个文件
            $tmp=new \PhpOffice\PhpWord\TemplateProcessor('http://www.xxx.com/file/承诺书.docx');//打开模板文件
            // 给模板中的变量赋值
            $tmp->setValue('name','凌云鹤YK');
            $tmp->setValue('id_card','530125199912313126');
            $tmp->setValue('time_min','2019年10月15日');
            $tmp->setValue('address','云南省昆明市官渡区');
            $tmp->setValue('time_max','2019年10月15日');
            $tmp->saveAs("doc/凌云鹤YK承诺书.docx");//将文件保存到public下的doc文件夹下面
        }
    }
    

    最后生成新的word文档如下图:
    在这里插入图片描述
    模板文件下载地址“https://download.csdn.net/download/weixin_43687896/12075093

    展开全文
  • 最近多了一个需求,需要对word模板内容进行替换,一开始用的是word03版的,替换起来比较简单,主要是range对像替换非常方便,而且可以保留替换前的字体样式。 1 InputStream is = new FileInputStream(srcFath); ...

    最近多了一个需求,需要对word模板内容进行替换,一开始用的是word03版的,替换起来比较简单,主要是range对像替换非常方便,而且可以保留替换前的字体样式。

    1  InputStream is = new FileInputStream(srcFath);
    2  OutputStream os = new FileOutputStream(tempFile); 
    3  XWPFDocument doc = new XWPFDocument(is);
    4  Range range = doc.getRange(); 
    5  range.replaceText("${name}","aaa");
    6  doc.write(os); 
    7  is.close(); 
    8  os.flush(); 
    9  os.close();

    最后看到word里包含了图片,需要同时保存一张png图片,对于jpg的图片是可以的,但是png的显示不出来,改为操作2007的文档,07版的没有了Range,使用XWPFParagraph和XWPFRun来操作。XWPFParagraph表示段落,有的word里有表格内容,需要使用XWPFTable来处理,与段落区分开来处理。

     private  void replaceText(XWPFDocument doc, Map<String, Object> params) {  
              Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();  
              XWPFParagraph para;  
              while (iterator.hasNext()) {  
                 para = iterator.next();  
                 this.replaceInPara(para, params);  
              }  
           }  
        private  void replaceText(XWPFParagraph para, Map<String, Object> params) {  
              List<XWPFRun> runs;  
              Matcher matcher;  
              if (matcher(para.getParagraphText()).find()) {  
                 runs = para.getRuns();  
                 for (int i=0; i<runs.size(); i++) {  
                    XWPFRun run = runs.get(i);  
                    String runText = run.toString();  
                    matcher = matcher(runText);  
                    if (matcher.find()) {  
                        while ((matcher = matcher(runText)).find()) {  
                           runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));  
                        }    
                        para.removeRun(i);  
                        //重新插入run里内容格式可能与原来模板的格式不一致
                        para.insertNewRun(i).setText(runText);
                    }  
                 }  
              }  
           } 
        

      private Matcher matcher(String str) {
        Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        return matcher;
      }

     

    再次处理替换内容的格式问题,通过一个临时文件先保存替换模板变量后的文件,在与之前模板文档一起通过正则匹配出变量位置,由于替换变量时先删除再插入,所以位置是一致的。

    private  void setStyle(XWPFDocument doc,XWPFDocument tempdoc, Map<String, Object> params) {  
              Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();  
              Iterator<XWPFParagraph> iterator2 = tempdoc.getParagraphsIterator();  
              XWPFParagraph para ;  
              XWPFParagraph para2;  
              while (iterator.hasNext()) {  
                 para = iterator.next();  
                 para2 = iterator2.next();  
                 this.styleInPara(para,para2, params);  
              }  
           }  
        private  void setStyle(XWPFParagraph para, XWPFParagraph para2,Map<String, Object> params) {  
              List<XWPFRun> runs;  
              List<XWPFRun> runs2;  
              Matcher matcher;  
              if (matcher(para.getParagraphText()).find()) {  
                 runs = para.getRuns();  
                 runs2 = para2.getRuns();  
                 for (int i=0; i<runs.size(); i++) {  
                    XWPFRun run = runs.get(i);  
                    XWPFRun run2 = runs2.get(i);  
                    String runText = run.toString();  
                    matcher = matcher(runText);  
                    if (matcher.find()) { 
                        //按模板文件格式设置格式
                        run2.getCTR().setRPr(run.getCTR().getRPr());
                    }  
                 }  
              }  
           }  

    按照原模板格式设置好替换后格式后显示正常。

    ps:XWPFRun表示有相同属性的一段文本,所以模板里变量内容需要从左到右的顺序写,${userName},如果先写${},再添加内容,会拆分成几部分,不能正常使用

     

    转载于:https://www.cnblogs.com/homeSicker/p/7728854.html

    展开全文
  • 最近有个项目,需要替换Word模板,由于想不依赖于服务器是否安装了office,所以采用了NPOI 之前做替换,由于不涉及样式,或者是没有特殊的样式,所以直接就用XWPFParagraph对象中的ParagraphText属性直接替换文本...

    最近有个项目,需要替换Word的模板,由于想不依赖于服务器是否安装了office,所以采用了NPOI

    之前做替换,由于不涉及样式,或者是没有特殊的样式,所以直接就用XWPFParagraph对象中的ParagraphText属性直接替换文本内容,如下面代码,但是这样替换会产生一个问题,就是将原有的样式都丢失了。

                       foreach (var para in doc.Paragraphs)
                        {
                            string oldtext = para.ParagraphText;

                            if (oldtext == "")

                                continue;

                            string temptext = para.ParagraphText;

                            if (temptext.Contains("qShareofTransfer2"))
                               temptext = temptext.Replace("qShareofTransfer2", dr[0]["qShareofTransfer"].ToString());
                            
                            para.ReplaceText(oldtext, temptext);    

                        }

    为了解决这个问题,在Debug过程中发现NPOI中读取文档的样式是存放在Runs里的,而且Runs里带有Word的格式,而且的Runs的Text也可以替换,于是就改成了从Runs里替换,不说了上代码

        

                        foreach (var para in doc.Paragraphs)
                        {
                            string oldtext = para.ParagraphText;

                            if (oldtext == "")

                                continue;

                            string temptext = para.ParagraphText;

                             if (para.Runs.Any())
                            {
                                foreach (var r in para.Runs)
                                {
                                    if (r.Text.Contains("qShareofTransfer2"))
                                    {
                                        r.ReplaceText("qShareofTransfer2", dr[0]["FromCustomerIDname"].ToString());
                                    }

                                }

                           }    

                        }

    这样替换后,模板中定好的样式是不会丢失的

    展开全文
  • private void button1_Click(object sender, EventArgs e) { //模板文件 string templateFile = @"Word模板.doc"; //生成的具有模板样式的新文件 string fileName = @"F:\弘和...
  • 最近遇到一个需求,需要根据数据生成一份word文档,于是就研究了...2 使用word模板,在模板里设置变量 然后替换变量就行了。这种方法简单快捷 大力推荐。 下面正式开始 1 安装phpword 我用的laravel框架 所以就用comp
  • [u][b]各位大大们,是这样... 我呢将word模板放入了myeclipse程序中,然后将需要填写的地方写个变量,用于替换数据库中给值,最后将模板重新读取出来,功能全部都实现了,但是呢出现一个小问题,原来模板是这样的[img=...
  • Java poi Word模板数据替换需求说明设计思路功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • .Net NPOI Word模板关键内容替换

    千次阅读 2019-04-26 17:34:32
    一、问题需求 在开发的一个项目中,需要根据给定的文档模板,将...第二页的数据会显示在封面中,而且使用SetLeading也无法把控间距,后来想到了,使用Word模板,将需要替换的内容设置成固定的标签,然后将新的word...
  • word模板Normal.dotm文件的生成与替换

    千次阅读 2019-12-12 18:39:13
    Word样式模板的生成与替换欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • Python批量处理Excel文件信息替换Word模板原由和思路工具准备1. 前期处理1.1 数据处理1.2 模板处理2. 编写代码2.1 使用Pycharm新建项目ExcelToWord2.2 新建ETW.py主程序文件并安装相应库2.3 主要代码块解析3. 打包...
  • Java word的模板引擎,对docx格式的文档增加模板语法,简化样式处理,支持对段落、页眉、页脚、表格等模板替换
  • 最近新增一个需求,需要对word模板内容进行替换,一开始用的是word03版的doc,替换起来比较简单,主要是range对像替换非常方便,而且可以保留替换前的字体样式,但是word里包含了图片,需要同时保存一张png图片,...
  • Word模板更改

    2020-02-19 11:20:02
    使用word时,设置好各种样式库等功能之后,如果这个word以后经常使用,可以将其设置为word模板,这样,以后每次新建word时,直接就可以使用模板样式库等功能,基本原理就是把原有的模板替换掉: 首先,我们需要...
  • WORD 模板相关问题

    2020-04-29 00:17:59
    模板主要包括样式、多级列表、多级列表与样式的连接以及新增文档部件库内容(在Word 文档中使用 “文档部件” 添加可重用的内容片段。其在“插入-文档部件”中)。 修改模板 模板替换 在已有文档中更换另一个模板...
  • Apache POI 可处理docx,xlsx,pptx,visio等文件 纯Java工具包,无需第三方...XWPFRun 一个片段(字体样式相同的一段) XWPFPicture 图片 XWPFTable 表格 Maven导入POI <dependencies> <dependency>
  • 使用场景: 创建了一个word模板,然后根据这个模板循环写入数据,这里就会涉及到占位符的...遇到的问题是替换后的文字并没有按照word模板中设计的文字样式来输出,导致产生这个问题的原因在于XWPFRun是有格式的,我...
  • Word模板引擎使用指南

    千次阅读 2017-11-12 20:23:09
     Docx模板是一个带标记的Word文档,模板引擎用数据替换这些标记生成新的Word文档。   这是一份文档,同时也是一个模板,后面的示例将会使用本模板。  Word文档地址:http://www.xdocin.com/DocxEngine.docx 2...
  • python docx文本替换保留样式

    千次阅读 2020-05-13 15:05:10
    本来是准备创建个word模板,然后进行替换关键字进行自动生成,但是文字是可以替换,样式就丢失了,用了好多种方法,虽然打印出样式进行了替换,但是word中显示的还是没有样式的样子,具体方法如下 document = Document...
  • word怎么恢复默认样式

    万次阅读 2017-05-05 05:02:30
    有时候我们在使用word的过程中会不小心替换word的默认样式,那么需要恢复原有样式该如何操作呢? 方法如下 1、关闭所有word2007文档。 2、打开任意一个文件夹,在地址栏中输入:%USERPROFILE%\AppData\Roaming\...
  • 基于poi-tl根据word模板动态生成图表

    千次阅读 2020-04-07 19:17:46
    项目上有这么一个需求:根据word模板动态生成word模板中存在图表,需要动态修改图表的数据,并保持原有图表的样式不变,如图表的系列颜色、字体大小、字体颜色等。 技术上选用了开源的poi-tl作为主要word模板引擎...
  • feemarker基于word模板的导出方式, 这种方式非常简单而且导出的样式美观, 其原理就是先做一个word模板, 该模板中变量数据用xxx这种方式填写,然后再导出时只需读取模板然后用相应的数据替换其中的{xxx}这种方式填写, ...
  • 优点:采用FreeMarker是导出Word的最佳实现,非常的灵活,能够按照自己指定的样式设置并输出内容,操作简单方便,代码实现也容易。...缺点:需要提前设计好word模板,把需要替换的地方用特殊标记标出来 ...
  • ----------表格操作表格操作用到的工具类对应封装方法 ----------段落内容替换操作段落内容操作用到的工具类效果图如果想设置单独的样式 准备工作 创建word模板.docx文件 使用模板操作,因为自己使用poi去写word过于...
  • 一、制作word模版,${xxxx}是一会要替换的内容,最下面的表格是要插入数据,根据是否以$开头来判断是需要替换还是插入数据, 注意如果是需要循环插入数据,制作的表格模版需要一行全部输入井号#,格式样式可以对#...
  • 首先你需要一份word文档(.docx),然后将需要替换的地方用${xxx}进行替换。例如下面这样 第二步,将自己做的模板另存为.xml。 用编译器打开(建议使用vscode)。打开之后是这种样式,很乱。建议将全文复制,...
  • 项目有遇到需要导出Word,在别人写好的基础上去修改样式,导出后发现样式不正确不整齐,于是采用模板的方式重新导出 1.模板word文件的制作,本人用office2013,在设计好需要的整个表格之后,在你需要替换的位置...
  • Word模板拥有丰富的样式,poi-tl在生成的文档中会完美保留模板中的样式,还可以为标签设置样式,标签的样式会被应用到替换后的文本上,因此您可以专注于模板设计。 poi-tl是一种“逻辑少”模板引擎,没有复杂的...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 209
精华内容 83
关键字:

word样式模板替换