LewaimaiExport.php 3.3 KB

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