今天遇到一个问题,涉及 php 与 excel 之间数据转换。之前一直用 PHPExcel,他们的开发组不更新了。但是找到了 PhpSpreadsheet。
一、介绍
用纯 php 编写的库,它提供了一组类,允许您读取和写入不同的电子表格文件格式
支持格式
环境要求
php 5.6 及以上
php_zip 支持并启用
php_xml 支持并启用
php_gd2 支持并启用
安装> composer require phpoffice/phpspreadsheet
hello world<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');
$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');
实例
包中带了实例代码,位置 vendor/phpoffice/phpspreadsheet/samples 下> php -S localhost:8000 -t vendor/phpoffice/phpspreadsheet/samples
二、读取
无需关心文件类型加载,用到了 IOFactory// 文件路径
$inputFileName = './sampleData/example1.xls';
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
注意:
这不是加载文件的最有效方法, 并且它缺乏在将文件实际读入 Spreadsheet 对象之前以任何方式配置加载器的灵活性。
知道文件类型,可以自己决定使用哪种读取器// 文件路径
$inputFileName = './sampleData/example1.xls';
/** 创建读取器 **/
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml();
// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods();
// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk();
// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Gnumeric();
// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
$spreadsheet = $reader->load($inputFileName);
当只要读取数据,不要格式时,实例读取器中 readDataOnly 属性,如下$inputFileType = 'Xls';
$inputFileName = './sampleData/example1.xls';
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/** 只要数据 **/
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load($inputFileName);
注意:csv 读取器没有这个属性
多个文件合并为一个对象$inputFileType = 'Csv';
$inputFileNames = [
'./sampleData/example1.csv',
'./sampleData/example2.csv'
'./sampleData/example3.csv'
];
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/** 拿到第一个 **/
$inputFileName = array_shift($inputFileNames);
$spreadsheet = $reader->load($inputFileName);
$spreadsheet->getActiveSheet()
->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));
/** 循环读取 **/
foreach($inputFileNames as $sheet => $inputFileName) {
/** 重新设置工作表索引 **/
$reader->setSheetIndex($sheet+1);
/** 把文件当做一个新的工作表载入 **/
$reader->loadIntoExisting($inputFileName,$spreadsheet);
/** 设置工作表标题 **/
$spreadsheet->getActiveSheet()
->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));
}
注意:对多个工作表使用相同的工作表索引不会将文件附加到同一工作表中,而是覆盖先前加载的结果。您无法将多个 CSV 文件加载到同一工作表中。
转为数组
文件最后会载入到一个对象中,我称为 spreadsheet 工作表对象,这个对象中存放着所以工作表集合的信息(数据信息和格式信息、工作表信息等)$spreadsheet = PhpOffice\PhpSpreadsheet\IOFactory::load("new.xls");
$data = $spreadsheet
->getSheet(0) // 指定第一个工作表为当前
->toArray(); // 转为数组
// 或者得到全部工作表的数据数组
$cells=array();
// 工作表对象有迭代器实现
foreach ( $spreadsheet->getWorksheetIterator() as $data ) {
$cells = $data->toArray();
}
结语
PhpSpreadsheet 是非常不错的 php 的电子表格处理工具类,后续有时间在补上写入和导出。
更多PHP相关知识,请访问PHP中文网!