phpword读取内容和样式 生成新的内容
table样式还未读出 正在测试中,
目前有 rows  cell textrun等样式
顺序不固定 可以设定
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\Style\Font;
use PhpOffice\PhpWord\Shared\ZipArchive;
use PhpOffice\PhpWord\Settings;
use PhpOffice\PhpWord\Shared\Converter;
use PhpOffice\PhpWord\Style\TablePosition;
class Test extends MY_Controller
{
    public $currentPage=0;
    private $args = null; // 文本段样式
    public  function __construct()
    {
        parent::__construct();
    }
    public function joinFile()
    {
        $page=2;
        $file1='/home/shaonianlang/桌面/111.docx';
        $file2='/home/shaonianlang/桌面/szxm.docx';
        $phpWord = new PhpWord();
        $S1 =IOFactory::load($file1)->getSections();
        $S2 = IOFactory::load($file2);
        $arr=[];
        foreach ($S1 as $S) {
            $elements = $S->getElements();
            // 逐级读取/写入节点
            $arr=$this->copyElement($elements, $section);
        }
        //合并文档
        //$section = $S2->addSection();
        //生成新文档
        $section = $phpWord->addSection();
        $table = $section->addTable();
        //$header = array('size' => 16, 'bold' => true);
        //table行数
        $rows = $arr['rows'];
        //table列数
        $cols = $arr['cells'];
        foreach($arr['tmptext'] as $qa) {
            $xas='';
            $header=[];
            if(is_array($qa)) {
            foreach ($qa as $axz) {
            $xas.=$axz['text'];
            $header=array('size'=>$axz['style']['basic']['size'],'name'=>$axz['style']['basic']['name']);
            }
            $section->addText($xas, $header);
        }
        }
        //var_dump($arr);
        //添加标题 后面是个央视
        //添加一个表格实力恶化
        //$table = $section->addTable();
        //行数循环
        for ($r = 1; $r <= $rows; $r++) {
            //添加行
            $table->addRow($arr['height'][$r]);
            //添加列数
            for ($c = 1; $c <= $cols; $c++) {
                //判断当前列数中textrun的个数
                $counts=count($arr['text'][$r][$c]);
                //textrun表示就是一行
                if($counts<2) {
                    $headers=array('size'=>$arr['text'][$r][$c][0]['style']['basic']['size'],'name'=>$arr['text'][$r][$c][0]['style']['basic']['name']);
                    $table->addCell($arr['width'][$r][$c])->addText($arr['text'][$r][$c][0]['text'],$headers);
                }else {
                    //textrun表示是两行 完美
                    $texs='';
                    foreach($arr['text'][$r][$c] as $ka=>$txa) {
                        $texs.=$txa['text'];
                        $headers=array('size'=>$txa['style']['basic']['size'],'name'=>$txa['style']['basic']['name']);
                    } 
                    //将数据插入到表格中
                    $table->addCell($arr['width'][$r][$c])->addText($texs,$headers);
                }
            }
        }
        $F1 = IOFactory::createWriter($phpWord);
        $path = APPPATH.'app/upload';
        if(!is_dir($path)) mkdir($path);
        $filePath = $path . time() . '.docx';
        $F1->save($filePath);
    }
    /**
     * 逐级读取/写入节点
     *
     * @param Array
     *    需要读取的节点
     * @param PhpOffice\PhpWord\Element\Section
     *    节点的容器
     * @param Array
     *    文档2的所有节点
     */
    private function copyElement($elements, &$container, $S2 = null)
    {
        $inEls = [];
        $arrx=[];
        $styles=[];
        foreach ($elements as $e1) {
            $class=get_class($e1); //获取word中对应内容类型类
            $elname=explode("\\", $class)[3];
            //$fun = 'add' . $elname;
            //如果没找到分页 则默认为第一页
            if ($elname == 'PageBreak') {
                $this->currentPage++;
            }else{
                 $this->currentPage=1;
            }
            //文本节点 继续循环
            if ($elname=='TextRun') {
                $arrx['tmptext'][]=$this->getTextElement($e1);//获取text节点内容
            }
            if ($elname=='Table') {
                $rows=count($e1->getRows()); //行数
                $cells=$e1->countColumns(); //列数
                //$style=$e->getStyle(); //表格样式
                //$width=$e->getWidth(); //宽度
                $arrx['rows']=$rows;
                $arrx['cells']=$cells;
                for($i=0;$i<$rows;$i++) {
                    $rows_a=$e1->getRows()[$i];
                    $arrx['height'][$i+1]=$rows_a->getHeight();
                    //$arrx['rows'][$i+1]=$this->rowstyle($rows_a);
                    for($j = 0; $j < $cells; $j++) {
                        //$arrx[$i][$r]=
                        $x=$rows_a->getCells()[$j];
                        $arrx['width'][$i+1][$j+1]=$x->getWidth();
                        $arrx['text'][$i+1][$j+1]=$this->getTextElement($x);
                        //$arrx['cells'][$i+1][$j+1]=$this->cellsstyle($x);
                    }
                }
            }
        }
        return $arrx;
    }
    /**
     * 获取Text节点
     */
    private function getTextElement($E)
    {
        $elements = $E->getElements();
        $xas='';
        $result = [];
        $inResult=[];
        $text=[];
        foreach($elements as $inE) {
            $ns = get_class($inE);
            $elName = explode('\\', $ns)[3];
            if($elName == 'Text') {
                $result[] = $this->textarr($inE);
            } elseif (method_exists($inE, 'getElements')) {
                $inResult = $this->getTextElement($inE);
            }
            if(!is_null($inResult)) {
                $result = array_merge($result, $inResult);
            }
        }
        // if (count($result)>0) {
        //     foreach($result as $xaa) {
        //        var_dump($xaa);
        //     }
        // }
        return count($result) > 0 ? $result : null;
    }
    /**
     * 获取text的样式
     *
     * @param [type] $e
     * @return void
     */
    public function style($e)
    {
        $style=$e->getFontStyle();
        $arry=$style->getStyleValues();
        foreach($arry as $key=>$xas) {
            if (is_object($xas)) {
                $arry['Paragraph'][]=$xas->getStyleValues();
                unset($arry[$key]);
            }
        }
      return $arry;
    }
    /**
     * 行样式
     *
     * @param [type] $rows
     * @return void
     */
    public function rowstyle($rows)
    {
        $style=$rows->getStyle();
        $arry['TblHeader']=$style->getTblHeader();
        $arry['CantSplit']=$style->getCantSplit();
        $arry['ExactHeight']=$style->getExactHeight();
        return $arry;
    }
    /**
     * 列的样式
     *
     * @param [type] $cells
     * @return void
     */
    public function cellsstyle($cells)
    {
        $style=$cells->getStyle();
        $arry['VAlign']=$cells->getVAlign();
        $arry['TextDirection']=$cells->getTextDirection();
        $arry['BgColor']=$cells->getBgColor();
        $arry['GridSpan']=$cells->getGridSpan();
        $arry['VMerge']=$cells->getVMerge();
        $arry['Shading']=$cells->getShading();
        $arry['Width']=$cells->getWidth();
        $arry['Unit']=$cells->getUnit();
        $arry['DefaultBorderColor']=$cells->getDefaultBorderColor();
        return $arry;
    }
    public function textarr($e)
    {
        $textArr['text']=$e->getText();
        $textArr['style']=$this->style($e);
        return $textArr;
    }
}
												
											phpword读取内容和样式 生成新的内容的更多相关文章
- org.in2bits.MyXls.XlsDocument 生成excel文件 ; 如果想读取模板再另外生成的话,试试 NPOI
		
优点:不依赖Microsoft组件,在内存中操作excel,读写速度快. 缺点:无法读取模板,只能生成新的excel (我亲自测试是在读取完模板后,不能保存,也不能另存,并且其他人说这个读取还会有 ...
 - pandas 选择列或者添加列生成新的DataFrame
		
选择某些列 import pandas as pd # 从Excel中读取数据,生成DataFrame数据 # 导入Excel路径和sheet name df = pd.read_excel(exce ...
 - C#读取Word模板替换相应的字符串(标签)生成新的Word
		
在平常工作中,生成word的方式主要是C#读取html的模板文件处理之后保存为.doc文件,这样的好处是方便,快捷,能满足大部分的需求.不过有些特殊的需求并不能满足,如要生成的Word为一个表格,只是 ...
 - 编写Java程序,读取文本文档的内容,去除文本中包含的“广告”字样,把更改后的内容保存到一个新的文本文档中
		
查看本章节 查看作业目录 需求说明: 读取文本文档的内容,去除文本中包含的"广告"字样,把更改后的内容保存到一个新的文本文档中 实现思路: 在main() 方法中,使用 new F ...
 - [转]用CSS给SVG <use>的内容添加样式
		
来源:http://www.w3cplus.com/svg/styling-svg-use-content-css.html?utm_source=tuicool&utm_medium=ref ...
 - 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题
		
我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...
 - Docker 实战(二)——centos7镜像安装nginx,将安装nginx的centos容器生成新的镜像,并导出
		
Docker centos7镜像安装nginx 1.安装docker 使用yum安装docker不再重复:见 Linux常用命令 2.pull centos 1)在docker仓库中搜索centos ...
 - C#使用Linq To XML读取XML,Linq生成XML,Linq创建带属性或带节点XML
		
using System; using System.Linq; using System.Xml.Linq; namespace Sample2 { class Program { static v ...
 - php根据word模板生成新的word文件
		
原文地址:http://www.niu12.com/article/16 php使用phpword将word内容变量替换 a.安装phpword composer require phpoffice/ ...
 
随机推荐
- ::在C++中是什么意思
			
转自:https://blog.csdn.net/u012547790/article/details/22727277 ::在C++中是什么意思 今天又想了一下::在C++中是什么意思: 表示作用域 ...
 - 【题解】[SDOI2010]捉迷藏
			
题目链接:https://www.luogu.com.cn/problem/P2479 题目大意:求平面\(n\)个点中,到其它\(n-1\)个点的曼哈顿距离最大和最小距离之差最小的点,求出这个这个距 ...
 - 成理信安协会反序列化01-利用fastcoll实现md5碰撞
			
虽然是反序列化的题目,但主要考点在利用fastcoll实现md5碰撞. 直接上源码 <?php show_source(__FILE__); class CDUTSEC { public $va ...
 - 用vscode写python,from引用本地文件的时候老是有红色波浪线,很不爽
			
前言 出于一些原因,国际关系等等,最近想把开发工具切换到一些免费开源的工具上面,先尝试了在vscode上搭建python环境,总体还是很简单的, 网上教程很多,vscode本身的插件也很丰富,可惜了国 ...
 - Oracle 和 MySQL 在显示数据库名和表名的区别
			
Oracle 显示数据库名和表名 Oracle 查看表名: select table_name from user_tables; select table_name from dba_tables; ...
 - YCM 安装小记
			
layout: post title: YCM 安装小记 半夜,女朋友在那边抱怨购物车的物品秒无货,我这边刚好成功安装了vim上最难装的插件--YouCompleteMe,内心非常激动,于是本着取之于 ...
 - 【手摸手,带你搭建前后端分离商城系统】01 搭建基本代码框架、生成一个基本API
			
[手摸手,带你搭建前后端分离商城系统]01 搭建基本代码框架.生成一个基本API 通过本教程的学习,将带你从零搭建一个商城系统. 当然,这个商城涵盖了很多流行的知识点和技术核心 我可以学习到什么? S ...
 - 网站搭建-云服务器ECS的使用
			
1. 查看购买的云服务器实例,重置密码 2. 查找IP进行查看,此时网页时不存在的,开始配置: 3. 登录putty或其他终端,进行网页搭建,先按教程走一遍,然后再做个性化处理: #安装Apache ...
 - day25 Pyhton学习 MD5加密.日志
			
一.MD5加密 MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写这一套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作 import ha ...
 - 数据结构&算法的引言&时间复杂度
			
什么是计算机科学? 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已.所谓的计算机科学实际上是对问题.解决问 ...