如何统计Excel表格中指定部分的字数?

背景

如今很多译者从客户那里接到的待译文件格式都五花八门,如果客户给一个Word文档那就已经谢天谢地了,这样的客户绝对能评上“年度甲方爸爸”。可要是遇上这样的情况:客户提供的都是Excel表格,尤其是那种ShitSheet特别多内容又特别多的Excel表格,那么光统计要翻译的文本的字数就够译者喝一壶的。

所以在今天的这篇帖子中,我就准备仔细说一下如何统计Excel表格中指定部分的字数。

正文

首先,我先给大家介绍一下我准备使用的演示材料和程序开发需求。

我做了一个演示用的Excel表格,如下:

我一共建了三个表,分别是:表一、表二和表三。每个表中都有三列,分别是:ID、原文和译文。

我们要翻译的是原文,要把译文填充在“译文”列。

我希望通过一段程序一次性统计三个表中的“原文”一列的所有中文的字数。

实现方法

第一步:设置好编程环境,并将演示文件存入指定的文件夹中

我将刚刚创建的演示文件存入指定的文件夹中,如下图:

第二步:安装一个名为“PHPExcel”的PHP插件

地址:https://github.com/PHPOffice/PHPExcel

安装方法:从上述地址下载名为“Classes”的文件夹,并将其存储在本地编程环境指定文件夹的根目录中,在这里我存储在“excel”文件夹中,如下图:

第三步:在根目录中创建一个“index.php”文件,用来撰写代码处理“files”文件夹中的演示文件。

如下图:

第四步:打开“index.php”开始撰写代码

1、引入PHPExcel插件

在上图中可以看到五行代码,前三行的作用是导入刚刚我下载并安装的PHPExcel插件。

第四行和第五行的作用是从“files”文件夹中读取名为“Test.xlsx”的演示文件,并将其放在一个名为“$excel”的变量中。

我们统计Excel表格中的指定内容时,实际上就是在处理这个叫“$excel”的变量。

2、读取Excel表格数据

那么我们接下来就去读取Excel表里的数据:

在新增的代码中,实际上有两部分内容:

上图第“9”行的代码中的“getSheetCount()”函数用于统计Excel表格中有多少个工作表,并且把统计结果放在“$sheetCount”变量中。

上图的第“11-15”行代码用户遍历每一个工作表,并且把工作表中所有的结果以数组的形式存储在“$data”变量中。

上面代码运行后的结果为:

到了这一步,我们已经把Excel表中所有工作表的内容都读取出来了,我们接下来要做的就是把所有表中第二列“原文”单独显示出来。

我们先仔细看看上面这些数据是怎么生成的?

我们的演示材料里头有三个表,这个“3”被赋到了“$sheetCount”变量中。

下面展示的是一个循环功能:

for($i=0; $i

echo $i;

}

可以这样解释:

我们新建一个叫“$i”的变量,这个变量的初始值为“0”($i=0;);它的值不能大于“$sheetCount”,也就是小于“3”($i

而“echo $i;”的功能就是打印“$i”的值。

所以,上面这段简单的循环功能执行后的结果就是:“012”,因为当“$i=3”的时候,“$i”就已经大于“$sheetCount”了,就不会再执行中括号里的结果了。

理解了这段代码的功能,我们再去理解我前面写的那段代码:

for($i=0; $i

$data = $excel->getSheet($i)->toArray();

echo '

';

print_r($data);

}

当“$i=0”时,我们新建的这个叫“$data”的变量的值为:$excel->getSheet(0)->toArray()

“$excel”这个变量前面已经介绍了,里面装的是整个Excel表格;

“getSheet(0)”的功能是获取Excel表格的第一个工作表(Sheet),大家会很奇怪,为什么第一个工作表对应的序号是“0”,我就不给大家展开讲了,简单来说就是,程序员在数数时都是从“0”开始数的。

“toArray()”的功能就是将第一个工作表的内容变成一个数组(Array),如下:

Array( [0] => Array ( [0] => ID [1] => 原文 [2] => 译文 ) [1] => Array ( [0] => 1 [1] => 翻译 [2] => ) [2] => Array ( [0] => 2 [1] => 编程 [2] => ) [3] => Array ( [0] => 3 [1] => 文字 [2] => ) [4] => Array ( [0] => 4 [1] => 代码 [2] => ) [5] => Array ( [0] => 5 [1] => 码农 [2] => ))

这个工作表原本是什么样的呢?如下图:

仔细对比前面的“数组”和上面的“表格”,你会发现这样的规律:

我们的“表格”一共有六行,第一行是表头,第二行到第六行是表格的正文。

程序得到的“数组”是一行一行的读取“表格”中的数据的,把每一行数据放到了一个“组”里,如“表格”的第一行变成了如下的数组:

[0] => Array ( [0] => ID [1] => 原文 [2] => 译文 )

这个数组的编号是“0”,“原文”一列的编号是“1”。

知道了上面的规律后,我们就可以开始考虑“初心”了。我们的初心是:

“统计三个表中的“原文”一列的所有中文的字数”。

也就是说我们想统计的是第“1”到“5”个数组的的编号是“1”的部分的中文字数的总和。

3、在浏览器中呈现要统计的文本

下面,我们一起来构建代码:

当“$i=0”时,我们想获得的是第“1”个数组的第“1”列,第“2”个数组的第“1”列,“第3”个数组的第“1”列......直到,所有五行数据的第“1”列都被读取了出来;

当“$i=1”时,我们想获得也是第“1”个数组的第“1”列,第“2”个数组的第“1”列,“第3”个数组的第“1”列......直到,所有五行数据的第“1”列都被读取了出来;

......

如下面的代码:

for($i=0; $i

$data = $excel->getSheet($i)->toArray();

echo '

';

echo $data[1][1];

echo $data[2][1];

echo $data[3][1];

echo $data[4][1];

echo $data[5][1];

}

得到的结果如下:

打眼一看,确实所有的内容都读取出来了,可是如果我想要的数据超过5行怎么办?如果三个工作表中的数据行数不一致怎么办?

因此,我们还得换个更方便的写法:

for($i=0; $i

$data = $excel->getSheet($i)->toArray();

echo '

';

for($j=1;$j

{

echo $data[$j][1];

}

}

在上面这段代码中,我们设置了一个新的变量“$j”,赋予它初始值为“1”,它的值小于整个工作表的总行数“count($data)”,每次执行完“$data[$j][1]”后“$j”的值自加1,直至工作表中所有行的“原文”列结果全部打印出来。

上面代码的执行结果和前面那个是一样的。

如果要想让所有中文都单独一行呈现的话,再一个换行即可,如下面的代码:

for($i=0; $i

$data = $excel->getSheet($i)->toArray();

echo '

';

for($j=1;$j

{

echo $data[$j][1];

echo "

";

}

}

运行效果如下图:

下面,我们就可以把这些内容粘贴到“MS Word”中去统计了,当然也可以再写一段代码就在这个页面中显示所有的单词。

4、统计中文字数

我之前写过一篇文章:做了一个简单的在线字数统计工具,里面有我写的在线字数统计工具(http://translation.education/count/)把文本粘贴到里面也可以,如下图:

结语

至此,我们就完成了一个非常简单的使用PHP统计Excel表格指定部分字数的程序,总有效代码行数为:13。

下图为全部代码:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180406G0M0ZY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券