fiftythr Ответов: 2

Phpexcel не может исправить ошибку: вы пытались установить лист активным по индексу out of bounds


У меня есть PHP-программа, которая читает листы XLS-файла и преобразует каждый лист в CSV-файл.

Ошибка, которую я получаю:
Фатальная ошибка: Неперехваченные PHPExcel_Exception: вы пытались установить активный лист ожидания индекса по часам: 3. Фактическое количество листов 3. в C:\xampp\htdocs\Technocripa-php\PHPExcel\Classes\PHPExcel.php:695 трассировка стека: #0 C:\xampp\htdocs\Technocripa-php\convertCSV.php(34): PHPExcel-&ГТ;setActiveSheetIndex(3) #1 C:\xampp\htdocs\Technocripa-php\convertCSV.php(19): convertXLStoCSV('загрузки/Центральная...', 'Centralizator_f...') #2 {главная} брошены в C:\xampp\htdocs\Technocripa-php\PHPExcel\Classes\PHPExcel.php на линии 695

Код:

function convertXLStoCSV($infile, $outfile) // the function that converts the file
{
    $fileType = PHPExcel_IOFactory::identify($infile);
    $objReader = PHPExcel_IOFactory::createReader($fileType);

    $objReader->setReadDataOnly(true);
    $objPHPExcel = $objReader->load($infile);

    //$objPHPExcel->createSheet();

    $i = 0;
    while ($objPHPExcel->setActiveSheetIndex($i)){
        $objWorksheet = $objPHPExcel->getActiveSheet();

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');
        $objWriter->save($outfile);

        $i++;

        //$sheetNames = $infile->getSheetNames();
    }
}
 ?>


Что я уже пробовал:

Я пробовал ставить

$objPHPExcel->createSheet();


вне цикла, но ошибка сохраняется, но просто изменяет свои данные:

Фатальная ошибка: Неперехваченные PHPExcel_Exception: вы пытались установить активный лист ожидания индекса по часам: 4. Фактическое количество листов 4.

2 Ответов

Рейтинг:
2

Lucamen

hello thanks to your question I was able to solve the problem, you really were very close to the solution, it was just putting $ objPHPExcel-> createSheet (); inside the loop
I leave part of my code as an example:

for ($ j = 0; $ j <5; $ j ++) {
        // $ j = 0;

        if ($ j <> 0) {
            $ objPHPExcel-> createSheet ();
        }...
}


CHill60

На самом деле причина, по которой ваш код не генерирует исключение, не имеет ничего общего с циклом. Это

if ($ j <> 0) {
это останавливает ошибку

Рейтинг:
12

ZurdoDev

Ошибка очень очевидна, не так ли? Вы пытаетесь активировать лист, который не существует. Помните, что индексы основаны на 0, поэтому попытка получить доступ к листу с индексом 3, когда есть только 3 листа, не будет работать. 3 листа означают, что есть индексы 0, 1 и 2.