Как узнать, сколько строк и столбцов нужно прочитать из файла Excel с помощью PHPExcel?


С помощью следующего кода я могу считывать ячейки из файла Excel с помощью PHPExcel.

В настоящее время я вручную определяю, сколько строк и столбцов нужно прочитать.

Есть ли способ, которым PHPExcel может сообщить мне, сколько строк и столбцов мне нужно прочитать, чтобы извлечь все данные из рабочего листа, например, даже если некоторые строки и столбцы оставлены пустыми?

$file_name = htmlentities($_POST['file_name']);
$sheet_name = htmlentities($_POST['sheet_name']);
$number_of_columns = htmlentities($_POST['number_of_columns']);
$number_of_rows = htmlentities($_POST['number_of_rows']);

$objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name);
$objReader->setLoadSheetsOnly(array($sheet_name));
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("data/" . $file_name);

echo '<table border="1">';
for ($row = 1; $row < $number_of_rows; $row++) {
    echo '<tr>';
    for ($column = 0; $column < $number_of_columns; $column++) {
        $value = $objPHPExcel->setActiveSheetIndex(0)->getCellByColumnAndRow($column, $row)->getValue();
        echo '<td>';
        echo $value . '&nbsp;';
        echo '</td>';
    }
    echo '</tr>';
}
echo '</table>';

Решение:

Спасибо, Марк, вот полное решение с этими функции:

$file_name = htmlentities($_POST['file_name']);
$sheet_name = htmlentities($_POST['sheet_name']);
$number_of_columns = htmlentities($_POST['number_of_columns']);
$number_of_rows = htmlentities($_POST['number_of_rows']);

$objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name);
$objReader->setLoadSheetsOnly(array($sheet_name));
$objReader->setReadDataOnly(true);

$objPHPExcel = $objReader->load("data/" . $file_name);

$highestColumm = $objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();
$highestRow = $objPHPExcel->setActiveSheetIndex(0)->getHighestRow();

echo 'getHighestColumn() =  [' . $highestColumm . ']<br/>';
echo 'getHighestRow() =  [' . $highestRow . ']<br/>';

echo '<table border="1">';
foreach ($objPHPExcel->setActiveSheetIndex(0)->getRowIterator() as $row) {
    $cellIterator = $row->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(false);
    echo '<tr>';
    foreach ($cellIterator as $cell) {
        if (!is_null($cell)) {
            $value = $cell->getCalculatedValue();
            echo '<td>';
            echo $value . '&nbsp;';
            echo '</td>';
        }
    }
    echo '</tr>';
}
echo '</table>';

alt text

Author: pnuts, 2010-12-30

5 answers

$objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();

И

$objPHPExcel->setActiveSheetIndex(0)->getHighestRow();

Или

$objPHPExcel->setActiveSheetIndex(0)->calculateWorksheetDimension();

, который возвращает диапазон в виде строки типа A1:AC2048

Хотя в них включены конечные пустые строки и столбцы.

РЕДАКТИРОВАТЬ

Или вы можете использовать итераторы для перебора существующих строк и столбцов, чтобы получить каждую ячейку в пределах используемого диапазона рабочих листов. См. /Tests/28iterator.php в производственном распределении для примера. Итераторы могут быть настроены на игнорирование пробелов.

 65
Author: Mark Baker, 2010-12-30 12:39:32

Из версий 1.7.6 и ниже PHPExcel можно получить информацию о рабочем листе, не читая весь файл целиком:

$objReader     = PHPExcel_IOFactory::createReader("Excel2007"); 
$worksheetData = $objReader->listWorksheetInfo($uploadedfile);
$totalRows     = $worksheetData[0]['totalRows'];
$totalColumns  = $worksheetData[0]['totalColumns'];
 8
Author: Alliswell, 2015-07-16 10:01:40

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

В моем случае первая колонка - это артикул товара, и это обязательно.

Если вы ожидаете файл с большим количеством строк, в моем случае это может быть 100 000 строк или более, я считываю значение первого столбца в каждой строке 10 000.

Если ячейка A10000 не пуста, прочитайте A20000 и так далее.

Таким образом, для файла со 100 000 строк мне нужно не более 10 операций чтения одной ячейки, чтобы решить, в каком сегменте из 10 000 строк файл заканчивается.

Например, допустим, что это от 30 000 до 40 000 строк.

Теперь получите среднее значение сверху - 35 000. Одно чтение ячейки A35000 еще больше сократит область до 5000 строк. Следующее среднее значение (и считывание одной ячейки) еще больше уменьшит область до 2500 и так далее.

Примерно вам потребуется около 13-14 считываний одной ячейки, если вы знаете, в каком сегменте 10 000 находится конец файла. Если вы ожидаете файл со 100 000 строками, добавьте максимум 10 считывание ячеек позволяет определить точный сегмент из 10 000 строк. Это означает, что максимум около 25 операций чтения ячеек для файла со 100 000 строками.

Редактировать: если вы ожидаете пустых строк - прочитайте немного больше ячеек, например, если вы ожидаете не более 1 последовательной пустой строки, каждый раз считывайте 2 последовательных ячейки, например A10000 и A10001, одна из них должна быть непустой, или вы находитесь за пределами конца файла. Если вы ожидаете не более 2 последовательных пустых строк, каждый раз считывайте по 3 ячейки, для пример A10000, A10001 и A10002 и так далее.

 1
Author: Nikolay Ivanov, 2014-04-22 13:21:26

Я не думаю, что вы сможете это сделать, вам придется перебирать, начиная, скажем, с 1000, и возвращаться назад, пока вы не попадете в первую непустую ячейку, и это будет ваша последняя строка или столбец.

Вы можете написать макрос для этого в excel, который может помочь, но я не знаю, сможете ли вы выполнить его с помощью PHPExcel.

 0
Author: fire, 2010-12-30 12:31:02

Следуя @николаю, размышляющему над ответом выше, я решил сделать первую ячейку каждой строки обязательной. Таким образом, я просто сначала просматриваю каждую ячейку каждой строки, чтобы узнать, сколько строк на самом деле содержит данные, в зависимости от первой строки.

$uploadedfile = \PHPExcel_IOFactory::load(Yii::getAlias('uploads').'/'.$file_location);
$uploadeddata = $uploadedfile->getActiveSheet()->toArray(null, true, true, true);

    //we need to first know how many rows actually have data
    //my first two rows have column labels, so i start with the third row.
    $row_count = 3;
    // read through the data and see how many rows actually have data
    //the idea is that for every row, the first cell should be mandatory...
    //if we find one that is not, we stop there...
    do
    {
      $row_count++;
    } while($uploadeddata[$row_count]['A'] == "null");

    //get the actual number of rows with data, removing the column labels
    $actual_rows = $row_count-3;
 0
Author: The Sammie, 2017-05-23 12:02:42