この記事の内容は、php で PhpSpreadsheet を使用して Excel と CSV ファイルを読み取る方法 (例付き) に関するものです。一定の参考価値があります。必要な友人はそれを参照できます。お役に立てば幸いです。助けてくれた。
PHP が Excel および CSV ファイルを読み取るためのライブラリは多数ありますが、より一般的に使用されるライブラリは、PHPOffice/PHPExcel、PHPOffice/PhpSpreadsheet です。現在、PHPExcel はメンテナンスされなくなりました。最初の送信は 2017 年 12 月 25 日に行われました。PhpSpreadsheet を直接使用することをお勧めします。2 つのプロジェクトは同じ組織によって維持されています。この記事では、PhpSpreadsheet の使用方法を紹介します。
PhpSpreadsheet の概要
PhpSpreadsheet は純粋な PHP で書かれたライブラリで、非常に豊富なクラスとメソッドを提供し、多くのファイル形式をサポートしています。
#環境要件
PHP >= 5.6
PhpSpreadsheet の使用法を学ぶための簡単なデモを作成します。これは、おそらく単純なファイル アップロード ページです。読み取りたい Excel ファイルをアップロードすると、PHP がファイルを受信し、PhpSpreadsheet を呼び出して Excel のコンテンツを読み取ります。
0. 環境を構成します少し…、自分で構成します1 です。新しいプロジェクトを作成します
mkdir demo cd demo
composer require phpoffice/phpspreadsheet
composer require phpoffice/phpspreadsheet:develop
3. Excel ファイルのアップロードに使用する新しい単純な HTML ファイルを作成します。
vim index.html
ここで注意してください。 次に: フォーム form の enctype
はmultipart/form-dataである必要があります。これは単なる単純なデモです実行後は次のようになります:)
4. PhpSpreadsheetの使い方は?
フロントエンドから渡されたExcelファイルを処理する前に、まずPhpSpredsheetの使い方を紹介します。 4.1 ファイルの読み取りPhpSpreadsheet でファイルを読み取るにはさまざまな方法があります。次のようなさまざまな形式のファイルに対してさまざまな読み取り方法があります。、csv
形式、\PhpOffice\PhpSpreadsheet\Reader\Csv()
を使用します。一見すると、非常にたくさんあります。少し複雑に感じますが、実際、これらのクラスは、ファイルの種類を指定する \PhpOffice\PhpSpreadsheet\Reader\IReader
および \PhpOffice\PhpSpreadsheet\Writer\IWriter
インターフェイスを実装しています。ロードされること。ファクトリ クラス \PhpOffice\PhpSpreadsheet\IOFactory
: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('demo.xlsx');</pre><div class="contentsignin">ログイン後にコピー</div></div>
を直接使用できます。読み取りおよび書き込みプロパティなど、ファイルの読み取りおよび書き込み時にいくつかのプロパティを設定したい場合は、次のように設定できます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile("demo.xlsx");
$reader->setReadDataOnly(true);
$reader->load("demo.xlsx");</pre><div class="contentsignin">ログイン後にコピー</div></div>
このファクトリ クラスを使用する利点は、ファイルのアップロードの形式を気にする必要がないことです。ファイルの識別に自動的に役立ちます。実際、このファクトリ クラスはいくつかの機能を備えています。アップロードしたファイルの識別。xls 形式として識別された場合は xls のリーダーを返し、csv の場合は csv のリーダーを返します。コードを分析すると、この
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, ]; ...
IOFactory
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx"); // 指定为xlsx格式 $spreadsheet = $reader->load("demo.xlsx");
まず、ファクトリ クラス
IOFactory
// 源码解析 // 不指定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'); }
上記のコードから、ロードする前にファイルの検出と型の判断操作が実行されることがわかります。 , すると、対応するリーダーが返されます。次に、見てみましょう。タイプを指定した後、どのような操作を行ったか:
// 指定reader $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $spreadsheet = $reader->load($_FILES['file']['tmp_name']);
上記は比較的単純です。リーダーを直接作成してロードします。いくつかのインスタンス化操作を行うだけです。これら 2 つの方法と比較すると、2 番目の方法の方がパフォーマンスが優れています。もちろん、ファイル形式を知っていることが前提条件です。
让我们接着继续上面的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文件的利器。
以上がPhp で PhpSpreadsheet を使用して Excel および CSV ファイルを読み取る方法 (例あり)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。