精华内容
下载资源
问答
  • 批量替换word/excel文件内容(c#)

    热门讨论 2010-03-17 17:29:48
    基于office2003,.net 2.0 实现批量替换word/excel文件的内容。 ·可以对多个词条进行一次性替换...·导入/导出替换配置文件。 ·日志记录替换情况,多看日志。 没有在大量机器上调试过,请根据自己机器的环境编译。
  • 从test.txt里查找CLIENT_HOME 按=分割,获取值 替换1.txt里的所有CKIENT_HOME 由于修改的文件是xml,所以需要chcp 65001切换编码到utf8,否则会出现中文乱码 批处理bat: adding: 0px; font-family: arial, '...

    从test.txt里查找CLIENT_HOME 按=分割,获取值  替换1.txt里的所有CKIENT_HOME 

    由于修改的文件xml,所以需要chcp 65001切换编码到utf8,否则会出现中文乱码

     

    批处理bat:

    adding: 0px; font-family: arial, 'courier new', courier, 宋体, monospace, 'Microsoft YaHei'; white-space: pre-wrap; word-wrap: break-word; word-break: break-all; color: rgb(51, 51, 51); line-height: 20px;">

    @echo off
    chcp 65001

    for /f "tokens=1,2 delims==" %%a in ('Type conf.properties^|Findstr CLIENT_HOME') do (
           set "c1=%%a" 
           set "new=%%b"
           goto end
           )
    :end
    echo %new%


    ren cgame.as3proj a.txt
    for /f "delims=" %%i in ('findstr "CLIENT_HOME" a.txt')do (
           for /f "delims=" %%j in ('type "a.txt"') do (
                   if %%i==%%j (
                                   setlocal Enabledelayedexpansion
                                   set "var=%%i"
                           set "var=!var:CLIENT_HOME=%new%!"
                           echo !var!>>b.txt
                           endlocal
                           )else echo %%j>>b.txt
                   )
           ) 
    ren b.txt cgame.as3proj
    del a.txt b.txt

    pause

    展开全文
  • 通过宏和ActiveXObject来控制 word操作,包括文字替换、文字替换为图片 使用ActiveXObject前需要配置Internet属性 通过宏来替换文字、文字替换图片 2.1 文字替换为图片 For i = 1 To ActiveDocument.Paragraphs....

    通过宏和ActiveXObject来控制 word操作,包括文字替换、文字替换为图片

    1. 使用ActiveXObject前需要配置Internet属性
      在这里插入图片描述
      在这里插入图片描述
    2. 通过宏来替换文字、文字替换图片
      2.1 文字替换为图片
    For i = 1 To ActiveDocument.Paragraphs.Count
    mypic = ActiveDocument.Paragraphs(i).Range.Text
    If InStr(mypic,”picture”) > 0 Then
            ActiveDocument.Paragraphs(i).Range.Select
            Selection.InlineShapes.AddPicture filename:=”C:/1.jpg”, LinkToFile:=False, SaveWithDocument:=True
            Selection.InsertBefore (Chr(10))      '换行    Chr(13)  回车
        End If
    Next
    

    2.2 文字替换

    Set myRange = ActiveDocument.Content
    With myRange.Find
    .Text = “原文字”
        .Forward = True
        .Wrap = wdFindStop
        .Execute
    End With
    With myRange
        Do While .Find.Found = True
            .Text = “新文字”
            .Find.Execute
        Loop
    End With
    

    2.3 读取文件,截取 warnCategory= **%1end 字符串

    Public CookieFile As String
    Public LotusDocID As String
    CookieFile = CookieFile + "Cookie.txt"
    Dim mylog
    Set mylog = CreateObject("Scripting.FileSystemObject")
    If (mylog.FileExists(CookieFile)) Then
    Open CookieFile For Input As #1
        Input #1, StrCookie
    Close #1
    Dim MyPosEnd As Integer
    MyPosEnd = InStr(1, StrCookie, "%1end") - 1
    LotusDocID = Left(StrCookie, MyPosEnd)
    LotusDocID = Right(LotusDocID, MyPosEnd - InStr(LotusDocID, "warnCategory=") - 12)
    

    2.4 获取当前文件路径

    Dim wordPath
    wordPath = ActiveDocument.Path
    Dim sourceArr
    sourceArr = Split(wordPath, Application.PathSeparator)
    For subi = 0 To UBound(sourceArr) 
        CookieFile = CookieFile + sourceArr(subi) + Application.PathSeparator
    Next subi
    
    1. 通过ActiveXObject 来替换文字、文字替换图片
      3.1 创建文件打开
    var wordApp = new ActiveXObject("Word.Application");
    wordApp.Visible = false;
    var redHeadFileName=new UUID().createUUID()+'.doc';
    var docPath =baseUrl+ "/attachment/downloadByNewFileName.do?attId="+attId+"&newFileName="+redHeadFileName;
    var d = new word({
    	srcurl : docPath,
    	destfile : redHeadFileName,
    	myword : wordApp,
    	docVisible : false
    });
    d.build();
    d.open();
    

    3.2 文字替换

    var selection = wordApp.Selection;
    selection.Find.Text = "¥¥context";
    selection.Find.wrap = 1;
    while (selection.Find.Execute()) {
       selection.paste();
    }
    selection.Find.Text="¥¥warnCategory";
    selection.Find.wrap=1;
    while(selection.Find.Execute()){
    selection.TypeText(new);
    }
    wordApp.Visible = true;
    wordApp.Application.Activate();
    

    发现的问题,selection.TypeText(“”); 不会替换内容
    3.3 文字替换图片

    var count = wordApp.documents(1).paragraphs.count;
    var mypic = "";
    for(var i = 1;i<=count ; i++){
        var mypic = wordApp.documents(1).paragraphs(i).range.text;
        if(mypic.indexOf("¥¥picture") > -1){
            wordApp.documents(1).paragraphs(i).range.select();
            wordApp.Selection.InlineShapes.AddPicture("E:\\20190819\\1.gif");
            wordApp.Selection.InsertBefore ("\n\r");
        }
    }
    
    1. 如果是Excel , ActiveXObject 怎么打开
    var excelApp = new ActiveXObject("Excel.Application");
    var d = new excel({
        srcurl : docPath,
        destfile : redHeadFileName,
        myword : excelApp,
        docVisible : false
    });
    d.build();
    var oWB = d.open();   //Open方法修改为 myword.Workbooks.Open(desturl)
    oWB.worksheets(1).select();
    var workSheet = oWB.ActiveSheet;
    workSheet.Cells(2,2).Value = "100";
    workSheet.Cells(3,2).Value = "100";
    excelApp.Application.Visible = true;
    
    1. 遇到问题
      5.1 被呼叫方拒绝接收呼叫
      打开window任务管理器,发现Word进程还在,说明资源没有释放
      查找文档,确保关闭 new的ActiveXObject
    2. 相关js
    /**
     * config = {srcurl,destfile,isnew,uploadpath}
     * srcurl: 远程服务器文件 e.g. http://128.96.172.238:9080/aaa/upload/aaa.doc
     * destfile: 本地的文件名称 e.g. zhwm.doc
     * isnew: 是本地新建,还是远程下载
     * uploadpath: 上传到服务器的doc文件路径 e.g.  /tomcat6.0/webapps/aaa/upload/ 
     * upload_target_url:上传doc文件到服务器的jsp
     */
    
    $(document).ready(function(){
    	$("head").append("<script src="+'../js/contextConstant.js'+"></script>");
    });
    word = function(config) {
    	var myword, fso ,mydoc,xml_dom, ado_stream;
    	var myinterval,  srcurl, uploadpath, desturl,destfile,upload_target_url;
    	var destDir=downContextPath;
        var docVisible=true;
    	
    	
    	function init(){
    		fso = new ActiveXObject("Scripting.FileSystemObject");
    	}
        function InitAjax() {
            var ajax;
            if (window.ActiveXObject) {
                var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
                for (var i = 0; i < versions.length; i++) {
                    try {
                        ajax = new ActiveXObject(versions[i]);
                        if (ajax) {
                            return ajax;
                        }
                    } catch (e) {
                    }
                }
            } else if (window.XMLHttpRequest) {
                ajax = new XMLHttpRequest();
            }
            return ajax;
        }
        var ajaxWord;
        function getFileByServer(srcUrl) {
            ajaxWord = InitAjax();
            ajaxWord.onreadystatechange = getReady; // 回调函数
            ajaxWord.open('post', srcUrl, false);
            ajaxWord.send();
        }
    	this.close = function(){
            if(null!=mydoc){
    		  mydoc.close();
    		  mydoc = null;
            }
            if(myword){
              myword.quit();
              myword = null;
            }
    
    	}
    	this.build = function() {
    		init();
    	    if (typeof config.srcurl == 'undefined') {
    			alert('请指定参数srcurl');
    		}else {
    			srcurl = config.srcurl;
    		}
    		if(typeof config.destfile == 'undefined')
    			alert('请指定参数destfile');
    		else destfile = config.destfile;
    
            if(!(typeof config.destfile == 'undefined')){
                docVisible=config.docVisible;
            }
    		desturl = destDir + destfile;
    		myword = config.myword;
    
    		createLocalDir();
            getFileByServer(srcurl);
    	}
    	
    	function createLocalDir(){
    		if(!fso.FolderExists(destDir)){
    			fso.CreateFolder(destDir);
    		}
    		if (fso.FileExists(desturl)) {
    			fso.DeleteFile(desturl);
    		}
    		fso = null;
    	}
        this.open=function openWord(){
            fso = new ActiveXObject("Scripting.FileSystemObject");
            // 判断 文件是否存在
            if(!fso.FileExists(desturl)){
                alert("目标文件不存在,打开失败");
                fso.close();
                this.close();
                return null;
            }
    		myword.visible = docVisible;
            mydoc= myword.Documents.Open(desturl);
            return mydoc;
    	}
        function getReady(func) {
            if (ajaxWord.readyState == 4) {
                if (ajaxWord.status == 200) {
                    saveFile(desturl);
                    return true;
                }else {
                    return false;
                }
            } else{
                return false;
            }
        }
    
        function saveFile(tofile) {
            var objStream;
            var file;
            file = ajaxWord.responseBody;
            objStream = new ActiveXObject("ADODB.Stream");
            objStream.Mode = 3 ;           //读写
            objStream.Type = 1;            //文本
            objStream.open();
            objStream.write(file);
            objStream.SaveToFile(tofile);
            objStream.close();
            objStream=null;
    
        }
    }
    
    excel = function(config) {
        var myword, fso ,mydoc,xml_dom, ado_stream;
        var myinterval,  srcurl, uploadpath, desturl,destfile,upload_target_url;
        var destDir=downContextPath;
        var docVisible=true;
    
    
        function init(){
            fso = new ActiveXObject("Scripting.FileSystemObject");
        }
        function InitAjax() {
            var ajax;
            if (window.ActiveXObject) {
                var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
                for (var i = 0; i < versions.length; i++) {
                    try {
                        ajax = new ActiveXObject(versions[i]);
                        if (ajax) {
                            return ajax;
                        }
                    } catch (e) {
                    }
                }
            } else if (window.XMLHttpRequest) {
                ajax = new XMLHttpRequest();
            }
            return ajax;
        }
        var ajaxWord;
        function getFileByServer(srcUrl) {
            ajaxWord = InitAjax();
            ajaxWord.onreadystatechange = getReady; // 回调函数
            ajaxWord.open('post', srcUrl, false);
            ajaxWord.send();
        }
        this.close = function(){
            if(null!=mydoc){
                mydoc.close();
                mydoc = null;
            }
            if(myword){
                myword.quit();
                myword = null;
            }
        }
        this.build = function() {
            init();
            if (typeof config.srcurl == 'undefined') {
                alert('请指定参数srcurl');
            }else {
                srcurl = config.srcurl;
            }
            if(typeof config.destfile == 'undefined')
                alert('请指定参数destfile');
            else destfile = config.destfile;
    
            if(!(typeof config.destfile == 'undefined')){
                docVisible=config.docVisible;
            }
            desturl = destDir + destfile;
            myword = config.myword;
    
            createLocalDir();
            getFileByServer(srcurl);
        }
    
        function createLocalDir(){
            if(!fso.FolderExists(destDir)){
                fso.CreateFolder(destDir);
            }
            if (fso.FileExists(desturl)) {
                fso.DeleteFile(desturl);
            }
            fso = null;
        }
        this.open=function openWord(){
            fso = new ActiveXObject("Scripting.FileSystemObject");
            // 判断 文件是否存在
            if(!fso.FileExists(desturl)){
                alert("目标文件不存在,打开失败");
                fso.close();
                this.close();
                return null;
            }
            myword.visible = docVisible;
            mydoc= myword.Workbooks.Open(desturl);
            return mydoc;
        }
        function getReady(func) {
            if (ajaxWord.readyState == 4) {
                if (ajaxWord.status == 200) {
                    saveFile(desturl);
                    return true;
                }else {
                    return false;
                }
            } else{
                return false;
            }
        }
    
        function saveFile(tofile) {
            var objStream;
            var file;
            file = ajaxWord.responseBody;
            objStream = new ActiveXObject("ADODB.Stream");
            objStream.Type = 1;
            objStream.open();
            objStream.write(file);
            objStream.SaveToFile(tofile);
            objStream.close();
            objStream=null;
    
        }
    }
    
    //根据标签和元素id替换相关值
    function  replace(wordApp,label,value){
    	  var selection = wordApp.Selection;
    		// 替换值
          selection.Find.Text=label;
          selection.Find.wrap=1;
          while(selection.Find.Execute()){
            selection.TypeText($("#"+value).val());  // 设置值
            
          }
    }
    
    //根据标签和元素id替换相关值
    function  replace2(wordApp,label,value){
    	  var selection = wordApp.Selection;
    	  // 替换值
          selection.Find.Text=label;
          selection.Find.wrap=1;
          while(selection.Find.Execute()){
            selection.TypeText(value);  // 设置值
            
          }
    } 
    
    // 正文下载的目录
    var downContextPath="c:/ccbplmis_temp/";
    // 正文上载文件的目录
    var upContextPath="c:/ccbplmis/";
    
    // 正文上传url
    var baseUrl = "http://"+document.location.host+"/plmis";  
    
    // 合成格式  word 蓝色 颜色编码
    var buleColorCode=16724787;
    //合成格式  word 黄色 颜色编码
    var yellowColorCode=6553085;
    //合成格式  word 橙色  颜色编码
    var orangeyColorCode=3652077;
    //合成格式  word 红色 颜色编码
    var redColorCode=3034366;
    
    展开全文
  • java poi 替换word内容

    万次阅读 2018-08-15 15:15:46
    以上数据为替换部分的数据。...以上为模版内容     /**  *   * @param params //需要替换的文字。  * @param wgylist1 //生成表格的list  * @param lzlist1 //生成表格的list  * @param dateStr   ...

    以上数据为替换部分的数据。

    以上为模版内容

     

     

    /**
             * 
             * @param params  //需要替换的文字。
             * @param wgylist1 //生成表格的list
             * @param lzlist1   //生成表格的list
             * @param dateStr  
             * @param fileName
             * 读取模版内容,替换模版内的文字。并在模版后生成表格。
             */

    private void download(Map<String,Object> params,List<Map<String,String>> wgylist1,List<Map<String,String>> lzlist1,String dateStr,String fileName){
                XwpfTUtil xwpfTUtil = new XwpfTUtil();      
                   XWPFDocument doc = null;
                   InputStream is = null;
                   try {

         //根据文件的项目路径,获得文件的系统路径。
                       String path = ExportExcelHelper.class.getResource("/template"+File.separatorChar+"statistics.docx").getPath();
                       is = new FileInputStream(path);
                       doc = new XWPFDocument(is);
                       xwpfTUtil.replaceInPara(doc, params); 
                       ExportWordHelper ewp=new ExportWordHelper();
                       ewp.ExportWord(wgylist1, lzlist1,doc,dateStr);   

                     //  uploadsDir为项目中配置的路径。             
                       File dir = new File(uploadsDir+"/uploads/weekly");
                       if (!dir.exists()) {// 判断文件目录是否存在
                            dir.mkdirs();
                        }  

          //下载文件到硬盘                
                       FileOutputStream os = new FileOutputStream(uploadsDir+"/uploads/weekly/"+fileName+".docx");
                       doc.write(os);
                       xwpfTUtil.close(is);
                       xwpfTUtil.close(os);
                   } catch (Exception e) {
                       e.printStackTrace();                   
                   }  
            }

     

     

     

     

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;


    public class XwpfTUtil {
         /** 
         * 替换段落里面的变量 
         * 
         * @param doc    要替换的文档 
         * @param params 参数 
         */  
        public void replaceInPara(XWPFDocument doc, Map<String, Object> params) {  
            Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator(); 
            XWPFParagraph para;  
            while (iterator.hasNext()) {
                para = iterator.next();  
                this.replaceInPara(para, params);
            }  
            
        }  
        
        /** 
         * 替换段落里面的变量 
         * 
         * @param para   要替换的段落 
         * @param params 参数 
         */    
       public void replaceInPara(XWPFParagraph para, Map<String, Object> params) {  
           List<XWPFRun> runs;  
            Matcher matcher;  
            if (this.matcher(para.getParagraphText()).find()) {
                runs = para.getRuns();               
                int start = -1;  
                int end = -1;  
                String str = "";  
                for (int i = 0; i < runs.size(); i++) {  
                    XWPFRun run = runs.get(i);  
                    String runText = run.toString().trim();  
                    if(!"".equals(runText)){
                        if ('$' == runText.charAt(0)&&'{' == runText.charAt(1)) {  
                            start = i;  
                        }  
                        if ((start != -1)) {  
                            str += runText;  
                        } 
                        if ('}' == runText.charAt(runText.length() - 1)) {  
                            if (start != -1) {  
                                end = i;  
                                break;  
                            }  
                        }
                    }
                } 
               if(start!=-1){
                   for(int i=start;i<end+1;i++){
                       para.removeRun(start); 
                   }
                   XWPFRun createRun = para.insertNewRun(start);
                   for (String key : params.keySet())  {
                       if (str.equals(key)) {  
                           createRun.setText((String) params.get(key));
                           createRun.setFontSize(16);
                           createRun.addBreak();
                           break;  
                       }  
                   } 
               }
                 
                  
            }        
        }  
        
        /** 
         * 正则匹配字符串 
         * 
         * @param str 
         * @return 
         */  
        private Matcher matcher(String str) {  
            Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);  
            Matcher matcher = pattern.matcher(str);  
            return matcher;  
        }  
        /** 
         * 关闭输入流 
         * 
         * @param is 
         */  
        public void close(InputStream is) {  
            if (is != null) {  
                try {  
                    is.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
        /** 
         * 关闭输出流 
         * 
         * @param os 
         */  
        public void close(OutputStream os) {  
            if (os != null) {  
                try {  
                    os.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }
    }
     

     

     

     

     

    import java.math.BigInteger;
    import java.util.List;
    import java.util.Map;

    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.apache.poi.xwpf.usermodel.XWPFTable;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.apache.poi.xwpf.usermodel.XWPFTableRow;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;


    public class ExportWordHelper {
       //导出表格到word
        /**
         * 
         * @param statisticalGridman  中山区网格员上报案件排名 
         * @param totalGridman 有多少人没上报过案件
         * @return
         * @throws Exception
         */
        public XWPFDocument ExportWord(List<Map<String, String>> wgylist1,List<Map<String, String>> lzlist1,XWPFDocument document,String dateStr)throws Exception{
            //两个表格之间加个换行  
            XWPFParagraph paragraph = document.createParagraph();  
            XWPFRun paragraphRun = paragraph.createRun();  
            paragraphRun.setText("\r");  
            
            //添加标题,
            XWPFParagraph titleParagraph = document.createParagraph();  
            //设置段落居中  
            titleParagraph.setAlignment(ParagraphAlignment.CENTER);  
      
            XWPFRun titleParagraphRun = titleParagraph.createRun();  
            titleParagraphRun.setText(dateStr+"此处为表格的标题部分");  
            titleParagraphRun.setColor("000000");  
            titleParagraphRun.setFontSize(24); 
            titleParagraphRun.setFontFamily("宋体");
            //换行  
            XWPFParagraph paragraph1 = document.createParagraph();  
            XWPFRun paragraphRun1 = paragraph1.createRun();  
            paragraphRun1.setText("\r");  
            //表格部分
            XWPFTable ComTable = document.createTable();  
            //列宽自动分割  
            CTTblWidth comTableWidth = ComTable.getCTTbl().addNewTblPr().addNewTblW();  
            comTableWidth.setType(STTblWidth.DXA);  
            comTableWidth.setW(BigInteger.valueOf(9072));   
            //表格第一行  
            XWPFTableRow comTableRowOne = ComTable.getRow(0);  
            comTableRowOne.getCell(0).setText("序号");  
            comTableRowOne.addNewTableCell().setText("测试");  
            comTableRowOne.addNewTableCell().setText("测试");  
            comTableRowOne.addNewTableCell().setText("测试");  
            comTableRowOne.addNewTableCell().setText("测试");  
            comTableRowOne.addNewTableCell().setText("测试");  
            comTableRowOne.addNewTableCell().setText("测试");  
            comTableRowOne.addNewTableCell().setText("测试"); 
            for(int i=0;i<wgylist1.size();i++){
                Map<String, String> map = wgylist1.get(i);
                XWPFTableRow comTableRow = ComTable.createRow(); 
                comTableRow.getCell(0).setText(""+(i+1));
                comTableRow.getCell(1).setText((String)map.get("JD"));
                comTableRow.getCell(2).setText((String)map.get("SQ"));
                comTableRow.getCell(3).setText((String)map.get("NAME"));
                comTableRow.getCell(4).setText(String.valueOf(map.get("CODE")));
                comTableRow.getCell(5).setText(String.valueOf(map.get("AJZS1")));
                comTableRow.getCell(6).setText(String.valueOf(map.get("XCDWS1")));
                comTableRow.getCell(7).setText(String.valueOf(map.get("XCCS1")));
            } 
            //换行  
            XWPFParagraph paragraph2 = document.createParagraph();  
            XWPFRun paragraphRun2 = paragraph2.createRun();  
            paragraphRun2.setText("\r");         
        /**
         * 设置字体样式
         * @param cell
         * @param text 
         * @throws Exception
         */
        public  void setCellText(XWPFTableCell cell,String text) throws Exception{  
            XWPFParagraph cellP=cell.getParagraphs().get(0);  
            XWPFRun cellR = cellP.createRun();  
            cellR.setText(text);  
            cellR.setFontFamily("宋体");
            cellR.setBold(true);
            cellR.setFontSize(9);
        }
        
        /**
         * 跨列合并   表格的下标是从0开始的
         * @param table 操作的是哪个表格
         * @param col  在第几行合并 
         * @param fromRow 在哪个列上开始合并
         * @param toRow  在哪个列上结束合并
         */
         public  void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {  
                for (int i = fromRow; i <= toRow; i++) {  
                    XWPFTableCell cell = table.getRow(i).getCell(col);
                    if ( i == fromRow ) {  
                        cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);  
                    } else {  
                        cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);  
                    }  
                }  
            }
        /**
         * 跨行合并   表格的下标是从0开始的
         * @param table 操作的是哪个表格
         * @param row 在第几列合并 
         * @param fromCell 在哪个行上开始合并
         * @param toCell  在哪个行上结束合并
         */
        public  void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {  
            for (int i = fromCell; i <= toCell; i++) {  
                XWPFTableCell cell = table.getRow(row).getCell(i);  
                if ( i == fromCell ) {  
                    cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);  
                } else {  
                    cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);  
                }  
            }  
        } 
           

    }
     

    运行结果如下

     

     

    展开全文
  • 使用PHPWordWord文件做模板替换

    千次阅读 2016-12-19 05:52:35
    因工作需要,使用了版本比较旧的PHPWord项目官方已不见维护更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM如果PHP版本>=5.3.3,强烈推荐使用PHPOffice/PHPWord这个开源项目本篇针对的为旧版本的PHPWord 基本...

    因工作需要,使用了版本比较旧的PHPWord项目
    官方已不见维护更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM
    如果PHP版本>=5.3.3,强烈推荐使用PHPOffice/PHPWord这个开源项目
    本篇针对的为旧版本的PHPWord

    基本安装

    见官网

    问题总结

    Autoloader自动加载部分情况下失败

    在使用Yii 1配置自动加载时无法正常加载类库,需对其PHPWord/Autoloader.php做部分调整,这儿借鉴了PHPExcelAutoloader:

    /**
     * PHPWord_Autoloader
     */
    class PHPWord_Autoloader
    {
        /**
         * Register the Autoloader with SPL
         *
         */
        public static function Register() {
            $functions = spl_autoload_functions();  
            foreach ( $functions as  $function)  
                spl_autoload_unregister($function);  
            $functions = array_merge(array(array('PHPWord_Autoloader','Load')),$functions);  
            foreach ( $functions as $function)  
                $x = spl_autoload_register($function);  
            return $x; 
    
        }   //    function Register()
    
    
        /**
         * Autoload a class identified by name
         *
         * @param    string    $pClassName        Name of the object to load
         */
        public static function Load($pClassName){
            if ((class_exists($pClassName,FALSE)) || (strpos($pClassName, 'PHPWord') !== 0)) {
                //    Either already loaded, or not a PHPWord class request
                return FALSE;
            }
    
            $pClassFilePath = PHPWORD_BASE_PATH .
                              str_replace('_',DIRECTORY_SEPARATOR,$pClassName) .
                              '.php';
    
            if ((file_exists($pClassFilePath) === FALSE) || (is_readable($pClassFilePath) === FALSE)) {
                //    Can't load
                return FALSE;
            }
    
            require($pClassFilePath);
        }   //    function Load()
    
    }

    模板替换时无法识别模板标签

    表现

    1. 使用/复制官方样例的模板文件替换正常

    2. 自己手动敲出模板标签替换异常

    原因

    1. PHPWord的替换规则是将Word文件解析成XML进行替换处理,当Word解析成XML时字符分离了,导致匹配不上模板标签;

    2. 具体分析可参考一下资料:

    解决办法

    参考http://stackoverflow.com/a/21750677/5270710

    改进Template类:
    可参考Github: Arisse/PHPWord_CloneRowTemplate类进行改造。
    因为下面仍需要修改Template类,这儿暂时就不贴代码了,下面一并贴出改造后的代码。

    中文乱码

    参考CSDN: PHPWord利用模板替换字符串生成精确的word文档

    编辑PHPWord/Template.php,找到代码$replace = utf8_encode($replace);,删除或者注释掉这行代码,添加$replace = iconv( 'gbk','utf-8', $replace);,比如代码改为如下:

    /**
     * Set a Template value
     * 
     * @param mixed $search
     * @param mixed $replace
     */
    public function setValue($search, $replace) {
        if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
            $search = '${'.$search.'}';
        }
     
        if(!is_array($replace)) {
            //$replace = utf8_encode($replace);
            $replace =iconv('gbk', 'utf-8', $replace); // 注释掉上面行后添加这行
        }
     
        $this->_documentXML = str_replace($search, $replace, $this->_documentXML);
    }

    空格输出

    参考CSDN: PhpWord 如何输出换行符到 word?

    在想要输出换行的地方用<w:br />代替即可.

    标记符号输出

    参考百度经验: 如何在word中选择打钩的方框
    仅以输出为例,其它符号与之类似。
    注:PHP文件需要使用UTF-8编码

    1. Word文件中按照参考文件方式插入

    2. 复制符号到PHP文件;

    3. 正常的输出替换。
      具体代码见如下的项目代码

    Template类代码

    // code
    /**
    * Set a Template value
    *
    * @param mixed $search
    * @param mixed $replace
    */
    public function setValue($search, $replace, $limit=-1) {
        if(substr($search, 0, 1) !== '{' && substr($search, -1) !== '}') {
            $search = '{'.$search.'}';
        }
        
        if(!is_array($replace)) {
            // $replace = utf8_encode($replace);
            // $replace = iconv( 'gbk','utf-8', $replace);
            $replace = str_replace("\n","<w:br />",$replace);
        }
    
        preg_match_all('/\{[^}]+\}/', $this->_documentXML, $matches);
        foreach ($matches[0] as $k => $match) {
            $no_tag = strip_tags($match);
            if ($no_tag == $search) {
                $match = '{'.$match.'}';
                $this->_documentXML = preg_replace($match, $replace, $this->_documentXML, $limit);    
                if ($limit == 1) {
                    break;
                }            
            }
        }
    }
    // code

    项目代码

    // @author Heier xheier@outlook.com
    public function actionExportPersonTable() {
        // 获取数据部分代码
        // ...
    
        $PHPWord = new PHPWord();
        
        // Word模板目录
        $personBasePath = Yii::app()->basePath.'/person/';
        
        // 删除目录下临时文件-十分钟以前
        $this->delfile( $personBasePath, 10 );
        
        // 模板文件名
        $tempName = $personBasePath . '/moban.docx';
        
        $word = $PHPWord->loadTemplate( $tempName );
        
        // 项目使用的是GBK编码,需要做转换
        $username = iconv('gbk', 'utf-8', getUserNameById($personData[0]['user_id']) );
        $personal_type = $personData[0]['personal_type'];
        
        // 模板替换开始
        // 可以输出打勾的方框
        $deptA=$deptBP=$deptB=$deptC=$deptD = '□';
        if( $DirectorLevel == 'A' ) {
            $deptA = '☑';
        } elseif( $DirectorLevel == 'B+' ) {
            $deptBP = '☑';
        } elseif( $DirectorLevel == 'B' ) {
            $deptB = '☑';
        } elseif( $DirectorLevel == 'C' ) {
            $deptC = '☑';
        } elseif( $DirectorLevel == 'D' ) {
            $deptD = '☑';
        }
    
        $word->setValue('deptA', $deptA);
        $word->setValue('deptBP', $deptBP);
        $word->setValue('deptB', $deptB);
        $word->setValue('deptC', $deptC);
        $word->setValue('deptD', $deptD);
    
        // 设置其它替换
        // ...
        
        // 生成临时文件以供下载
        $tmpFileName = md5( time().'Heier' );
        
        $word->save($personBasePath . '/' . $tmpFileName .'.docx');
        $file = $personBasePath . '/' . $tmpFileName .'.docx';
        
        // 下载Word文件
        ob_start(); //打开缓冲区
        $fp = fopen($file,"r");
        $file_size = filesize($file);
        $downFileName = 'XXX.docx';
        
        header("Cache-Control: public");
        header("Content-type: application/octet-stream");
        header("Accept-Ranges: bytes");
        header("Content-Disposition: attachment; filename={$downFileName}");
        header("Pragma:no-cache");
        header("Expires:0");
        $buffer = 1024;
        $file_count = 0;
        //向浏览输出回数据
        while(!feof($fp) && $file_count < $file_size){
            $file_con = fread($fp,$buffer);
            $file_count += $buffer;
            echo $file_con;
        }
        ob_end_flush();//输出全部内容到浏览器
    }

    参考文档汇总

    1. CodePlex: PHPWord;

    2. Github: PHPOffice/PHPWord;

    3. phpword: setValue() not working;

    4. stackoverflow: PhpWord doesn't replace text;

    5. Github: Arisse/PHPWord_CloneRow;

    6. CSDN: PHPWord利用模板替换字符串生成精确的word文档;

    7. CSDN: PhpWord 如何输出换行符到 word?

    关于我

    文章转载自我的博客:
    Heier Blog: 使用PHPWord对Word文件做模板替换

    展开全文
  • 文章目录背景`mac`终端进入`jar`包所在目录搜索指定文件修改并保存配置文件内容配置文件编辑完后保存退出 背景 在服务器上部署服务,需要用到jar包起服务,但是不可避免的jar内容有时候需要自己修改配置来适用不同的...
  • 一、前言 前有java-poi替换模板文件word文档中的变量,生成Word...FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据,简单点就是替换模板中的变量, 并用来生成输出文本(HTML网页,电子邮件,配置文件,...
  • 那我们能不能实现用Java语言在线打开word文档的同时,将指定内容通过程序查找替换成我们想要的内容呢?这是可以的。 但是这需要开发者具备将activex控件集成到Java环境的能力。对于大部分Java开发工程师来说,仅仅...
  • 用POI操作对Word模板内容替换实例

    千次阅读 2019-06-24 17:42:54
     //替换读取到的word模板内容的指定字段  Range range = hdt.getRange();  for (Map.Entry,String> entry:map.entrySet()) {  range.replaceText("${}",entry.getValue());  }  //输出word内容文件流...
  • 关于网上说的解压Jar包,修改Jar包中的文件,再打包成zip,修改zip的后缀为.jar的方法,解压放到项目中亲测无效。 原本操作 Word转 PDF 用的是 POI...最终找到了Aspose-Word,它可以操纵一些主流的文件格式:Word...
  • 包含常规和粗体两种字形,作为编程字体,能保证中英文字符2:1的宽度比。如果是希望利用MacType热替换费眼且难看的宋体和新宋体,则不要安装粗体,...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。可利用MacType热替换费眼且难看的宋体和新宋体,在Word中也不会导致文档的行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。可利用MacType热替换费眼且难看的宋体和新宋体,在Word中也不会导致文档的行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 包含常规和粗体两种字形,作为编程字体,能保证中英文字符2:1的宽度比。如果是希望利用MacType热替换费眼且难看的宋体和新宋体,则不要安装粗体,...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。可利用MacType热替换费眼且难看的宋体和新宋体,在Word中也不会导致文档的行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。可利用MacType热替换费眼且难看的宋体和新宋体,在Word中也不会导致文档的行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过仅包含常规字形。可利用MacType热替换费眼的宋体和新宋体,不会导致网页和Word文档等的版面(行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过仅包含常规字形。可利用MacType热替换费眼的宋体和新宋体,不会导致网页和Word文档等的版面(行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过仅包含常规字形。可利用MacType热替换费眼的宋体和新宋体,不会导致网页和Word文档等的版面(行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。可利用MacType热替换费眼且难看的宋体和新宋体,在Word中也不会导致文档的行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。可利用MacType热替换费眼且难看的宋体和新宋体,在Word中也不会导致文档的行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • 使用命令替换文本多行内容A very useful function which is missing from the Windows library of command line tools is the ability to replace text in plain text files. A function like this can be used for ...
  • 在做项目时用到,phpword中TemplateProcessor API接口进word模板文件中使用变量替换内容,在进行一个文档内容替换时出现变量无法替换,后面排除法,一块一块的删除word文件内容看是哪个变量不能替换影响到了,试到...
  • MSYH-JBM为非等宽字体,MSYH-JBM-M为等宽字体,可利用MacType...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。 MSYH-JBM-M可作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。
  • 作为编程字体,能保证中英文字符2:1的宽度比,不过只包含常规字形。可利用MacType热替换费眼且难看的宋体和新宋体,在Word中也不会导致文档的行...压缩包中包含了对应的MacType配置文件,MacType请自行网上下载安装。
  • SparkStreaming动态读取配置文件

    千次阅读 2017-11-23 09:59:32
    SparkStreaming动态读取配置文件标签: SparkStreaming HDFS 配置文件 MySql需求 要实现SparkStreaming在流处理过程中能动态的获取到配置文件的改变 并且能在不重启应用的情况下更新配置 配置文件大概一个月改动一次...
  • vim 配置文件

    2015-04-03 10:08:53
    2.解压替换原有的.vimrc和.vim目录 3.功能键 F2:打开/关闭Tlist F3:打开/关闭目录树 F4:打开"最近打开的文件" F5: 打开文件搜索 F6:在当前目录及子目录中搜索光标停留的word F7:加载当前目录向上最多5级目录中...
  • 根据word的xml模板生成word文件
  • 先下载jacob.jar包。解压后将jacob.dll放到windows/system32下面...* 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。 * word模板中所有要替换的字段(即HashMap中的Key)以特
  • Freemaker模板替换word封装工具类

    千次阅读 2020-05-31 16:36:30
    } /** * * @Author zhangshizhe * @Date 2020年05月30日 9:16:03 * @Description 获取word的段落 * @Fcunction getParagraph * @param str * @return String * */ public String getParagraph(String str){ return ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,554
精华内容 17,021
关键字:

word替换内容的配置文件