ホームページ  >  記事  >  バックエンド開発  >  PHP の EXCEL クラスは非常に強力ですが、fputcsv は高速ですが、経験豊富なドライバーに解決してもらいたいです。彼の経験を共有してください。

PHP の EXCEL クラスは非常に強力ですが、fputcsv は高速ですが、経験豊富なドライバーに解決してもらいたいです。彼の経験を共有してください。

WBOY
WBOYオリジナル
2016-06-23 13:49:173378ブラウズ

タイトルの通り…

エクスポートされたデータは現在約 40,000 個です。来月には 100,000 個になる可能性があります。40,000 個の場合、最終エクスポートは約 20M になります。フィールドが多いため、ループします。 PHPEXCEL を使用してエクスポートすると、約 3 分で結果が得られます。ただし、ID カードやその他の長い数値フィールドがあるため、結果は約 1 分で得られます。科学的表記法になる

これは、FPUTCSV を使用するときに各フィールドに t を追加することで回避できます。 ただし、CSV ファイルの各フィールドに二重引用符が表示されないため、PHPEXCEL を使用して指定することはできません。特定のフィールドをテキスト形式でエクスポートすることはできませんが、顧客もそれを受け入れることができません。次の 2 つの方向のいずれかでヘルプが表示されます

1. PHPEXCEL の使用を最適化または簡素化し、上記の機能を満たしながらできるだけ効率的にします

2. CSV をエクスポートすると長くなる可能性があります 数値は科学表記法で表示されません。または列のセル形式がテキストとして指定されています

有効なアイデアも歓迎です





ディスカッション (解決策) に返信

最適化する 1 つの方法:
http://bbs.youyax.com/Content- 5058

データが 10,000 個あると仮定します。

毎回 1,000 個ずつ、10 回に分けてエクスポートします。

この方法の利点は、長い待ち時間を回避できることです。
しかし、問題は、依然として大量のデータを消費することです。
ファイルが大きすぎる場合でも、メモリ不足が報告されます。
原則は次のとおりです。
最初に 1000 個の項目をエクスポートし、
もう一度読み取り、1001 行目を見つけます。
1000 個の項目をエクスポートし続けます。
再度読み取り、2001 番目に位置します。 、
...


最適化の 1 つの方法:
http://bbs.youyax.com/Content-5058

データが 10,000 個あると仮定します。

それぞれ 1,000 個を 10 回に分けてエクスポートします。

利点この方法の利点は、長時間の待機を回避できることです
ただし、依然として大量のメモリを占有しているように見えるという問題があります
ファイルが大きすぎる場合、依然としてメモリ不足が報告されます
原理は次のとおりです。最初に 1000 項目をエクスポートします。
再度読み取り、1001 行目まで検索します。
次の 1000 項目のエクスポートを続けます。
もう一度読み取り、2001 行目まで検索します。
...



合計時間が削減されない場合は、はあまり意味がありません~~




最適化されたもの 1 つの方法: http://bbs.youyax.com/Content-5058

データが 10,000 個あると仮定し、

毎回 1,000 個を 10 回に分けてエクスポートし、

この方法の利点は、長時間の待機を回避できることです。
ただし、それでも大量のメモリを消費するという問題があります。
ファイルが大きすぎると、依然としてメモリ不足が報告されます。
原理は次のとおりです。
最初に 1000 項目をエクスポートします。
もう一度読んで 1001 行目を見つけます。
次の 1000 項目をエクスポートし続けます。
もう一度読んで 2001 を見つけます。
...



合計時間が削減されない場合は、はあまり意味がありません~~

メソッドやコードを投稿して見て、勉強してください。口で言うと少しわかりにくいです

1. Excel は 100 万行のレコードをサポートできます Excel 2003 は最大 65536 行をサポートします。 2007 バージョン以降、104 万行がサポートされます。Excel の制限は 65536 行です。
参考: CSV データをループで生成し、1000 項目が生成されるたびにバッファー期間を更新します
$fp = fopen('php://output', 'a');// 输出Excel列名信息$head = array("电子邮件");foreach ($head as $i => $v) {    // CSV的Excel支持GBK编码,一定要转换,否则乱码    $head[$i] = iconv('utf-8', 'gbk', $v);}// 将数据通过fputcsv写到文件句柄fputcsv($fp, $head);// 计数器$cnt = 0;// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小$limit = 100000;// 逐行取出数据,不浪费内存$count = count($email);for($t=0;$t<$count;$t++) {    $cnt ++;    if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题        ob_flush();        flush();        $cnt = 0;    }    $row[] = $email[$t];    foreach ($row as $i => $v) {        $row[$i] = iconv('utf-8', 'gbk', $v);    }    fputcsv($fp, $row);    unset($row);}2.长数字,可以再导出的时候,在前面预加个空格,这个就不以长度计数形式导出,而是以文本形式导出。

現在良い方法はありません。PHPexcel は常に非常に遅く、最適化が成功していません

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