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;
}
}