使用phpword获取doc中的表格数据
1. 首先确定使用phpword是可以读取word文档中表格里面的数据, 使用的phpword版本0.17.0
2.理解word文档内容的存储逻辑规则(这里只做简单概述)
一般做博文喜欢直接贴代码,直接用。可这个不太行,因为输入不统一,word格式样式太多,输出也不统一,有的要输出数据,有的要输出word或者html,所以这里就追一下原理
关键词
section(部分) : phpword中将word文档分为若干个section(部分)
element(元素) : 每个section包含若干个element(元素),元素分为文本元素、表格元素、文本、图片、其他(未涉及不做讨论)
textRun(文本元素) : 每个文本集合包含多个文本
text(文本) : 为字符或者图片
table(表格元素) : 每个表格元素包含多个行 row
row(行) : 每个行包含多个列 cell
cell(列) : 每个列包含多个textRun(文本元素) 这里没错,就是包含多个文本元素(表格元素也可以但是没人在word表格的某一个格里再来一个表格吧)

3.代码实现
<?php
/**
* Created by PhpStorm.
* User: parker
* Date: 2020/10/18
* Time: 16:09
*/ namespace common\services; class WordService extends BaseService
{ public static function importWord($info)
{
$word = self::getWord($info['path']);
dd($word);
} /**
* 获取word文档内容
* @param string $path
* @return array
*/
public static function getWord($path = '')
{
//加载word文档,使用phpword处理
$phpWord = \PhpOffice\PhpWord\IOFactory::load($path);
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);
}
}
}
}
}
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);
}
}
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; } }
使用phpword获取doc中的表格数据的更多相关文章
- 在ASP.NET MVC控制器中获取链接中的路由数据
在ASP.NET MVC中,在链接中附加路由数据有2种方式.一种是把路由数据放在匿名对象中传递: <a href="@Url.Action("GetRouteData&quo ...
- Go net/http获取body中json格式数据
Go net/http获取body中json格式数据 package main import ( "encoding/json" "fmt" "io/ ...
- 数组:获取数组中最后一个数据end()函数
今天来学习一下end()函数 1.案例:直接获取数组中最后一个数据 代码部分 结果: 2.案例:从url中获取最后一个数据 代码部分: 结果: 总结: 1.有时候我们需要去获取数据库中,id最大的那个 ...
- Delphi读取不Word中不规则表格数据并转换成标准表格
程序需要,需要将word中不规则的表格数据转换为标准的表格,即合并的单元格按正常格式解析,word中的表格格式如下: 解析后数据如下: 借鉴了网上代码,如下处理: procedure TfrmMain ...
- HTML中获取input中单选按钮radio数据(性别例子)
个人学习整理 1.编写HTML <!doctype html> <html> <head> <meta charset="utf-8"&g ...
- 获取 Rancher 中 Prometheus 的数据
1.需求 在 rancher 应用商店添加集群监控,会安装 prometheus.grafana:需要从 prometheus 的 api 中收集 pod 的一些信息. 查看grafana 配置的数据 ...
- php获取post中的json数据的实现方法
最近用到腾讯微博与PHP交互,腾讯把json数据post给PHP(腾讯推送数据时,每条数据是一个json格式的数据包,作为post的数据体(请注意post数据体没有参数,不是key=value形式,整 ...
- DT包 -- R语言中自定义表格数据
DT 包提供了 JavaScript 库 DataTables 的一个R接口,它使得R对象(矩阵或数据框)可以在HTML页面上显示为表格. 该包的DataTables函数生成的表格提供了数据的筛选.分 ...
- EXTJS4.2 内存中操作表格数据时,删除表格数据,行号不连续解决
需要重新刷新下表格的view => grid.view.refresh();
随机推荐
- Linux服务器关联Git,通过执行更新脚本实现代码同步
1.在Linux服务器安装Git yum install git -y tips: 卸载Git : yum remove git 2.在Linux生成ssh key 1)创建用户 git ...
- 做一名合格的DBA
Oracle DBA的角色定义 开发型DBA 数据库安装 数据库架构设计(架构和建模) 代码开发(存储过程,SQL) 运维型DBA 数据库日常监控 故障处理 性能优化 数据备份,容灾 数据库安全规划 ...
- 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练
以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...
- Q200510-03-03 :LRU缓存机制
LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...
- MongoDB基础总结
1.数据可基本操作 1. 创建数据库 use databaseName 选择一个数据库,如果数据库不存在就自动创建一个数据库 只有向数据库中插入数据时,数据库才会被真实创建出来,而当数据库中没有数据 ...
- Linux:配置apache支持php
对apache的主配置文件进行修改 vi /application/apache/conf/httpd.conf 1.增加下面内容 AddType application/x-httpd-php .p ...
- 如何将tensorflow1.x代码改写为pytorch代码(以图注意力网络(GAT)为例)
之前讲解了图注意力网络的官方tensorflow版的实现,由于自己更了解pytorch,所以打算将其改写为pytorch版本的. 对于图注意力网络还不了解的可以先去看看tensorflow版本的代码, ...
- Vue render函数 函数时组件 jsx
常规组件使用 定义组件 components/list/list.vue <template> <ul> <li v-for="(item, index) in ...
- svn的使用学习
一:安装 1.svn安装包,语言包下载 地址:https://pan.baidu.com/s/1PFM7ya_hNJM-v979KgCpgA 提取码:mpxq 2.运行下载的TortoiseSVN程序 ...
- Depthwise Separable Convolution(深度可分离卷积)的实现方式
按照普通卷积-深度卷积-深度可分离卷积的思路总结. depthwise_conv2d来源于深度可分离卷积,如下论文: Xception: Deep Learning with Depthwise Se ...