php利用phpword读取word_php读取word内容-程序员宅基地

技术标签: php相关  

1. 本次案例使用的phpword版本0.17.0

1.下载phpword

创建composer.json文件,内容如下,然后找到项目文件夹,cmd执行命令:composer install 下载文件

{
    "require": {
       "phpoffice/phpword": "v0.17.*"
    }
}

 

2.phpword 重要名词解释

section(部分) : phpword中将word文档分为若干个section(部分)

element(元素) : 每个section包含若干个element(元素)、文本、图片,元素分为文本元素、表格元素、其他(未涉及不做讨论)

textRun(文本元素) : 每个文本集合包含多个文本

text(文本) : 为字符或者图片

table(表格元素) : 每个表格元素包含多个行 row

row(行) : 每个行包含多个列 cell

cell(列) : 每个列包含多个textRun(文本元素) 这里没错,就是包含多个文本元素(表格元素也可以但是没人在word表格的某一个格里再来一个表格吧)

 

各个节点之间的关系图

 

 

3.执行代码

<?php
/**
 * Created by PhpStorm.
 * User: chengyanping
 * Date: 2021/5/19
 * Time: 13:14
 */
require_once './vendor/autoload.php';
ini_set('display_errors', true);
ini_set('max_execution_time', '0');
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);

class WordService
{

    public  function importWord($info)
    {
        $word  = self::getWord($info);
//        print_r($word);

        return $word;

    }

    /**
     * 获取word文档内容
     * @param string $path
     * @return array
     */
    public static function getWord($path = '')
    {
        //加载word文档,使用phpword处理
        $phpWord = \PhpOffice\PhpWord\IOFactory::load($path);


//        print_R($phpWord);exit();
        return self::getNodeContent($phpWord);
    }

    /**
     * 根据word主节点获取分节点内容
     * @param $word
     * @return array
     */
    public static function getNodeContent($word)
    {
        $return = [];
        //分解部分
        foreach ($word->getSections() as $section)
        {
            if ($section instanceof \PhpOffice\PhpWord\Element\Section) {
                //分解元素
                foreach ($section->getElements() as $element)
                {



                    //文本元素
                    if ($element instanceof \PhpOffice\PhpWord\Element\TextRun) {

                        $text = '';
                        foreach ($element->getElements() as $ele) {
                            $text .= self::getTextNode($ele);
                        }
                        $return[] = $text;
                    }
                    //表格元素
                    else if ($element instanceof \PhpOffice\PhpWord\Element\Table) {
                        foreach ($element->getRows() as $ele)
                        {
                            $return[] = self::getTableNode($ele);
                        }
                    }
                    //保留文本元素
                    else if ($element instanceof \PhpOffice\PhpWord\Element\PreserveText) {

                        //当是预留文本的时候
                        $text='';
                        foreach ($element->getText() as $ele=>$value)
                        {
                            $text .= $value;
                        }
                        $return[] = $text;
                    }
                }
            }
        }
        return $return;
    }

    /**
     * 获取文档节点内容
     * @param $node
     * @return string
     */
    public static function getTextNode($node)
    {
        $return = '';
        //处理文本
        if ($node instanceof \PhpOffice\PhpWord\Element\Text)
        {
            $return .= $node->getText();
        }
        //处理图片
        else if ($node instanceof \PhpOffice\PhpWord\Element\Image)
        {
            $return .= self::pic2text($node);
        }
        //处理文本元素
        else if ($node instanceof \PhpOffice\PhpWord\Element\TextRun) {
            foreach ($node->getElements() as $ele) {
                $return .= self::getTextNode($ele);
            }
        }//处理保留文本
        else if ($node instanceof \PhpOffice\PhpWord\Element\PreserveText) {
            $return .= $node->getText();
        }
        return $return;
    }

    /**
     * 获取表格节点内容
     * @param $node
     * @return string
     */
    public static function getTableNode($node)
    {
        $return = '';
        //处理行
        if ($node instanceof \PhpOffice\PhpWord\Element\Row) {
            foreach ($node->getCells() as $ele)
            {
                $return .= self::getTableNode($ele);
            }
        }
        //处理列
        else if ($node instanceof \PhpOffice\PhpWord\Element\Cell) {
            foreach ($node->getElements() as $ele)
            {
                $return .= self::getTextNode($ele);
            }
        }
        return $return;
    }

    /**
     * 处理word文档中base64格式图片
     * @param $node
     * @return string
     */
    public static function pic2text($node)
    {
        //获取图片编码
        $imageData = $node->getImageStringData(true);
        //添加图片html显示标头
        $imageData = 'data:' . $node->getImageType() . ';base64,' . $imageData;
        $return = '<img src="'.$imageData.'">';
        return $return;
    }
    /**
     * 处理word文档中base64格式图片
     * @param $node
     * @return string
     */
    public static function pic2file($node)
    {
        //图片地址(一般为word文档地址+在word中的锚点位置)
        $imageSrc  = 'images/' . md5($node->getSource()) . '.' . $node->getImageExtension();
        $imageData = $node->getImageStringData(true);
        //将图片保存在本地
        file_put_contents($imageSrc, base64_decode($imageData));
        return $imageSrc;
    }

    /**
     * 将word转化为html(转换存储html文件后展示)
     * @param $path
     * @throws \PhpOffice\PhpWord\Exception\Exception
     */
    public static function word2html($path)
    {
        $phpWord = FileImportService::getOne($path);
        //转为html处理
        $xmlWriter  = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "HTML");
        $path = pathinfo($path);
        $fileName = $path['dirname'] . '/' . $path['filename'] . '.html';
        $xmlWriter->save($fileName);
        $html = file_get_contents($fileName);
        echo $html;
        die;

    }




    public function deleteFile($filePath)
    {
        if (file_exists($filePath)) {
            $tt=unlink($filePath);

            return $tt;
        }
        else {

            return false;
        }

    }


}

 

 

 

参考文献:1.https://github.com/PHPOffice/PHPWord

                   2.https://phpword-zh.readthedocs.io/zh_CN/latest/intro.html

参考文章:https://www.cnblogs.com/haizizhu/p/13808155.html

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010057935/article/details/117024906

智能推荐

基于51单片机的双通道DHT11温湿度显示器(LCD1602)_一条总线同时测量多个dht11-程序员宅基地

文章浏览阅读7k次,点赞24次,收藏109次。基于51单片机的双通道DHT11温湿度显示器(LCD1602)前言新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言这是单片机系统的课程大作业,做的有点仓促,代码其实也可以再优化一下,在这里抛砖引玉,希望能给大家带来一_一条总线同时测量多个dht11

微信开发的概念_omcwx-程序员宅基地

文章浏览阅读746次。微信开发的概念什么是微信开发微信这个软件,提供了聊天、支付、分享、收藏等各种功能,同时用户基数庞大;微信对外开放了很多接口和能力,程序员基于这些功能进行的二次开发,叫做微信开发微信开放平台微信开放平台是微信对外提供微信开放接口的一个平台,这些开放出来的微信接口,供第三方的网站或App使用;平台登录地址:https://open.weixin.qq.com微信开放平台的能力微信分享..._omcwx

Java Array、List、Set 互相转化_array 转set-程序员宅基地

文章浏览阅读582次。Java Array、List、Set 互相转化Array 转 ListString[] s = new String[]{"A", "B", "C", "D","E"};List<String> list = Arrays.asList(s);注意 list 的元素直接引用 s 的元素,换句话就是说:对 s 的修改,直接影响 list。s[0] ="F";System.out.println("list: " + list);List 转 ArrayString[] des_array 转set

maven 初次使用出现Could not transfer artifact 个人方法尝试经验_could not transfer artifact com.fasterxml.jackson:-程序员宅基地

文章浏览阅读1.8w次,点赞8次,收藏3次。1.配置阿里巴巴的私服镜像:在mirros元素中增加一个mirros元素。指向阿里云的下载地址。<mirrors><mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/..._could not transfer artifact com.fasterxml.jackson:jackson-bom:pom:2.8.8

xxljob部署及基本使用_java tomcat xxl-job配置-程序员宅基地

文章浏览阅读2.7k次。文档上github官方说明文档https://github.com/xuxueli/xxl-job_java tomcat xxl-job配置

《操作系统原理》学习笔记:第3章 操作系统内存管理_《操作系统原理》这门课程系统讲解了现代操作系统的处理机管理,内存管理,文件管理-程序员宅基地

文章浏览阅读518次。前言:该系列文章为笔者学习清华大学《操作系统原理》相关课程笔记,参考书籍《操作系统概念》《现代操作系统等》。如果涉及相关书籍或课程版权,联系即删~《操作系统原理》学习笔记:第3章 操作系统内存管理3.1 计算机体系结构3.2 地址空间&地址生成3.3 连续内存分配3.3.1 内存碎片与分区的动态分配3.3.2 压缩式与交换式碎片整理3.1 计算机体系结构计算机基本硬件结构内存的层次结构操作系统在内存中需要完成的工作抽象(逻辑地址空间)不需要考虑底层细节,比如外设地址保护_《操作系统原理》这门课程系统讲解了现代操作系统的处理机管理,内存管理,文件管理

随便推点

php - 创建 cookie 与访问(会话控制)_php cookie会话隔离-程序员宅基地

文章浏览阅读3.3k次。前言由服务器发送到浏览器的变量,cookie 常用于识别用户,cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP 能够创建并取回 cookie 的值。setcookie()开始之前,先来看一下该函数,它向客户端发送一个 HTTP cookie。语法:setcookie(name, value, expire..._php cookie会话隔离

git忽略本地文件的修改;撤销本地merge;撤销本地commit_git忽略本地修改-程序员宅基地

文章浏览阅读2.4k次。git忽略已经提交的文件在本地的修改_git忽略本地修改

微信小程序 - 校验用户输入的手机号 / 身份证号 / 邮箱(正则表达式)_小程序手机号填写校验-程序员宅基地

文章浏览阅读4.4k次。前言这里提供了正则表达式的校验方法,具体业务逻辑请自行更改。手机号校验phone 为用户输入的手机号。if (!(/^1[34578]\d{9}$/.test(phone))) { console.log("手机号错误!")}else { console.log("手机号正确!")}身份证号校验id 为用户输入的身份证号。if (!(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(id))) { console.log("身_小程序手机号填写校验

Vue.set 修改数组中的值_vue 设置数组的值-程序员宅基地

文章浏览阅读6.8k次。因JavaScript规则 我们无法在vue中通过这样this.outdata[0]='ddd'去改变数组中下标的值,页面不会触发更新所以此时要改变就需要用到Vue.set上demo<template> <div class="hello"> <h1>vue.set</h1> ..._vue 设置数组的值

Tomcat的介绍和环境搭建_tomcat在什么环境下部署的-程序员宅基地

文章浏览阅读1.4k次。Tomact的介绍与环境的配置写在前面: JSP 离不开 tomact,在开始我的tomact搭建除了一些问题,所以导致,在创建WEB项目的时候,出现许多莫名奇妙的问题,现在完整将Tomact的介绍和环境的搭建完整的整理出来,以便之后的参看和像我一样的初学者查看学习。1、Tomact是什么?Tomcat 是由 Apache 软件基金会属下 Jakarta 项目开发的 Servlet 容器,是..._tomcat在什么环境下部署的

msyql解析JSON字符串或JSON数组_msqyl getjson-程序员宅基地

文章浏览阅读195次。需要分析JSON字符串数据可以使用JSON_EXTRACT 函数JSON 字符串json_extract(JSON,"$.key") 可以获取到valueJSON 数组JSON_EXTRACT(JSON_ARRAY,"$[0].key")可以获取到第一个JSON数组里的value$[*]_msqyl getjson

推荐文章

热门文章

相关标签