web-dev-qa-db-fra.com

Comment savoir combien de lignes et de colonnes lire dans un fichier Excel avec PHPExcel?

Avec le code suivant, je peux lire les cellules d’un fichier Excel avec PHPExcel.

Je actuellement manuellement définir combien de lignes et de colonnes à lire.

Existe-t-il un moyen permettant à PHPExcel de me dire combien de lignes et de colonnes je dois lire pour extraire toutes les données de la feuille de calcul, par exemple même si certaines lignes et colonnes sont laissées vides?

$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>';

Solution:

Merci, Mark, voici la solution complète avec ces fonctions:

$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

41
Edward Tanguay
$objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();

et

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

ou

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

qui retourne une plage sous forme de chaîne comme A1: AC2048

bien que les dernières lignes et colonnes vierges soient incluses dans celles-ci.

MODIFIER

vous pouvez également utiliser les itérateurs pour parcourir les lignes et les colonnes existantes afin d’obtenir chaque cellule dans la plage de feuilles de calcul utilisée. Voir /Tests/28iterator.php dans la distribution de la production pour un exemple. Les itérateurs peuvent être configurés pour ignorer les blancs.

68
Mark Baker

À partir de la version 1.7.6 et inférieure PHPExcel il est possible d'obtenir des informations sur la feuille de calcul sans lire le fichier entier

$objReader     = PHPExcel_IOFactory::createReader("Excel2007"); 
$worksheetData = $objReader->listWorksheetInfo($uploadedfile);
$totalRows     = $worksheetData[0]['totalRows'];
$totalColumns  = $worksheetData[0]['totalColumns'];
8
Alliswell

Vous pouvez le faire beaucoup moins de lectures de cellules que de parcourir toutes les lignes (colonnes).

Dans mon cas, la première colonne est le SKU du produit et est obligatoire.

Si vous attendez un fichier avec beaucoup de lignes, dans mon cas, il peut être 100 000 lignes ou plus, je lis la valeur de la première colonne toutes les 10 000 lignes.

Si la cellule A10000 n'est pas vide, lisez A20000, etc.

Ainsi, pour un fichier de 100 000 lignes, il faut au maximum 10 lectures d'une seule cellule pour décider dans quel segment de 10 000 lignes se termine le fichier.

Par exemple, disons qu'il se situe entre 30 000 et 40 000 lignes.

Maintenant, obtenez la moyenne de plus de 35 000. Une lecture de la cellule A35000 réduira encore la portée à 5 000 lignes. La moyenne suivante (et la lecture d'une seule cellule) réduira encore la portée à 2500 et ainsi de suite.

Approximativement, vous aurez besoin d'environ 13-14 lectures de cellules uniques, si vous savez dans quel segment 10 000 correspond à la fin du fichier. Si vous prévoyez un fichier de 100 000 lignes, ajoutez un maximum de 10 lectures de cellules pour déterminer le segment exact de 10 000 lignes. Cela signifie un maximum d'environ 25 lectures de cellules pour un fichier de 100 000 lignes.

Edit: si vous attendez des lignes vides - lisez un peu plus de cellules, par exemple, si vous attendez pas plus d'une ligne vide conséquente, lisez 2 cellules consécutives à chaque fois, par exemple A10000 et A10001, -esseux, ou vous êtes au-delà de la fin du fichier. Si vous ne prévoyez pas plus de 2 lignes vides conséquentes, lisez 3 cellules à chaque fois, par exemple A10000, A10001 et A10002, etc.

1
Nikolay Ivanov

Après @ nikolay , en réponse à la réponse ci-dessus, j'ai décidé de rendre obligatoire la première cellule de chaque ligne. De cette façon, je regarde d'abord chaque cellule de chaque ligne pour savoir combien de lignes contiennent réellement des données, en fonction de la première ligne.

$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
The Sammie

Je ne pense pas que vous puissiez faire cela, vous devez parcourir en commençant par 1000 et revenir en arrière jusqu'à atteindre la première cellule non vide et ce serait votre dernière ligne ou colonne.

Vous pouvez écrire une macro pour cela dans Excel, ce qui peut aider, mais je ne sais pas si vous pouvez l'exécuter avec PHPExcel.

0
fire