Как узнать, сколько строк и столбцов нужно прочитать из файла Excel с помощью PHPExcel? - PullRequest
42 голосов
/ 30 декабря 2010

С помощью следующего кода я могу читать ячейки из файла 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

Ответы [ 6 ]

69 голосов
/ 30 декабря 2010
$objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();

и

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

или

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

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

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

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

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

9 голосов
/ 16 июля 2015

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

$objReader     = PHPExcel_IOFactory::createReader("Excel2007"); 
$worksheetData = $objReader->listWorksheetInfo($uploadedfile);
$totalRows     = $worksheetData[0]['totalRows'];
$totalColumns  = $worksheetData[0]['totalColumns'];
1 голос
/ 16 апреля 2014

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

В моем случае первый столбец - это SKU элемента, и он обязателен.

Если вы ожидаетефайл с большим количеством строк, в моем случае это может быть 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 и т. Д.

0 голосов
/ 27 марта 2019
$spreadsheet = new Spreadsheet();
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('xls');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('file location here');
$worksheet = $spreadsheet->getActiveSheet();
foreach ($worksheet->getRowIterator() AS $row) {
     $cellIterator = $row->getCellIterator();
     $cellIterator->setIterateOnlyExistingCells(FALSE); // This loops through all cells,
     $cells = [];
           foreach ($cellIterator as $cell) {
                 $cells[] = $cell->getValue();
           }
     $rows[] = $cells;
}

//blade html
<table class="table table-hover">
      <thead>
            <tr>
                @foreach($rows[0] as $heading)
                     <th>{{$heading}}</th>
                @endforeach
            </tr>
      </thead>
      <tbody>
             @foreach($rows as $key=>$val)
                   @if(!($key == 0))
                        <tr>
                            @foreach($val as $value)
                                 <td>{{$value}}</td>
                            @endforeach
                        </tr>
                    @endif
             @endforeach
      </tbody>
</table>
```
0 голосов
/ 13 февраля 2016

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

$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 голосов
/ 30 декабря 2010

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

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

...