Maison >développement back-end >tutoriel php >Comment utiliser PhpSpreadsheet en php pour lire des fichiers Excel et CSV (avec exemples)
Le contenu de cet article explique comment utiliser PhpSpreadsheet en php pour lire des fichiers Excel et CSV (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. aidé.
Il existe de nombreuses bibliothèques permettant à PHP de lire les fichiers Excel et csv, mais les plus couramment utilisées sont : PHPOffice/PHPExcel, PHPOffice/PhpSpreadsheet. Désormais, PHPExcel n'est plus maintenu. 1 La première soumission a eu lieu le 25 décembre 2017. Il est recommandé d'utiliser PhpSpreadsheet directement, et les deux projets sont maintenus par la même organisation. Cet article présente l'utilisation de PhpSpreadsheet.
Présentation de PhpSpreadsheet
La bibliothèque PhpSpreadsheet est écrite en PHP pur, fournit une classe et une méthode très riches et prend en charge de nombreux formats de fichiers :
Exigences environnementales
PHP >= 5.6
Activerphp_zip
Extension
Activerphp_xml
Extension
Activerphp_gd2
Extension
Commencez
Nous écrivons une démo simple pour apprendre à utiliser PhpSpreadsheet. Il s'agit probablement d'une simple page de téléchargement de fichier, téléchargez le fichier Excel que nous voulons lire et. PHP le reçoit Allez dans le fichier et appelez PhpSpreadsheet pour lire le contenu dans Excel.
légèrement..., configurez-le vous-même
Ma version actuelle de PHP est 7.2.13
mkdir demo cd demo2. InstallationUtilisez composer pour installer :
composer require phpoffice/phpspreadsheetLa dernière version stable (1.5) est installée par défaut si vous souhaitez installer la version de développement. , vous pouvez exécuter la commande suivante :
composer require phpoffice/phpspreadsheet:developUne fois les étapes ci-dessus exécutées, la structure des répertoires est la suivante :
3. Créez un nouveau fichier html simple, utilisé pour télécharger des fichiers Excel
vim index.htmlLe contenu de index.html est très simple, comme suit :
ici Attention : le
dans le formulaire doit êtreCeci est juste une simple démo, un formulaire suffit. Après exécution, cela ressemblera à. ceci :)enctype
multipart/form-data
4. Comment utiliser PhpSpreadsheet ? Avant de traiter le fichier Excel transmis depuis le front-end, commençons par présenter comment utiliser PhpSpredsheet. 4.1 Lecture de fichiers Il existe de nombreuses façons de lire des fichiers dans PhpSpreadsheet Il existe différentes méthodes de lecture pour les fichiers dans différents formats, tels que :
format, utilisez xlsx
, <.>, utilisez PhpOfficePhpSpreadsheetReaderXlsx()
À première vue, tant de classes semblent un peu compliquées. En fait, ces classes implémentent toutes les interfaces csv
et PhpOfficePhpSpreadsheetReaderCsv()
, spécifiant le type de fichier à charger. Nous pouvons utiliser directement la classe d'usine PhpOfficePhpSpreadsheetReaderIReader
: PhpOfficePhpSpreadsheetWriterIWriter
PhpOfficePhpSpreadsheetIOFactory
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('demo.xlsx');L'avantage d'utiliser cette classe d'usine est que vous n'avez pas besoin de vous soucier du format du fichier téléchargé. Elle peut automatiquement aider à l'identifier. En fait, cette classe d'usine effectue une certaine identification sur le fichier que vous avez téléchargé. télécharger. S'il est identifié au format xls, il renverra le lecteur xls. Si s'il s'agit de csv, renverra le lecteur csv, nous pouvons voir que cela
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile("demo.xlsx"); $reader->setReadDataOnly(true); $reader->load("demo.xlsx");peut produire les lecteurs et écrivains suivants :
IOFactory
abstract class IOFactory { private static $readers = [ 'Xlsx' => Reader\Xlsx::class, 'Xls' => Reader\Xls::class, 'Xml' => Reader\Xml::class, 'Ods' => Reader\Ods::class, 'Slk' => Reader\Slk::class, 'Gnumeric' => Reader\Gnumeric::class, 'Html' => Reader\Html::class, 'Csv' => Reader\Csv::class, ]; private static $writers = [ 'Xls' => Writer\Xls::class, 'Xlsx' => Writer\Xlsx::class, 'Ods' => Writer\Ods::class, 'Csv' => Writer\Csv::class, 'Html' => Writer\Html::class, 'Tcpdf' => Writer\Pdf\Tcpdf::class, 'Dompdf' => Writer\Pdf\Dompdf::class, 'Mpdf' => Writer\Pdf\Mpdf::class, ]; ...
Dans l'usine
, vous pouvez également spécifier le type de fichier pour la lecture et l'écriture, et renvoyer le lecteur correspondant, ce qui élimine le besoin d'identifier le type de fichier, comme suit :IOFactory
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx"); // 指定为xlsx格式 $spreadsheet = $reader->load("demo.xlsx");
. le code est une opération pour identifier le format : IOFactory
load
// 源码解析 // 不指定reader,直接获取上传的文件创建 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::load($_FILES['file']['tmp_name']); // IOFactory::load() public static function load($pFilename) { // 这步棋室就是创建reader,免去了你手动创建 $reader = self::createReaderForFile($pFilename); return $reader->load($pFilename); } // IOFactory::createReaderForFile() // 这步就是返回一个reader,具体返回什么reader,是根据文件名来的 public static function createReaderForFile($filename) { // 判断文件是否存在并且可读,会抛出InvalidArgumentException File::assertFile($filename); // 根据文件后缀猜测类型 $guessedReader = self::getReaderTypeFromExtension($filename); if ($guessedReader !== null) { $reader = self::createReader($guessedReader); // Let's see if we are lucky if (isset($reader) && $reader->canRead($filename)) { return $reader; } } // 如果没有检测到类型,就会遍历默认的reader数组,直到找到可以使用的那个reader foreach (self::$readers as $type => $class) { if ($type !== $guessedReader) { $reader = self::createReader($type); if ($reader->canRead($filename)) { return $reader; } } } throw new Reader\Exception('Unable to identify a reader for this file'); }Ce qui précède est relativement simple, il suffit de créer le lecteur directement, puis de le charger et d'effectuer simplement quelques opérations d'instanciation. Par rapport à ces deux méthodes, la deuxième méthode a de meilleures performances, bien entendu, la condition préalable est de connaître le format de fichier.
// 指定reader $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $spreadsheet = $reader->load($_FILES['file']['tmp_name']);
让我们接着继续上面的index.html,我们需要编写一个PHP文件来处理请求:
require 'vendor/autoload.php'; $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); try { $spreadsheet = $reader->load($_FILES['file']['tmp_name']); } catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) { die($e->getMessage()); } $sheet = $spreadsheet->getActiveSheet(); $res = array(); foreach ($sheet->getRowIterator(2) as $row) { $tmp = array(); foreach ($row->getCellIterator() as $cell) { $tmp[] = $cell->getFormattedValue(); } $res[$row->getRowIndex()] = $tmp; } echo json_encode($res);
我们先引入autoload
,接着创建了一个Xlsx
的reader,然后load我们上传的文件,因为在excel中,内容都是按sheet区分的,每一个sheet中都由行和列组成,我们获取到当前使用的sheet,通过sheet获取到行的迭代对象,再针对每一行得到每一列对象,在PhpSpreadsheet中,cell是一个最小的单元,对应着第几行第几列,数据都是存在cell中,得到cell对象我们就能获取到数据。
当我们上传如下内容后:
返回结果如下:
因为我们在读取时,是从第二行开始的,所以第一行的内容就不显示了。
这里说一下,在Excel中第三列是一个时间,PhpSpreadsheet对时间的处理有点特殊。在PhpSpreadsheet中date和time在存储时都是作为数字类型,当要区分数字是时间格式时,需要用到format mask
,默认情况下,format mask
是开启了的,但如果设置setReadDataOnly
等于true
的话,就不能使用format mask
,从而就区分不了数字和时间格式,PhpSpreatsheet将会全部作为数字处理。
此时,我们开启只读模式看一下,
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setReadDataOnly(true);
输出结果如下:
第三列就变成了奇怪的数字,当初这个问题还困扰了我半天。
如果一个Excel中有多个sheet,只想操作其中的某几个sheet,可以设置setLoadSheetsOnly
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); // 参数支持字符串或一个数组 $reader->setLoadSheetsOnly(['sheet1','sheet3']);
读取指定行和列的数据
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // 只读取A1:E7的数据 if ($row >= 1 && $row setReadFilter($filterSubset); $spreadsheet = $reader->load('demo.xlsx');
上面的例子不够通用,可以修改下使之更为通用:
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { private $startRow = 0; private $endRow = 0; private $columns = []; public function __construct($startRow, $endRow, $columns) { $this->startRow = $startRow; $this->endRow = $endRow; $this->columns = $columns; } public function readCell($column, $row, $worksheetName = '') { if ($row >= $this->startRow && $row endRow) { if (in_array($column,$this->columns)) { return true; } } return false; } } $myFilter = new MyReadFilter(9,15,['A', 'B', 'D']);
列出Excel中所有sheet的名字
$reader->listWorksheetNames('demo.xlsx');
列出一个sheet的信息,包括多少列、多少行
$reader->listWorksheetInfo('demo.xlsx');
PhpSpreadsheet的学习与使用就到这,真的很强大,几乎满足了日常的所有需求,是读取Excel、CSV文件的利器。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!