1
0

ExcelCut.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace cutExcel;
  3. /**
  4. * 切割类
  5. * @author wangyelou
  6. * @date 2018-07-30
  7. */
  8. class ExcelCut
  9. {
  10. public $cutNum = 5;
  11. public $returnType = 'Csv';
  12. public $log;
  13. /**
  14. * 切割字符串
  15. * @param $str
  16. * @return array|bool
  17. */
  18. public function cutFromStr($str)
  19. {
  20. try {
  21. $filePath = app()->getBasePath() . '../uploads/tmp/' . time() . mt_rand(1000, 9000) . $this->returnType;
  22. file_put_contents($filePath, $str);
  23. if (file_exists($filePath)) {
  24. $result = $this->cutFromFile($filePath);
  25. unlink($filePath);
  26. return $result;
  27. } else {
  28. throw new Exception('文件写入错误');
  29. }
  30. } catch (Exception $e) {
  31. $this->log = $e->getMessage();
  32. return false;
  33. }
  34. }
  35. /**
  36. * 切割文件
  37. * @param $file
  38. * @return array|bool
  39. */
  40. public function cutFromFile($file)
  41. {
  42. try {
  43. $cutRules = $this->readaheadFromFile($file);
  44. $dir = $this->getFileDir($file);
  45. $returnType = $this->returnType ? $this->returnType : 'Csv';
  46. $results = array();
  47. //初始化读
  48. $myFilter = new MyreadFilter();
  49. $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($file);
  50. $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
  51. $reader->setReadDataOnly(true);
  52. $reader->setReadFilter($myFilter);
  53. foreach ($cutRules as $sheetName => $rowIndexRange) {
  54. //读
  55. list($myFilter->startRow, $myFilter->endRow, $myFilter->worksheetName) = $rowIndexRange;
  56. $spreadsheetReader = $reader->load($file);
  57. $sheetData = $spreadsheetReader->setActiveSheetIndexByName($myFilter->worksheetName)->toArray(null, false, false, false);
  58. $realDatas = array_splice($sheetData, $myFilter->startRow, ($myFilter->endRow - $myFilter->startRow + 1));
  59. $spreadsheetReader->disconnectWorksheets();
  60. unset($sheetData);
  61. unset($spreadsheetReader);
  62. //写
  63. $saveFile = $dir . $sheetName . '.' . $returnType;
  64. $spreadsheetWriter = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  65. foreach ($realDatas as $rowIndex => $row) {
  66. foreach ($row as $colIndex => $col) {
  67. $spreadsheetWriter->getActiveSheet()->setCellValueByColumnAndRow($colIndex+1, $rowIndex+1, $col);
  68. }
  69. }
  70. $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheetWriter, $returnType);
  71. $writer->save($saveFile);
  72. $spreadsheetWriter->disconnectWorksheets();
  73. unset($spreadsheetWriter);
  74. $results[] = $saveFile;
  75. }
  76. return $results;
  77. } catch (Exception $e) {
  78. $this->log = $e->getMessage();
  79. return false;
  80. }
  81. }
  82. /**
  83. * 预读文件
  84. */
  85. public function readaheadFromFile($file)
  86. {
  87. if (file_exists($file)) {
  88. //获取统计数据
  89. $myFilter = new MyAheadreadFilter();
  90. $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($file);
  91. $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
  92. $reader->setReadDataOnly(true); //只读数据
  93. $reader->setReadFilter($myFilter);
  94. //$spreadsheet = $reader->load($file);
  95. //$sheetData = $spreadsheet->getActiveSheet()->toArray(null, false, false, false);
  96. list($fileName,) = explode('.', basename($file));
  97. $datas = array();
  98. $averageNum = ceil(array_sum($myFilter->record) / $this->cutNum);
  99. foreach ($myFilter->record as $sheetName => $count) {
  100. for ($i=0; $i<ceil($count/$averageNum); $i++) {
  101. $datas[$fileName . '_' . $sheetName . '_' . $i] = array($i*$averageNum, ($i+1)*$averageNum-1, $sheetName);
  102. }
  103. }
  104. return $datas;
  105. } else {
  106. throw new Exception($file . ' not exists');
  107. }
  108. }
  109. /**
  110. * 创建目录
  111. * @param $file
  112. * @return bool|string
  113. */
  114. protected function getFileDir($file)
  115. {
  116. $baseName = basename($file);
  117. list($name) = explode('.', $baseName);
  118. $fullName = $name .'_'. time() . '_' . mt_rand(1000, 9999);
  119. $path = app()->getBasePath() . '../uploads/' . $fullName . '/';
  120. mkdir($path, 0777);
  121. chmod($path, 0777);
  122. if (is_dir($path)) {
  123. return $path;
  124. } else {
  125. $this->log = "mkdir {$path} failed";
  126. return false;
  127. }
  128. }
  129. }