ФорумПрограммированиеPHP для идиотов → Прием и обработка прайсов с почты

Прием и обработка прайсов с почты

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 8 сентября 2016 г. 16:36, спустя 17 дней 4 часа 30 минут

    Начитался хуйни на хабре PHPExcel и большие файлы [habrahabr.ru]
    и решил запустить скрипт

    require_once './Classes/PHPExcel/IOFactory.php';
    
    class chunkReadFilter implements PHPExcel_Reader_IReadFilter
    {
    private $_startRow = 0;
    private $_endRow = 0;
    
    public function setRows($startRow, $chunkSize) {
        $this->_startRow    = $startRow;
        $this->_endRow      = $startRow + $chunkSize;
    }
    
    public function readCell($column, $row, $worksheetName = '') {
        if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
            return true;
        }
        return false;
    }
    }
    
    session_start();
    
    $fileName = 'file.xlsx';
    
    if ($_SESSION['startRow']) $startRow = $_SESSION['startRow'];
    else $startRow = 13;
    
        //$inputFileType = 'Excel5';
        $inputFileType = 'Excel2007';
        $objReader = PHPExcel_IOFactory::createReader($inputFileType);
        $chunkSize = 20;
        $chunkFilter = new chunkReadFilter();
    
        while ($startRow <= 65000) {
         $chunkFilter->setRows($startRow,$chunkSize);
         $objReader->setReadFilter($chunkFilter);
         $objReader->setReadDataOnly(true);
         $objPHPExcel = $objReader->load($fileName);
         //Что-то с этими строками делаем
         $startRow += $chunkSize;
         $_SESSION['startRow'] = $startRow; 
    
        unset($objReader); 
    
        unset($objPHPExcel);
    
        }
    
        echo "The End";
        unset($_SESSION['startRow']);

    А оно ругается на
    Notice: Undefined variable: objReader in /var/www/!!!!/data/www/!!!!/excel_reader.php on line 44 Fatal error: Call to a member function setReadFilter() on a non-object in /var/www/!!!/data/www/!!!!/excel_reader.php on line 44

    Смотрю в код, вроде все ровно, а как запустить хз, мож кто подскажет где туплю

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 8 сентября 2016 г. 20:12, спустя 3 часа 36 минут 5 секунд

    @developer вот эта хуйня лишняя

    unset($objReader); 
    
    unset($objPHPExcel);
    

    Спустя 24 сек.

    ее можно бросить в конец цикла, хотя если файл будет выглядеть как он выглядит, то это не важно, при конце скрипта все равно все почистится

    Сапожник без сапог
  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 9 сентября 2016 г. 8:13, спустя 12 часов 1 минуту 5 секунд

    @phpdude, я её убрал, но скрипт как-то странно все равно работает

    вроде как идет чтение, а потом начинает по новой (выводя при этом содержимое только первой ячейки) и когда зайобуется тупо прекращает.

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 9 сентября 2016 г. 10:53, спустя 2 часа 39 минут 37 секунд

        if ($_SESSION['startRow']) $startRow = $_SESSION['startRow'];
        else $startRow = 0;
    
            $inputFileType = 'Excel2007';
            $aSheet = PHPExcel_IOFactory::createReader($inputFileType);
    
            $chunkSize = 2;
            $chunkFilter = new chunkReadFilter();
    $i=0;
            while ($startRow <= 65000) {     
    
              $chunkFilter->setRows($startRow,$chunkSize);        
              $aSheet->setReadFilter($chunkFilter);
              $objPHPExcel = PHPExcel_IOFactory::load($fileName);
              $aSheet = $objPHPExcel->getActiveSheet();
    
        $array = array();
    
        echo "<table>";
    
        foreach($aSheet->getRowIterator() as $row){
    
          $cellIterator = $row->getCellIterator();
    
          $item = array();
          echo "<tr>";
          foreach($cellIterator as $cell){
            array_push($item, $cell->getCalculatedValue());
            echo "<td>".$i." / " . $cell->getCalculatedValue() . "</td>";
          }
          echo "</tr>";
    
          array_push($array, $item);
        }
    
             $startRow += $chunkSize;
             $_SESSION['startRow'] = $startRow; 
    
            $i++;
    
            }
    
            echo "The End";
            unset($_SESSION['startRow']);

    Вроде так начало читать, но судя по значению $i оно не работает пошагово, в добавок ко всему ругается на
    Call to undefined method PHPExcel_Worksheet::setReadFilter()
    Нашёл setReadFilter в PHPExcel_Reader_Abstract, но почему его не видит PHPExcel_Worksheet в упор не пойму.

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 9 сентября 2016 г. 11:53, спустя 1 час 20 секунд

    точно так же ругается на отсутствие setReadDataOnly, при указании

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 9 сентября 2016 г. 12:11, спустя 18 минут 20 секунд

    
            $inputFileType = 'Excel2007';
            $aSheet = PHPExcel_IOFactory::createReader($inputFileType);
            $aSheet->setReadDataOnly(true);
    
            $chunkSize = 20;
            $chunkFilter = new chunkReadFilter();
    
            $chunkFilter->setRows($startRow,$chunkSize);          
            $aSheet->setReadFilter($chunkFilter);
    
            while ($startRow <= 1000) {
    
              $objPHPExcel = PHPExcel_IOFactory::load($fileName);
    
              $aSheet = $objPHPExcel->getActiveSheet();

    Запустил без ошибок так, но помоему он просто 1000 делит на 20 и 50 раз проходит по одному и тому же списку, хотя я думал что он будет шагать, никто не делал такие извращения?

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 9 сентября 2016 г. 14:21, спустя 2 часа 9 минут 43 секунды

    хз, либа унылое гавно) ковыряйся :)

    Сапожник без сапог
  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 9 сентября 2016 г. 16:29, спустя 2 часа 7 минут 42 секунды

    @phpdude, а больше вариантов для обработки xlsx, xls, csv не придумали?

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 9 сентября 2016 г. 16:57, спустя 28 минут 28 секунд

    @phpdude, а больше вариантов для обработки xlsx, xls, csv не придумали?

    @developer, Convert xlsx to csv in linux command line [stackoverflow.com]

    Спустя 18 сек.

    вообще прими за правило - в пизду пхп для таких задач и жизнь станет лучше :)

    Сапожник без сапог
  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 10 сентября 2016 г. 21:33, спустя 1 день 4 часа 35 минут

    вообщем наковырял такой код

    
        if (isset($_SESSION['startRow'])) { $startRow = $_SESSION['startRow']; $file_handle = fopen("file.html", "a"); }
        else { $startRow = 1; $file_handle = fopen("file.html", "w"); fwrite($file_handle, "<table border=\"1\">". "\n"); }
    
            $inputFileType = 'Excel2007';
            $aSheet = PHPExcel_IOFactory::createReader($inputFileType);
            $aSheet->setReadDataOnly(true);     
    
            $chunkSize = 20;
            $chunkFilter = new chunkReadFilter();
    
            $empty_value = 0;
            $exit = false;
    
                $aSheet->setReadFilter($chunkFilter);           
                $chunkFilter->setRows($startRow,$chunkSize);              
                $objPHPExcel = $aSheet->load($fileName);              
                $aSheets = $objPHPExcel->getActiveSheet();
    
                $array = array();
    
                foreach($aSheets->getRowIterator() as $row){
                  $cellIterator = $row->getCellIterator();
                  $item = array();
                  fwrite($file_handle, "<tr>". "\n");
                  foreach($cellIterator as $cell){
                    //array_push($item, iconv('utf-8', 'cp1251', $cell->getCalculatedValue()));
                    $value = $cell->getCalculatedValue();               
                    array_push($item, $value);      
                    $results  = "<td title=\"startRow: ".$startRow."\">" . $value . "</td>";
                    fwrite($file_handle, $results . "\n");
                  }
                  fwrite($file_handle, "</tr>". "\n");
                  array_push($array, $item);
                }
    
                for ($i = $startRow; $i < $startRow + $chunkSize; $i++)  //внутренний цикл по строкам
                {
                    $values = trim(htmlspecialchars($aSheets->getCellByColumnAndRow(0, $i)->getValue()));       //получаем первое знаение в строке
    
                    if ( empty($values) )       //проверяем значение на пустоту
                        $empty_value++;         
                    if ($empty_value == 3)      //после трех пустых значений, завершаем обработку файла, думая, что это конец
                    {   
                        $exit = true;   
                        echo "The End";
                    }                   
                }
    
                //$objPHPExcel->disconnectWorksheets();
                //unset($aSheet);
                $startRow += $chunkSize;
                if (!$exit) { $_SESSION['startRow'] = $startRow; }
                else { unset($_SESSION['startRow']); }
    
        if (isset($_SESSION['startRow'])) { }
        else { fwrite($file_handle, "</table>". "\n"); }
    
    fclose($file_handle);

    работает как раз с шагом по 20, но на выходе почему-то получаю такое Screenshot [prntscr.com]
    по какой-то причине при каждом вызове хавает первую строку, если итераций 20 то все 20 раз он выведет пустую строку и потом кучу пустых

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 10 сентября 2016 г. 21:42, спустя 9 минут 36 секунд

    подгрузил другой прайс там повторения первой строки нет, видимо в самом прайсе что-то.
    остались только пустые ячейки ...

Пожалуйста, авторизуйтесь, чтобы написать комментарий!