使用phpexcel操作excel

phpexcel的官方网站>>

使用这个组件最让我郁闷的是,它对sheet的名称为中文的不进行处理,暂时还没仔细去查原因。

对excel的操作,无非有两种:读与写,分别对应的为phpexcel中的writer与reader类。

phpexcel中的方法很多,若不是特殊的需求,常用的一些已经够用了。下面直接看例子,思路应该是比较清晰的:

1、写excel:

1: <meta http-equiv="content-type" content="text/html; charset=utf-8">

       2: <title>对excel的测试实例_1</title>

       3: <?php

       4:  

       5: error_reporting(E_ALL);

       6:  

       7: //设置时区

       8: date_default_timezone_set('Asia/Shanghai');

       9:  

      10: require_once 'Classes/PHPExcel.php';

      11:  

      12: echo '当前时间:'.date('Y:m:d H:i:s');

      13:  

      14: //创建excel操作对象

      15: $objPHPExcel = new PHPExcel();

      16:  

      17: $objPHPExcel->getProperties()->setCreator("Meteoric_cry")

      18:                              ->setLastModifiedBy("Meteoric002")

      19:                              ->setTitle("Php_excel_demo1")

      20:                              ->setSubject("主题1")

      21:                              ->setDescription("随便一个描述了")

      22:                              ->setKeywords("关键字 用空格分开")

      23:                              ->setCategory("分类 ");

      24:  

      25: //激活第一个选项, 然后填充数据

      26: $objPHPExcel->setActiveSheetIndex(0)

      27:             ->setCellValue('A1', 'Hello')

      28:             ->setCellValue('B2', 'world!')

      29:             ->setCellValue('C1', 'Hello')

      30:             ->setCellValue('D2', 'world!');

      31:  

      32: $objPHPExcel->setActiveSheetIndex(0)

      33:             ->setCellValue('A4', 'Miscellaneous glyphs')

      34:             ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

      35:  

      36: //对第一个选项进行重命名            

      37: $objPHPExcel->getActiveSheet()->setTitle('重新命令');

      38:  

      39:  

      40: $objPHPExcel->setActiveSheetIndex(0);

      41:  

      42: //写操作

      43: $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

      44: $objWriter->save(str_replace('.php', '.xlsx', __FILE__));

      45:  

      46: echo "<br/>消耗的内存为:".memory_get_peak_usage(true) / 1024 / 1024;

      47: echo '<div>文件名:'.__FILE__.'</div>';

      48: echo '<div>php编译的行数:'.__LINE__.'</div>';

      49: echo '<div>php的类名:'.__CLASS__.'</div>';

      50: ?>

运行后,会发现在当前目录下生成一个与php名称对应的excel文件

上面主要需要注意的是:createWriter方法,它的实现方法是:

1: /**

       2:      *    Create PHPExcel_Writer_IWriter

       3:      *

       4:      *    @static

       5:      *    @access    public

       6:      *    @param    PHPExcel $phpExcel

       7:      *    @param    string  $writerType    Example: Excel2007

       8:      *    @return    PHPExcel_Writer_IWriter

       9:      *    @throws    Exception

      10:      */

      11:     public static function createWriter(PHPExcel $phpExcel, $writerType = '') {

      12:         // Search type

      13:         $searchType = 'IWriter';

      14:  

      15:         // Include class

      16:         foreach (self::$_searchLocations as $searchLocation) {

      17:             if ($searchLocation['type'] == $searchType) {

      18:                 $className = str_replace('{0}', $writerType, $searchLocation['class']);

      19:                 $classFile = str_replace('{0}', $writerType, $searchLocation['path']);

      20:  

      21:                 $instance = new $className($phpExcel);

      22:                 if (!is_null($instance)) {

      23:                     return $instance;

      24:                 }

      25:             }

      26:         }

      27:  

      28:         // Nothing found...

      29:         throw new Exception("No $searchType found for type $writerType");

      30:     }    //    function createWriter()

而对应的excel文件类型有如下这些:

1: /**

       2:      *    Autoresolve classes

       3:      *

       4:      *    @var    array

       5:      *    @access    private

       6:      *    @static

       7:      */

       8:     private static $_autoResolveClasses = array(

       9:         'Excel2007',

      10:         'Excel5',

      11:         'Excel2003XML',

      12:         'OOCalc',

      13:         'SYLK',

      14:         'Gnumeric',

      15:         'CSV',

      16:     );

同样的,对于读操作也是如此。只不过可能省略设定类型。

2、读Excel文件:

读取excel有两种方式:

1: //first method

       2: $objReader = PHPExcel_IOFactory::createReader("Excel2007");

       3: $objPHPExcel = $objReader->load($fileName);

       4:  

       5: //second method

       6: $objPHPExcel = PHPExcel_IOFactory::load($fileName);

不过使用第一种,编辑器里就没有提示方法显示了,所以我选的第二种,反正它会根据后缀名判定excel的类型。

读取excel文件,关键的有如下几点:

1、需要获取所有的记录行数

  可使用 $objPHPExcel->getActiveSheet()->getRowDimensions()可获取到所有行记录的记录集合(一个数组array)

2、需要获取最大的列数

可使用$objPHPExcel->getActiveSheet()->getColumnDimensions();方法获取,返回的也是一个数组集合

3、如何读取某一行中指定列的内容

可使用$objPHPExcel->getActiveSheet()->getCellByColumnAndRow($cellIndex, $rowIndex)->getValue(),指定列数(注意列在前面,行在后面),再调用它的getValue()就可以得到内容

得到两人上数组,然后循环获取每一行中各列的数据,再对数据根据需求进行处理就好了。完整的示例代码:

1: <meta http-equiv="content-type" content="text/htm; charset=utf-8">

       2: <title>excel转化为sql脚本</title>

       3: <?php

       4: error_reporting(E_ALL);

       5: date_default_timezone_set("Asia/Shanghai");

       6:  

       7: $startTime = time();

       8:  

       9: echo "<div>现在时间:".date("Y:m:d H:i:s")."</div>";

      10:  

      11: require_once '../Classes/PHPExcel/IOFactory.php';

      12:  

      13: $fileName = dirname(__FILE__)."/task_list.xlsx";

      14:  

      15: if (!file_exists($fileName)) {

      16:     exit("文件".$fileName."不存在");

      17: }

      18:  

      19: //$objReader = PHPExcel_IOFactory::createReader("Excel2007");

      20: //$objPHPExcel = $objReader->load($fileName);

      21: $objPHPExcel = PHPExcel_IOFactory::load($fileName);

      22: $sheetCount = $objPHPExcel->getSheetCount();

      23:  

      24: $sheetSelected = 0;

      25: $objPHPExcel->setActiveSheetIndex($sheetSelected);

      26:  

      27: $rowArray = $objPHPExcel->getActiveSheet()->getRowDimensions();

      28: $cellArray = $objPHPExcel->getActiveSheet()->getColumnDimensions();

      29: $rowCount = count($rowArray);

      30: $cellCount = count($cellArray);

      31:  

      32: echo "<div>Sheet Count : ".$sheetCount."  行数: ".$rowCount."  列数:".$cellCount."</div>";

      33:  

      34: $rowIndex = 0;

      35: $cellIndex = 0;

      36: $rowData = NULL;

      37:  

      38: $dataArr = array();

      39:  

      40: while ($rowIndex < $rowCount) {

      41:     $cellIndex = 0;

      42:     

      43:     $rowData = $objPHPExcel->getActiveSheet();

      44:     

      45:     array_push($dataArr, "<div style='margin-top:20px;'>");

      46:     while ($cellIndex < $cellCount) {

      47:         array_push($dataArr, "<div>".$rowData->getCellByColumnAndRow($cellIndex, $rowIndex)->getValue()."</div>");

      48:         $cellIndex++;

      49:     }

      50:     array_push($dataArr, "</div>");

      51:     

      52:     $rowIndex++;

      53: }

      54:  

      55: echo "<br/>消耗的内存为:".(memory_get_peak_usage(true) / 1024 / 1024)."M";

      56:  

      57: $endTime = time();

      58:  

      59: echo "<div>解析完后,当前的时间为:".date("Y-m-d H:i:s")."   总共消耗的时间为:".(($endTime - $startTime))."秒</div>";

      60:  

      61: echo implode("", $dataArr);

      62:  

      63: $dataArr = NULL;

      64: ?>

对于相对路径来讲,可以不使用魔术变量__FILE__,思路在那里,只要不写成死循环,实现了功能就达到了预期的目的。其实上面的代码是比较消耗内存的,因为内存中把存放两次数据:一个是列记录数组,一个是行记录数组,还有一个是每一行名列的数据。如果先创建一个文件,然后将数据逐行写入文件中,会减少一些对内存的开销。

预览一下最终的效果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒网络空间安全讲武堂

nox&amp;CSAW部分pwn题解

暑假的时候遇到了一群一起学习安全的小伙伴,在他们的诱劝下,开始接触国外的CTF比赛,作为最菜的pwn选手就试着先打两场比赛试试水,结果发现国外比赛真有意思哎嘿。

1743
来自专栏生信宝典

ETE构建、绘制进化树

ETE能做什么 A Python framework for construction, analysis and visualization of trees...

7065
来自专栏Java学习网

Java Web Response对象的27个方法及状态码

response表示HttpServletResponse对象,主要将JSP容器处理后的结果传回到客户端。 ? 网络配图 1、void addCookie(...

3687
来自专栏Jerry的SAP技术分享

ERP和C4C中的function location

SAP ERP里的Functional Locations,下载到SAP Cloud for Customer后成为类型为‘Functional Locatio...

982
来自专栏大内老A

通过自定义配置实现插件式设计

软件设计有一句话叫做“约定优于配置”,很多人将其作为拒绝配置的理由。但是,“约定”和“配置”的使用,都有个度的问题。我不赞为了所谓的扩展性,为你的应用设计一套只...

2398
来自专栏我有一个梦想

QT Creator 快速入门教程 读书笔记(三)

一   信号和槽   GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘、绘制完成、点击鼠标、敲击键盘等。当事件发生时,UI 会产生相应的变化,让用户...

2628
来自专栏闵开慧

hadoop压缩与解压

1 压缩 一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据, 使数...

4028
来自专栏MasiMaro 的技术博文

ATL模板库中的OLEDB与ADO

上次将OLEDB的所有内容基本上都说完了,从之前的示例上来看OLEDB中有许多变量的定义,什么结果集对象、session对象、命令对象,还有各种缓冲等等,总体上...

1292
来自专栏CRPER折腾记

2018春招前端面试: 闯关记(精排精校)

box-sizing有两个值:content-box(W3C标准盒模型),border-box(怪异模型),

1872
来自专栏分布式系统进阶

KafkaController分析3-ControllerChannelManager

使用NetworkClient连接到broker node, 使用selector处理网络IO;

781

扫码关注云+社区

领取腾讯云代金券