PHP 導出EXCEL

在後端開發中,做產品後臺時總會涉及到數據導出,導出excel,相信大家都做過吧。接下來推薦集中導出的寫法,供個參考。

1.使用第三方類庫進行實現

說起用第三方的話,phpExcel一定很不陌生,使用composer可以直接整下來了

# 原來的,該軟件包已**被放棄**,不再維護。作者的建議是用下面那個新的
composer require phpoffice/phpexcel
# 新的
composer require phpoffice/phpspreadsheet

,不行可以直接github下載

# 原來的,該軟件包已**被放棄**,不再維護。作者的建議是用下面那個新的
https://github.com/PHPOffice/PHPExcel
# 新的
https://github.com/PHPOffice/PhpSpreadsheet

使用方式也是很簡單的,具體的看文檔吧,不過這個的話相對於內存使用較高一些,不過個人絕對,如果只是針對於簡單的數據導出,直接寫csv就好了,所以不是很推崇這個

https://phpoffice.github.io/PhpSpreadsheet/master/

2.使用CSV直接輸出的形式

如果採用同步的操作的時候,可以直接以header的形式輸出
實現方式如下

// 換行符
$csv_terminated = pma_whichCrlf();
$data = [];// 需要輸出的內容
$data = array_map(function($item){
  // TODO: 對於數據做一些處理
}, $data);
// 拼接str
// $strs = join(',', $row).$csv_terminated;
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=文件名.csv");
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $strs;

接下來,咱們進一步的優化這個程序,首要想到的優化,肯定是將同步的轉化爲異步的。也就是導出實際上就是發起一個命令,生成一個文件,然後進行文件寫入。

// TODO: 任務參數,根據任務出數據
$fp = fopen('文件路徑加文件名.csv', 'w');
$data = [];// 需要輸出的內容
$data = array_map(function($item){
  // TODO: 對於數據做一些處理
}, $data);
// 將數據寫入文件,當然可以在array_map中就完成這個動作
// fputcsv($fp, $row);
fclose($fp);
// TODO: 處理任務狀態

emmm,這種程度一般是夠用了,但是嘛,本着極客思維,這種還是不能讓咱們就此滿足,畢竟嘛,實話實說,PHP文件操作還是很差,如果我中間循環用了file_put_contents(),那簡直慢死,上面的雖然只有一個資源句柄,但是能不用還是不用了。那怎麼做呢?藉助個shell腳本 php artisan 命令 >> 文件.csv / php think 命令 >> 文件.csv

// TODO: 任務參數,根據任務出數據
$csv_terminated = pma_whichCrlf();
$fp = fopen('文件路徑加文件名.csv', 'w');
$data = [];// 需要輸出的內容
$data = array_map(function($item){
  // TODO: 對於數據做一些處理
}, $data);
// 將內容循環輸出,當然可以在array_map中就完成這個動作
// echo  join(',', $row).$csv_terminated;
fclose($fp);
// TODO: 處理任務狀態

3.寫CSV要注意哪些東西

寫csv要注意,挺多東西的,例如換行,有例如科學技術法,又例如有人不會用utf8格式打開CSV等。

1. 換行問題
說起來也簡單,如果就是轉譯掉 裏面的 ",和去掉換行符

// 在array_map 中寫就好,注意要把那個$csv_terminated use進去
foreach($item as $field => $value) {
  $item[$field] = addslashes($value);
  $item[$field] = str_replace($csv_terminated, '', $value);
}
return $item;

2.科學計數法
很多比較長的數字串會被轉成科學計數法,網上很多人說的解決方案是插入一個字母或者製表符,我覺得這個方法還是不太可取的,可以採用“寫個excel公式”式的方式,解決這個問題,具體方法是

foreach($item as $field => $value) {
  $item[$field] = '="' . $value . '"';
}
return $item;

3.至於遇到不會用utf8查看文件的
這個就喊他去谷歌吧,沒有梯子就去百度吧,搜出來一般有兩者方式
1.新建一個excel,然後進入數據,倒入數據,來自文本,將你的csv當作數據源倒入進去
2.第二張是在文本中有選項查看的格式

如果有遇到什麼其他的問題,或者更好的方式,也歡迎留言共同探討

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章