ホームページ >バックエンド開発 >PHPチュートリアル >PHPExcel を PHP_XLSXWriter に置き換える方法の紹介 (写真)

PHPExcel を PHP_XLSXWriter に置き換える方法の紹介 (写真)

黄舟
黄舟オリジナル
2018-05-26 16:08:213514ブラウズ

PHPExcel は Excel および CVS ファイルを処理するためのオープンソース フレームワークです。残念ながら、PHPExcel はこのプロジェクトを正式に管理しなくなり、PhpSpreadsheet という新しいプロジェクトを github で開始しました。この記事では主に PHPExcel の代わりに PHP_XLSXWriter を使用する例を紹介します。必要な方は参考にしてください。

はじめに

この記事では主に PHPExcel の代わりに PHP_XLSXWriter を使用する方法を紹介し、参考と学習のために共有します。以下では多くを述べませんが、詳細な紹介を見てみましょう:

II 違いは何ですか?

PHPExcel は、Excel および CVS ファイルを処理するためのオープン ソース フレームワークであり、Microsoft の OpenXML 標準と PHP 言語に基づいています。これを使用して、さまざまな形式のスプレッドシートを読み書きすることができます。これは、これまでのところ PHP 用の最も多用途な Excel 処理ツールでもありますが、非常に致命的な欠点があります。大量のメモリを消費し、大量のバッチを処理するとほとんど疲れてしまいます。テーブルデータは好むと好まざるにかかわらず、処理速度は非常に遅いですが、機能が非常に豊富でAPIも多いため、Excelのテーブルを複雑な形式でエクスポートする場合は頻繁に使用する必要があり、これは本当に好き嫌いがあります。関係。

残念ながら、PHPExcel は公式にこのプロジェクトを維持しなくなりました。公式チームは、PhpSpreadsheet と呼ばれる新しいプロジェクトを github で開始しました。新しいプロジェクトは、名前空間、PSR 標準などの多くの新しい PHP 機能を使用しており、パフォーマンスも大幅に向上しています。ただし、プロジェクトはまだ開発段階 (2017-07-12) であり、さらにバグが存在すると予想されます。次の図はプロジェクトの移行手順です。

PHPExcel と比較すると、PHP_XLSXWriter は小さいながらも強力な Excel 読み取りおよび書き込みプラグインであり、PHPExcel ほど多くの高度な操作はありません。テーブルヘッダーの凍結と同様ですが、エクスポート速度は非常に高速で、特に大量のデータや複雑でないレポート形式のエクスポートのニーズに適しています。次の図は、公式の速度とメモリのテストです:


PHP_XLSXWriterの使い方は?

ダウンロード

もちろん、これは PHP_XLSXWriter の github アドレスからローカルにダウンロードすることもできます。解凍後、コア ファイルは 1 つだけであることがわかります: xlswriter.class.php。example ディレクトリには、参照できるサンプルが多数あります。


の使用

ほとんどの日次レポートのニーズには、PHP_XLSXWriter が適しています。API の使用方法を理解するために例を使用してみましょう。

下の図のレポートをエクスポートし、ブラウザーを通じてダウンロードするとします。

コードの実装:

//writer 类
$writer = new XLSXWriter();
 //文件名
$filename = "example.xlsx";
//设置 header,用于浏览器下载
header('Content-disposition: attachment; filename="'.XLSXWriter::sanitize_filename($filename).'"');
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');

//导出的数据
$string = array (
 0 => 
 array (
 'payc_bill_time' => '2017-07-12 16:40:44',
 'payt_received_date' => '2017-07-12',
 'ci_name' => '租金',
 'payt_num' => 'YRZB(2012)A0047',
 'payt_scsr_name' => '李巧红',
 'payt_received' => '300.00',
 'paytd_type' => '现金',
 'emp_name' => '郑振标',
 ),
 1 => 
 array (
 'payc_bill_time' => '2017-07-12 16:39:55',
 'payt_received_date' => '2017-07-12',
 'ci_name' => '租金',
 'payt_num' => 'YRZB(2012)A0046',
 'payt_scsr_name' => '22222',
 'payt_received' => '45.00',
 'paytd_type' => '现金',
 'emp_name' => '郑振标',
 )
 );
 //每列的标题头
$title = array (
 0 => '开单时间',
 1 => '收款时间',
 2 => '开票项目',
 3 => '票据编号',
 4 => '客户名称',
 5 => '实收金额',
 6 => '收款方式',
 7 => '收款人',
);
//工作簿名称
$sheet1 = 'sheet1';

//对每列指定数据类型,对应单元格的数据类型
foreach ($title as $key => $item){
 $col_style[] = $key ==5 ? 'price': 'string';
}

//设置列格式,suppress_row: 去掉会多出一行数据;widths: 指定每列宽度
$writer->writeSheetHeader($sheet1, $col_style, ['suppress_row'=>true,'widths'=>[20,20,20,20,20,20,20,20]] );
//写入第二行的数据,顺便指定样式
$writer->writeSheetRow($sheet1, ['xxx财务报表'],
['height'=>32,'font-size'=>20,'font-style'=>'bold','halign'=>'center','valign'=>'center']);

/*设置标题头,指定样式*/
$styles1 = array( 'font'=>'宋体','font-size'=>10,'font-style'=>'bold', 'fill'=>'#eee',
'halign'=>'center', 'border'=>'left,right,top,bottom');
$writer->writeSheetRow($sheet1, $title,$styles1);
// 最后是数据,foreach写入
foreach ($data as $value) {
 foreach ($value as $item) { $temp[] = $item;}
 $rows[] = $temp;
 unset($temp);
}
$styles2 = ['height'=>16];
foreach($rows as $row){
 $writer->writeSheetRow($sheet1, $row,$styles2);
}

//合并单元格,第一行的大标题需要合并单元格
$writer->markMergedCell($sheet1, $start_row=0, $start_col=0, $end_row=0, $end_col=7);
//输出文档
$writer->writeToStdOut();
exit(0);

理解できない場合は、上のコードのすべての行がコメント化されています。サンプル ファイルは、公式 Web サイトのフォルダーとドキュメントにありますが、ドキュメントは比較的短いです。

使用中にいくつかの落とし穴にも遭遇しました。ここにそれらをリストします。それがあなたの役に立つことを願っています:
ファイル名がクラス名に対応していません

requireまたはrequire_onceを使用する場合、これは実際には問題ではありません。
Autoloading

では両者が対応していないため認識できません。 xlsxwriter.class.php ファイルをプロジェクトに導入し、自動的にロードできるように名前空間を追加するとよいでしょう。この時点で行う必要があるのは、ファイル名をクラス名 XLSXWriter.class.php (ここで TP に導入) に変更することです。たとえば、これを Component ディレクトリに置き、名前空間 Component を追加します。この時点で、ファイルには名前空間が導入されていない Zip クラスもあり、 use ZipArchive を追加する必要があります。

これらが完了したら、プロジェクト内の他の場所でそれを使用できます:

use Component;
$writer = new XLSXWriter();
列の形式を設定するにはどうすればよいですか?

異なる列を異なる形式で表示する必要がある場合があります。デフォルトの列はテキスト形式ですが、場合によっては、Excel の関数を使用する場合に便利な数値列として表示する必要があります。上の表は、小数点 2 桁、1000 位の数値形式である必要があります。 上記のコードを見てください。実際には、writeSheetHeaderメソッドで数値形式が設定されています。他の形式が必要な場合は、一般的に使用される形式が公式Webサイトのホームページに記載されています。

特定のセルの値を個別に設定できますか?

これはまだ実装されていません。データは行ごとに書き込まれますが、そのような細かい粒度はサポートされていません。ただし、妥協策として、埋める必要のないセルに null を書き込むことができます。

以上がPHPExcel を PHP_XLSXWriter に置き換える方法の紹介 (写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。