前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php Spreadsheet Csv,使用 PhpSpreadsheet 实现读取写入 Execl「建议收藏」

php Spreadsheet Csv,使用 PhpSpreadsheet 实现读取写入 Execl「建议收藏」

作者头像
全栈程序员站长
发布2022-09-29 11:51:01
3.2K0
发布2022-09-29 11:51:01
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君

使用 PhpSpreadsheet 实现读取写入 Execl

由 吴亲库里 创建于1年前, 最后更新于 1年前

版本号 #1

9742 views

1 likes

0 collects

前言

这两天需要做一个支持读写微软办公软件的功能模块.最底下会说下自己下一步的想法,我先找了PhpSpreadheet这个第三方的扩展包,功能很完善,是一个纯PHP编写的库,看了官方文档,目前支持XLS,XML,XLSX,ODS,SLK,Gnumeric,CSV以及HTML.

软件支持

需要满足以下条件:

PHP5.6及以上版本

PHP扩展php_zip已开启

PHP扩展php_xml已开启

启用PHP扩展php_gd2(如果没有编译)

安装

进入自己的项目目录,使用composer安装

composer require phpoffice/phpspreadsheet

编写电子表格最简单的一个方法

require’vendor/autoload.php’;

usePhpOffice\PhpSpreadsheet\Spreadsheet;

usePhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();

sheet = spreadsheet->getActiveSheet();

sheet->setCellValue(‘A1’, ‘Hello World !’);

$writer->save(‘hello world.xlsx’);

读取文件

可以使用PhpSpreadsheet的IOFactory识别文件类型并加载它,

$inputFileName = ‘./sampleData/example1.xls’;

spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load(inputFileName);

此方法会在执行加载之前测试当前文件,为了防止恶意文件,比如说当前文件实际上是CSV文件或者包含HTML标记,但是已经给出了.xls的扩展名,它会拒绝用于.xls的加载器,而使用其他的加载器去检测当前文件.

读取文件实例

use PhpOffice\PhpSpreadsheet\Cell\Coordinate;

use PhpOffice\PhpSpreadsheet\IOFactory;

public function actionGetExcel()

{

$whatTable = 0;

$filename = ‘cc.xlsx’;

/** Identify the type of $inputFileName **/

inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify(filename);

/** Create a new Reader of the type that has been identified **/

reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader(inputFileType); //实例化阅读器对象。

spreadsheet = reader->load(filename); //将文件读取到到spreadsheet对象中

worksheet = spreadsheet->getActiveSheet(); //获取当前文件内容

sheetAllCount = spreadsheet->getSheetCount(); // 工作表总数

for (index = 0; index < sheetAllCount; index++) { //工作表标题

title[] = spreadsheet->getSheet(

}

sheet = spreadsheet->getSheet(

highest_row = sheet->getHighestRow(); // 取得总行数

highest_column = sheet->getHighestColumn(); ///取得列数 字母abc…

//

highestColumnIndex = Coordinate::columnIndexFromString(highest_column); //转化为数字;

for (i = 1; i <= highestColumnIndex; i++) {

for (j = 1; j <= highest_row; j++) {

// conent = sheet->getCellByColumnAndRow(i, j)->getValue();

conent = sheet->getCellByColumnAndRow(i, j)->getCalculatedValue();

info[j][i] = conent;

}

}

var_dump($info);

}

这里我屏蔽掉了

conent = sheet->getCellByColumnAndRow(i, j)->getValue();

因为我们execl中的表格的值不一定就是手动书写上去的,有些是通过单元格之间的计算得出的结果,这时候直接获取值我们得到的只是一个运算公式的字符串,比如下图中的 ‘=SUM(i,j)’这时候我们需要使用包中支持execl运算的计算引擎来为我们处理运算公式,并获取计算之后的值.

4cf69c02500104474f300b2d71931804.png
4cf69c02500104474f300b2d71931804.png

最后变成一个二维数组的数据(行列),然后渲染就实现了简单的读功能了,但是这里还有问题

execl表中之前有些单元格有样式的,暂时没有从那一坨东西中找到.

有些公式之前还写了东西,比如图中的,或者负数了就-…….,你计算出来之后只是一个值,这一块也需要处理

表格中的图片,图处理…..

编辑修改execl

别的方案(我暂时没去搭建)

不管你把这个包用的再好,你还是不能完美的实现客户端在没有安装微软office的情况下实现在线查看在线直接编辑的文件.看了一些文档查了点资料可以搭建office web apps的服务来满足这样的需求.

需要两台主机.主机的系统必须是windwos Server.一台主机要安装office Online就可以理解提供office的在线服务,另一台作为域控制器(好专业的名词),就是由这个主机专门去管理office Online主机,可以去微软官网文档具体看下操作,如果有人已经搭建了,希望能分享一下.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193453.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月15日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档