昨天一位朋友找到我,说他手上有几千个word表格需要转换到一个excel文件里,他在网上也没有找到满足需求的软件,于是让我帮忙用程序实现。
需求
需求如下图所示:每个文档文档中有一个或多个格式固定的表格,需要把每一个word表格转换为excel文件里的一行。
from:
to:
寻找解决方案
我首先想到的是用PHP读取word文档,处理之后转成excel。
转成excel比较简单,使用PHP系统函数fputcsv就可以搞定,现在需要做的是读取到word文档里的内容。
紧接着我便去网上查找,看有没有PHP的扩展能够读取word文档。
在Github搜索到一个叫做 PHPWord 的扩展,不过遗憾的是,这个扩展只能往word文档里写入内容,并不能读取。
我又想,能不能把word转成其他格式再读取。
于是我将word文档的后缀改成了txt,打开文件后内容如下图。
密密麻麻的一大堆,反正我是没能从中找到什么规律,于是放弃了这种方法。
接着我在word的另存为功能中,发现可以另存为其他格式。
于是选择保存为htm文件,随后在浏览器中打开转换好的文件,发现表格转换成了html中的table表格,非常标准。
这样我只需要遍历读取htm文件,获取其中的内容,再进行相应处理便能得到最终数据。
进行处理
准备
首先我在网上下载了软件,将word文档批量转换为htm文件,并放在同一目录下
读取文件内容
我们事先将所有转换好的文件放在了同一目录下,所以只需要遍历该目录,并使用file_get_contents()函数就能获取到每个文件的内容。
提取有用内容
查看htm源代码能发现,每个word表格转换后变成了一个html表格,只需要先取到
标签里的内容,然后再按行分割,按列分割,便能得到我们想要的数据了。附上简略代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71function ()
{
//写入文档头部
$fileName = './data.csv';
file_put_contents($fileName,'');
$handle = fopen($fileName, 'w');
fwrite($handle, chr(0xEF).chr(0xBB).chr(0xBF)); // 写入BOM头,防止乱码
$titleArr = ['A' => '样品类型', 'B' => '图幅编号'];//次数省略
fputcsv($handle, $titleArr);
return $handle;
}
//读取文件夹下的所有文件
function scanFile($path)
{
$result = [];
$files = scandir($path);
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
$result[] = basename($file);
}
}
return $result;
}
//提取表格内容
function getContents()
{
$filesArr = scanFile('./');
$handle = writeExcelHeader();
foreach ($filesName as $k => $v){
//读取文件内容
$text = file_get_contents($path . $v);
//转换编码
$text = iconv("gb2312", "utf-8//IGNORE",$text);
//去除html标签多余属性
$text = preg_replace("/]*>/","",$text);
//提取表格内容
preg_match_all("/
/is",$text,$matches);//处理表格内容
foreach ($matches[1] as $match){
html2excel($match, $handle);
}
}
//处理表格内容
function convert($content)
{
$res = [];
//按行拆分
$trArr = explode('
', $content);foreach ($trArr as $k => $tr){
//去除多余标签
$tr = str_replace('
','', $tr);//按列拆分
$tdArr = explode('
', $tr);foreach ($tdArr as $kk => $td){
//去除多余标签
$td = str_replace('
','', $td);//去除html标签 得到内容
$text = strip_tags($td);
$res[] = $text;
}
}
fputcsv($handel, $res);
}
getContents();
最后
使用到的一些函数:iconv() 编码转换
preg_replace() 使用正则替换文本
preg_match_all() 使用正则获取内容
strip_tags() 去除文本中的html标签
str_replace() 文本替换
fputcsv() 将制定内容写入csv文件