LewaimaiExport.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. $admin_id = Yii::app()->user->_id;
  54. $dir_name = $admin_id.date('YmdHis', time());
  55. $file_path = Yii::app()->getBasePath().'/data/csv/'.$dir_name;
  56. }
  57. $filename = $file_path.'/'.$filename.'.csv';
  58. if (LewaimaiFile::write_cvs($data, $filename)) {
  59. return $filename;
  60. }
  61. return false;
  62. }
  63. /**
  64. * 将多个csv文件压缩到zip
  65. *
  66. * @param array $csv_file_arr csv文件完整路径名数组
  67. * @param string $zipname zip文件名
  68. * @param string $file_path zip文件路径,默认和csv上级目录一致
  69. * @param boolean $is_cdn 是否将文件上传到cdn
  70. * @return string zip文件名
  71. */
  72. public static function csvToZip($csv_file_arr, $zipname, $zip_path = '', $is_cdn = true)
  73. {
  74. if (empty($zip_path)) {
  75. $zip_path = dirname(dirname(reset($csv_file_arr))).'/';
  76. }
  77. $zip_name = $zip_path.$zipname.'.zip';
  78. $ret_path = addFileToZip($zip_name, $csv_file_arr);
  79. deldir(dirname(reset($csv_file_arr))); // 删除csv文件夹
  80. $return = $ret_path;
  81. // 上传文件到cdn,返回文件地址
  82. if ($ret_path && $is_cdn) {
  83. if ($cdn_path = LewaimaiCDN::uploadTempCvs($ret_path)) {
  84. $return = $cdn_path;
  85. } else {
  86. // Failed upload file to cdn!
  87. $return = false;
  88. }
  89. // 删除压缩包
  90. @unlink($ret_path);
  91. }
  92. return $return;
  93. }
  94. }