php 數(shù)據(jù)導(dǎo)出

最近在做后臺管理的項目,后臺通常有數(shù)據(jù)導(dǎo)出到 excel 的需要,經(jīng)過之前搜索通常推薦使用的是 php excel ,我經(jīng)常使用的是 laravel ,對于 php excel 也有很好用的對應(yīng) package。
開始使用是非常好用的,但是當需要導(dǎo)出的數(shù)據(jù)達到上萬條時就直接帶來內(nèi)存不足的問題。
然后我找到了幾個解決方案。

  • 前端解決方案
    PHP配合SheetJS/js-xlsx導(dǎo)出Excel大量數(shù)據(jù)
    這個方案好處的不需要額外的接口,但是要依賴于前端開發(fā)者。
  • 導(dǎo)出成 csv
    該方案速度較快,完全后端實現(xiàn),缺點是 csv 格式對導(dǎo)出的形式要求比較高,要求是純數(shù)據(jù),不能存在圖片之類的富文本形式。

下面主要介紹一下導(dǎo)出 csv 的方式

php 官方文檔 的介紹

<?php

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);
?>

導(dǎo)出完整例子

<?php

$name = 'test';
header ( "Content-type:application/vnd.ms-excel" );
header ( "Content-Disposition:filename=".$name.".csv" );
header ('Cache-Control: max-age=0');

//打開PHP文件句柄,php://output 表示直接輸出到瀏覽器
$fp = fopen('php://output', 'a');   

// 寫入BOM頭,防止亂碼
fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); 

// 生成的測試數(shù)據(jù)
function test()
{
    for ($i=0; $i < 150000; $i++) {
        yield ['name', $i, '男'];
    }
}

// 表頭
$headers = ['名字', '年齡', '性別'];

fputcsv($fp, $headers);

foreach (test() as $value) {
    fputcsv($fp, $value);
}

fclose($fp);
?>

在 laravel 中配合 chunk 使用可以方便快速導(dǎo)出全部數(shù)據(jù)

參考鏈接

php 生成 csv 文件
PHP創(chuàng)建的csv文件在windows上亂碼的問題
BOM 百度百科
php 導(dǎo)出大量數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容