26 Star 67 Fork 13

纵使有花兼明月何堪无酒亦无人 / Xavxls

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

#Xavxls Xavxls是一个读取xls文件的PHP扩展(暂不支持写入)。在PHP开发中经常会读取excel,xlsx格式文件采用php直接读取速度还可以接受,xls格式文件就无法忍受了,一个10M的xls,根本就可以宣告无法读取了,因为消耗的内存和CPU实在太大了,而且慢的无可救药。因此,Xavxls就应运而生了

2017年1月10日,我的项目在osc被推荐了,这个是第一次被推荐。鸡冻好一会。

##Xavxls 编译环境搭建 ###Xavxls目录结构 phpcpp phpcpp的源码,一种采用C++来快速开发PHP扩展的sdk

libxls C语言读取xls的库

xavxls Xavxls 项目源码 ###编译PHPCPP http://www.php-cpp.com/

git clone git@git.oschina.net:xavier007/Xavxls.git
cd phpcpp
make
sudo make install

项目中自带的PHPCPP是开发xavxls采用的版本,也可以直接从官网下载。由于PHPCPP版本问题,只支持PHP7或PHP7 up。如果需要支持PHP5.X可以下载PHPCPP的另外一个版本PHP-CPP-LEGACY,其中PHP-CPP-LEGACY和PHPCPP的API是一样的,只是为了兼容PHP7而开发的新的PHPCPP,所以老的版本重新取了个名字而已。

PHPCPP PHP7版本 github下载地址 https://github.com/CopernicaMarketingSoftware/PHP-CPP

PHP-CPP-LEGACY PHP5.X版本 github下载地址 https://github.com/CopernicaMarketingSoftware/PHP-CPP-LEGACY

###编译LIBXLS libxls项目地址http://libxls.sourceforge.net/ libxls是一个跨平台的xls读取库 上传的时候文件权限丢失了,需要给configure添加执行权限,如果从官网下载请注意版本号,官网默认下载的版本和开发xavxls的版本不同,编译时会造成一些问题

chmod +x configure
./configure
make
sudo make install

由于头文件跟库文件的目录放的位置不对,所以需要手动把它们拷贝到系统路径下面去

cp -r -v /usr/local/libxls/include/libxls/ /usr/include
cp -r -v /usr/local/libxls/lib/ /usr/lib

cp -r -v /usr/local/libxls/include/xls.h /usr/include

一个简单的例子:read_xls.c

#include <stdio.h>  
#include <stdlib.h>  
#include <xls.h>  
#include <unistd.h>  
#include <string.h>  
int main(int argc, char **argv) {  
  xlsWorkBook *pWb;  
  xlsWorkSheet *pWs;  
  struct st_row_data *row;  
  int r,c;  
  char buf[512], result[512];  
  
  if (argc < 2) {  
    fprintf(stderr, "please input the xml file.");  
    return EXIT_FAILURE;  
  }  
  
  pWb = xls_open(argv[1], "UTF-8");  
  if (NULL == pWb) {  
    fprintf(stderr, "File not found!\n");  
    return EXIT_FAILURE;  
  }  
  
  pWs = xls_getWorkSheet(pWb, 0);   
  xls_parseWorkSheet(pWs);  
  
  for (r=0; r<=pWs->rows.lastrow; r++) {  
    row = &pWs->rows.row[r];  
  
    for (c=0; c<=pWs->rows.lastcol; c++) {  
      if (row->cells.cell[c].str != NULL) {  
        printf("%s\t",  
            row->cells.cell[c].str);  
      }     
    }     
    printf("\n");  
  }  
  
  xls_close_WS(pWs);  
  
  xls_close_WB(pWb);  
  
  return 0;  
}  

编译运行

error while loading shared libraries: libxlsreader.so.1: cannot open shared  

出现这类错误表示,系统不知道xxx.so放在哪个目录下,这时候就要在/etc/ld.so.conf中加入xxx.so所在的目录。 一般而言,有很多的so会存放在/usr/local/lib这个目录底下,去这个目录底下找,果然发现自己所需要的.so文件。

所以,在/etc/ld.so.conf中加入/usr/local/libxls/lib这一行,保存之后,再运行:/sbin/ldconfig –v更新一下配置即可。

或者在/etc/ld.so.conf.d/下新建一个.conf文件,并在其中加入目标路径就可以了,在运行/sbin/ldconfig

###编译安装Xavxls

git clone git@git.oschina.net:xavier007/Xavxls.git
cd xavxls
make
sudo make install

编辑PHP.ini添加

extension=Xavxls.so

#为什么开发Xavxls

如果你做PHP开发,且经常需要读取xls,如果你用原生PHP来开发,比如采用phpexcel(一个很优秀的PHP EXCEL类库),excel文件很小还好,如果有2M,3M,甚至10M,你会怎么处理呢?增加PHP的运行时间,防止30秒挂掉,增加PHP的内存限制,防止读取excel的时候内存不足。PHP运行时间增加对整个服务的影响是很大的,为什么?因为处理xls格式比较慢,比如10M的excel,默认的内存限制肯定是不够用的,至少需要开到500M以上,时间肯定不是10S可以搞定的,对于一个10人同时访问的网站来说,消耗的内存就到达到四五G了,好恐怖吧!10来个人的网站消耗就这么大!

#Xavxls 接口

setfilename 参数 文件名,编码 ,无返回

$xav=new Xavxls();
$xav->setfilename('test2.xls','UTF-8');

inititerator 参数sheet的编号 从0开始,如第一个sheet就是0

$xav->inititerator(0);

getversion 返回版本号

$xav->getversion();

getsheetname 参数 sheet编号, 返回指定编号的名字 如第一个sheet名字为sheet1,

$xav->getsheetname(0);//输出sheet1

getsheetcount 返回sheet的个数

$xav->getsheetcount();

GetRowCount 参数 sheet编号 获取指定sheet的总行数

$xav->GetRowCount(0);

GetColCount 参数 sheet编号 获取指定sheet的总列数

$xav->GetColCount(0);

GetCell 参数 sheet编号 ,行,列 行和列必须大于等于1, 返回指定cell的内容

$xav->GetCell(0,1,2);

#测试

采用原生PHP操作14.6M的excel直接提示内存不足了 使用的PHPEXCEL

<?php
echo memory_get_usage(), '<br />'; 
 $starttime = explode(' ',microtime());
 echo microtime();


include "Classes/PHPExcel.php";
$PHPExcel=new PHPExcel();
$PHPReader=null;

include "Classes/PHPExcel/Reader/Excel5.php";
$PHPReader=new PHPExcel_Reader_Excel5();
$PHPExcel=$PHPReader->load('1.xls');
$currentSheet = $PHPExcel->getSheet(0);        
$allColumn = $currentSheet->getHighestColumn();        
$allRow = $currentSheet->getHighestRow();  
for($rowIndex=2;$rowIndex<=$allRow;$rowIndex++){ 
		$data = array();       //循环读取每个单元格的内容。注意行从1开始,列从A开始
		        for($colIndex='A';$colIndex<=$allColumn;$colIndex++){
                        $addr = $colIndex.$rowIndex;
		                $cell = $currentSheet->getCell($addr)->getValue();
                }
}
 $endtime = explode(' ',microtime());
 $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);
 $thistime = round($thistime,3);
 echo "执行耗时:".$thistime." 秒。".time();

 echo "消耗内存:".memory_get_usage(); 

采用xavxls提示 执行耗时:39.002 秒。消耗内存:358000

<?php
echo memory_get_usage(), '<br />'; 
 $starttime = explode(' ',microtime());
 echo microtime();
$xav=new Xavxls();
$xav->setfilename('1.xls','UTF-8');

$xav->inititerator(0);
echo $col=$xav->GetColCount(0);
echo $row=$xav->GetRowCount(0);

for($i=1;$i<$row;$i++){
    for($j=1;$j<$col;$j++){
        $xav->GetCell(0,$i,$j);
    }
}

 $endtime = explode(' ',microtime());
 $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);
 $thistime = round($thistime,3);
 echo "执行耗时:".$thistime." 秒。".time();

 echo "消耗内存:".memory_get_usage(); 

对于1-2M的excel都是0.2-0.4s就处理完了,用phpexcel肯定需要好几秒

358000byte=0.341415M内存 采用xavxls后处理14.6M的excel才消耗这么点内存,是不是很省,同时速度也很快

TODO

增加对xlsx的支持 增加对公式的支持

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2017 纵使有花兼明月何堪无酒亦无人 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

PHP excel xls读取扩展,目前仅支持xls格式。提示:请按说明操作,请勿下载libxls官网包,官方版可能和开发xavxls时所用版本不一致 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/xavier007/Xavxls.git
git@gitee.com:xavier007/Xavxls.git
xavier007
Xavxls
Xavxls
master

搜索帮助

14c37bed 8189591 565d56ea 8189591