LewaimaiExport.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. use LewaimaiCDN;
  3. use LewaimaiFile;
  4. use Yii;
  5. class LewaimaiExport
  6. {
  7. /**
  8. * 导出excel文件
  9. *
  10. * @param array $data 导出文件的内容
  11. * @param string $filename 导出文件名(文件名不能加后缀,默认是加上 .csv)
  12. * @param string $file_path 导出文件路劲,如果为空,则使用默认路径
  13. * @param boolean $is_page 是否分页(导出生成多个csv文件)
  14. * @param boolean $is_cdn 是否将文件上传到cdn
  15. * @return array
  16. */
  17. public static function exportCsv($data, $filename, $file_path = '', $is_page = true, $is_cdn = true)
  18. {
  19. set_time_limit(300);
  20. $return = ['errcode' => 1];
  21. $file_arr = [];
  22. $count = count($data);
  23. $page_size = 5000;
  24. // 分批导出
  25. if ($is_page && $count > $page_size) {
  26. $chunk_data = array_chunk($data, $page_size);
  27. foreach ($chunk_data as $key => $item) {
  28. $chunk_file_name = $filename.'_'.($key + 1);
  29. $ret_file_name = self::produceCsv($item, $chunk_file_name, $file_path);
  30. $ret_file_name && $file_arr[] = $ret_file_name;
  31. }
  32. } else {
  33. $ret_file_name = self::produceCsv($data, $filename, $file_path);
  34. $ret_file_name && $file_arr[] = $ret_file_name;
  35. }
  36. // 打包生成的csv文件,返回zip包地址
  37. if (!empty($file_arr)) {
  38. return self::csvToZip($file_arr, $filename, '', $is_cdn);
  39. }
  40. return false;
  41. }
  42. /**
  43. * 生成一个csv文件,返回完整文件名
  44. *
  45. * @param array $data
  46. * @param string $filename
  47. * @param string $file_path
  48. * @return string
  49. */
  50. public static function produceCsv($data, $filename, $file_path = '')
  51. {
  52. if (empty($file_path)) {
  53. $dir_name = date('YmdHis', time());
  54. $file_path = Yii::app()->getBasePath().'/data/csv/'.$dir_name;
  55. }
  56. $filename = $file_path.'/'.$filename.'.csv';
  57. if (LewaimaiFile::write_cvs($data, $filename)) {
  58. return $filename;
  59. }
  60. return false;
  61. }
  62. /**
  63. * 将多个csv文件压缩到zip
  64. *
  65. * @param array $csv_file_arr csv文件完整路径名数组
  66. * @param string $zipname zip文件名
  67. * @param string $file_path zip文件路径,默认和csv上级目录一致
  68. * @param boolean $is_cdn 是否将文件上传到cdn
  69. * @return string zip文件名
  70. */
  71. public static function csvToZip($csv_file_arr, $zipname, $zip_path = '', $is_cdn = true)
  72. {
  73. if (empty($zip_path)) {
  74. $zip_path = dirname(dirname(reset($csv_file_arr))).'/';
  75. }
  76. $zip_name = $zip_path.$zipname.'.zip';
  77. $ret_path = addFileToZip($zip_name, $csv_file_arr);
  78. deldir(dirname(reset($csv_file_arr))); // 删除csv文件夹
  79. $return = $ret_path;
  80. // 上传文件到cdn,返回文件地址
  81. if ($ret_path && $is_cdn) {
  82. if ($cdn_path = LewaimaiCDN::uploadTempCvs($ret_path)) {
  83. $return = $cdn_path;
  84. } else {
  85. // Failed upload file to cdn!
  86. $return = false;
  87. }
  88. // 删除压缩包
  89. @unlink($ret_path);
  90. }
  91. return $return;
  92. }
  93. }