PHP读取Excel XML及效率问题
有一个需求,需要用到数据的导入。数据内容主要是快递单号及运费等,原打算用csv的,但csv的零开头问题致使快递单号无法录入,所以改用excel。但excel的操作类库就要nM,实在是不放心资源效率问题。最后决定采用EXCEL的XML格式:只要一个XML的解析类就可以搞定。
开始时选择的是大众化的DOMDocument进行XML的解析,但测试时,7,000行数据进行遍历时耗时17秒,速度太慢。所以改用SimpleXML,配合xpath进行解析。速度果然快不少,从载入文档到逐行解析完成,只需要2秒钟,快了近十倍。
但在用xpath时遇到了一个问题,怎么也解析不到内容,后来发现是xmlns命名空间的问题。EXCEL的XML格式,带有这样一个命名空间的声明:xmlns=”urn:schemas-microsoft-com:office:spreadsheet”,所以在解析时要么将该声明删除掉,要么为SimpleXML注册一个命名空间,方法如下:
$content = preg_replace(‘/&.*;/’,”,$content);
$dom = new SimpleXMLElement($content);
$dom->registerXPathNamespace(‘c’, ‘urn:schemas-microsoft-com:office:spreadsheet’);
$rows = $dom->xpath(‘//c:Workbook//c:Worksheet//c:Table//c:Row’);
第一行的作用是去除影响解析的特殊字符,
第二行初始化对像,同时载入内容,
第三行即注册一个命名空间,
第四行做xpath时,加上命名空间的引用。
在读取单元格时,可以用下面的方法:
foreach($rows as $row){
foreach($row as $cell) {
$row_cache[] = strval($cell->Data);
}
}
由此可见,SimpleXMLDocument没有读取nodeValue的方法,这里将对像转换成文本,可实现相同的功能。
