资讯专栏INFORMATION COLUMN

使用PHPExcel读写excel

wupengyu / 2660人阅读

摘要:要求,使用了名字空间编码规范最新的语言新特性对版本的要求加强。已经放出稳定版,官方不再建议使用。保存和导入的行为分别由和负责。注意不要混淆和对象持有数据,和是对其进行序列化和反序列化的辅助类。单元隶属于具体的表单,使用上和表单类互动最多。

转载请注明文章出处:https://tlanyan.me/use-phpexc...

PHPOffice出品的PHPExcel是PHP读取和生成Excel的极佳工具。本文参考官方文档,对PHPExcel进行简要总结,希望对使用PHPExcel操作Excel的同行有帮助。

PHPExcel介绍

PHPExcel是用PHP实现的电子表格文档读写类库,其支持的文档类型包括:Excel(.xls)后缀,Excel 2007(.xlsx后缀),CSV(.csv后缀),LibreOffice Calc(.ods后缀),PDF和HTML等格式(某些格式只能读)。PHPExcel运行环境为PHP 5.2+,需要开启php_zip、php_xml和php_gd2拓展。

细心的读者可能看到PHPOffice有另外一款作品:PHPSpreadsheet。PHPSpreadsheet也是一个Excel读写类库,与PHPExcel主要区别是:

PHPSpreadsheet是PHPExcel的重构版,基于PHP的新特性进行了重写。PHPSpreadsheet要求PHP 5.6+,使用了名字空间、PSR2编码规范、最新的PHP语言新特性;

对PHP版本的要求加强。官方的PHP版本支持结束后,PHPSpreadsheet对该版本至多额外支持6个月(意味肯定不支持PHP 5.5及以下版本,PHP5.6的支持也即将终止)。对比之下,PHPExcel依然支持PHP 5.2.0;

开发组已将所有资源转移到PHPSpreadsheet,PHPExcel的维护已经停止。

PHPSpreadsheet已经放出1.0.0稳定版,官方不再建议使用PHPExcel。本文内容主要讲解PHPExcel,掌握透彻后再转换到PHPSpreadsheet也是很容易的。

PHPExcel架构

理解PHPExcel的架构,可以先从理解Excel文件的结构开始。一个Excel文件包含多个表单,每个表单包含多个单元;文件、表单和单元都可以多带带设置属性。这些概念对应到PHPExcel中的类,关系如下:

PHPExcel类 < -> Excel文件

PHPExcel_Worksheet类 < -> 表单

PHPExcel_Cell < -> 单元

PHPExcel_DocumentProperties < -> 文件属性

PHPExcel_Style_* < -> 格式设置类

下面开始介绍PHPExcel的常用操作。

使用PHPExcel

根据上面介绍的关系,分excel文件、表单、单元、格式设置四个部分分别介绍PHPExcel的使用方法。

excel文件

一个PHPExcel类的实例代表一个excel文件。新生成的PHPExcel对象,经常需要保存为文件;反之excel文件常需要导入为PHPExcel实例。保存和导入的行为分别由writer和reader负责。为了正确导入和保存数据,reader和writer需要知道具体的文件格式。PHPExcel提供了工厂类PHPExcel_IOFactory简化reader和writer的创建。读写文件的示例代码如下:

// 读取文件,自动探测文件格式
$excel = PHPExcel_IOFactory::load("./foo.xlsx");

// 新建excel文件,保存为Excel 2007格式
$excel2 = new PHPExcel();
$writer = PHPExcel_IOFactory::createWriter($excel2, "Excel2007");
$writer->save("./foo2.xlsx");

如果知道具体格式,可以使用具体的类操作:

// 读文件
$reader = PHPExcel_Reader_Excel2007();
$excel = $reader->load("./foo1.xlsx");

// 写文件
$writer = PHPExcel_Writer_Excel2007($excel);
$writer->save("./foo2.xlsx");

可用的reader和writer类可以参考下图:

建议使用工厂方法读取文件,它能自动探测文件格式并加载。这在读取用户上传不同格式的文件时很有用,避免了格式与后缀名不符可能导致的错误。

注意不要混淆PHPExcel和writer/reader对象:PHPExcel持有数据,writer和reader是对其进行序列化和反序列化的辅助类。

表单操作

一个excel文件可以包含多个表单,常用操作包括读取、新建、复制和删除表单。表单从属于excel文件,一般需要挂载到具体的PHPExcel对象上。

获取表单的方式有多种,如获取当前表单、获取指定顺序表单、根据名字获取表单。以下是示例代码:

$sheet = $excel->getActiveSheet();
// 获取第二个表单,编号从0开始
$sheet = $excel->getSheet(1);
$sheet = $excel->getSheetByName("Worksheet 1");

创建表单分为直接excel文件对象直接创建,也可以先创建表单实例,后续再关联。对应方法为:

$excel->createSheet();

$sheet = new PHPExcel_Worksheet($excel, "sheet 1");
// 一些其他操作
// 作为第二个表单插入到文档中
$excel->addSheet($sheet, 1);

PHPExcel也支持复制表单(包括复制其他PHPExcel对象中的表单):

// 复制表单
$sheet = clone $excel->getSheet(0);
$sheet->setTitle("new sheet");
$excel->addSheet($sheet, 1);

// $excel->addExternalSheet可以添加其他文件的表单
删除表单的API比较简单,只提供了`removeSheetByIndex`一个方法:
// 删除最后一个表单
$index = $excel->getSheetCount() - 1;
$excel->removeSheetByIndex($index);

// 删除当前表单
$index = $excel->getIndex($excel->getActiveSheet());
$excel->removeSheetByIndex($index);

单元操作

单元是承载内容的主体,其上操作比较复杂,大部分的类和API都与单元相关。单元隶属于具体的表单,使用上和表单类互动最多。

常用操作的包括定位、取值/赋值、格式化等。下面是一些代码示例:

// 获取单元对象
$cell = $sheet->getCell("B1");
$cell = $sheet->getCellByColumnAndRow(1, 1);

// 取值
$value = $cell->getValue();
$value = $cell->getCalculatedValue();   // 获取计算后的值
$style = $cell->getStyle(); // 获取格式化对象
$isMerged = $cell->isMergeRangeValueCell();   //是否是合并单元的主单元(合并单元的左上角单元)

// 设置值
$sheet->setCellValue("B1", "TEST");
$sheet->setCellValueByColumnAndRow(1, 1, "TEST");
// 批量赋值
$data = [
[2009, 2010, 2011, 2012],
["Q1",   12,   15,   21],
["Q2",   56,   73,   86],
["Q3",   52,   61,   69],
["Q4",   30,   32,    0],
];
$sheet->fromArray($data);
$cell->setValue("foo");
// 显示赋值
$cell->setValueExplicit("123456788900", PHPExcel_Cell_DataType::TYPE_STRING);

// 合并单元
$sheet->mergeCells("A18:E22");

// 设置格式
// 设置字体为红色
$cell->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
// 设置边框
$cell->getStyle()->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);

文件属性

设置excel文件的属性,包括常见的作者、标题、创建时间、描述等。该功能由PHPExcel中类型为DocumentProperties的成员变量负责:

$property = $excel->getProperties();
$property->setCreator("tlanyan");
$property->setTitle("demo workbook");
$property->setKeywords("tlanyan, PHPExcel");

其他

上述介绍了常见的概念和操作,实际中可能会用到的概念还包括:

缓存和性能

图像、图表、超链接等富文本

日期、货币等格式化和本地化

公式设置

打印属性设置

内容对其、边距设置等

文件密码安全设置

这些冷门或高级功能可以参照API文档。

PHPExcel官方文档可能稍有繁杂,网络上的二手资料在深入方面常有欠缺。要用好PHPExcel,一个基本功是搞清楚操作的对象,以及和其他类/对象的关系(这也是面向对象编程的基本功)。本文中提到的PHPExcel->PHPExcel_WorkSheet->PHPExcel_Cell继承体系,是使用过程中操作最为频繁的对象,希望以上说明和示例能加深读者对PHPExcel类库的理解。

参考

https://github.com/PHPOffice/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28215.html

相关文章

  • php读写excel —— PhpSpreadsheet组件

    摘要:前言是一个纯类库,它提供了一组类,允许您从不同的电子表格文件格式如和读取和写入。官方文档安装的环境要求或者更高,,组件安装使用执行命令安装依赖版本号执行完命令后会在目录下发现有了目录,代表已经下载安装成功。 前言 PhpSpreadsheet是一个纯PHP类库,它提供了一组类,允许您从不同的电子表格文件格式(如Excel和LibreOffice Calc)读取和写入。 还有一种类似的...

    Elle 评论0 收藏0
  • 使用PHP_XLSXWriter代替PHPExcel

    摘要:能不能单独设置某个单元格的值这个目前并没有实现,现在数据的写入都是逐行写入的,不支持这么细的粒度,不过折中的做法是把不需要填充的单元格写入即可如果有什么使用问题,可以在下面留言,一起探讨使用方式 二者有何区别? PHPExcel 是一个处理Excel,CVS文件的开源框架,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格,这也是PHP至今最通用的Ex...

    TZLLOG 评论0 收藏0
  • 打造最全面的PHPExcel开发解决方案

    摘要:过去工作中使用较多,碰到并解决了各种大大小小的问题,总结出这样一篇文章,一方面记录自己踩过的坑,一方面与大家分享,让大家少走弯路,并不断完善之,欢迎大家去上面和提交,不断补充和优化,打造最全面的开发解决方案地址原文地址基础小试牛刀引用文 过去工作中使用PHPExcel较多,碰到并解决了各种大大小小的问题,总结出这样一篇文章,一方面记录自己踩过的坑,一方面与大家分享,让大家少走弯路,并不...

    ThinkSNS 评论0 收藏0
  • ThinkPHP用PHPExcle导出Excel文件

    摘要:本篇文章主要讲述,如何在中使用中导出文件,是博主在实践了好多篇别人的帖子之后,总结归纳出来的文章,亲测可用。我的博客欢迎骚扰原文地址用导出文件。将文件,重命名成。文章结束,欢迎转载。 本篇文章主要讲述,如何在thinkPHP中使用PHPExcel中导出Excel文件,是博主在实践了好多篇别人的帖子之后,总结归纳出来的文章,亲测可用。thinkPHP版本是3.2。 我的博客:Mine-...

    rollback 评论0 收藏0
  • phpExcel实现Excel数据的导入导出(全步骤详细解析)

    摘要:上传添加需下载类文件,引入到项目类库里接收前台文件,接收前台文件重设置文件名设置移动路径表用函数方法返回数组创建一个读取数据,可用于入库引用类静态类设置为代表支持或以下版本,代表版开始读取上传到服务器中的文件,返回一个二维数组 1.上传添加excel (需下载PHPExcel类文件,引入到项目类库里) //接收前台文件, public function addExcel() ...

    zengdongbao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<