Comment obtenir le nombre de colonnes de la feuille de calcul de type entier (28) au lieu d'Excel-lettres (“AB”)?
Donné:
$this->objPHPExcelReader = PHPExcel_IOFactory::createReaderForFile($this->config['file']);
$this->objPHPExcelReader->setLoadSheetsOnly(array($this->config['worksheet']));
$this->objPHPExcelReader->setReadDataOnly(true);
$this->objPHPExcel = $this->objPHPExcelReader->load($this->config['file']);
Je peux parcourir les lignes comme ça, mais c'est très lent, c'est à dire dans un 3MO fichier Excel avec une feuille de calcul qui a "EL" colonnes, il faut environ 1 seconde par ligne:
foreach ($this->objPHPExcel->setActiveSheetIndex(0)->getRowIterator() as $row)
{
$dataset = array();
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
foreach ($cellIterator as $cell)
{
if (!is_null($cell))
{
$dataset[] = $cell->getCalculatedValue();
}
}
$this->datasets[] = $dataset;
}
Quand je itérer comme ça, ça c'est nettement plus rapide (env. 2000 lignes de 30 secondes), mais je vais avoir à convertir les lettres par exemple "EL" à un certain nombre:
$highestColumm = $this->objPHPExcel->setActiveSheetIndex(0)->getHighestColumn(); //e.g. "EL"
$highestRow = $this->objPHPExcel->setActiveSheetIndex(0)->getHighestRow();
$number_of_columns = 150; //TODO: figure out how to get the number of cols as int
for ($row = 1; $row < $highestRow + 1; $row++) {
$dataset = array();
for ($column = 0; $column < $number_of_columns; $column++) {
$dataset[] = $this->objPHPExcel->setActiveSheetIndex(0)->getCellByColumnAndRow($column, $row)->getValue();
}
$this->datasets[] = $dataset;
}
Est-il un moyen d'obtenir le plus haut de la colonne comme un entier (par exemple, "28") au lieu de dans Excel style des lettres (par exemple, "AB")?
Vous devez vous connecter pour publier un commentaire.
retourne 1 à partir d'un $colString de 'A', ' 26 " de 'Z', 27 "AA", etc.
et la (presque) inverse
renvoie 'A' à partir d'un $colNumber de 0, 'Z' de 25, " AA " à partir de 26, etc.
MODIFIER
Un couple de trucs utiles:
Il y a une méthode toArray() de la classe worksheet:
qui accepte les paramètres suivants:
même si elle n'utiliser les itérateurs, ce serait un peu plus lent
OU
Prendre avantage de PHP à la capacité de incrément de chaînes de caractères de Style Perl
et si vous êtes le traitement d'un grand nombre de lignes, vous pouvez remarquer l'amélioration des performances de l' ++$row sur $ligne++
$highestColumn++
de sorte que vous obtenez la dernière colonne et remarquez aussi que c'est$column != $highestColumn
et pas$column <= $highestColumn
qui est trompeur car il va travailler avec une seule lettre, mais si votre$highestColumn
est par exempleEL
alors votre boucle allerA-B-C-D-E
et de s'arrêter là.Vous ne savez pas si votre classe a intégré dans la méthode, mais vous pouvez toujours utiliser l'ord() la fonction de chaque lettre de la colonne de l'index de la chaîne. Vous devrez soustraire la valeur de base de 'A', et multipliez-la par 26^x pour chaque position de l'extrême droite de la chaîne. Quelque chose comme:
Fondamentalement, ce serait " BC " l'égalité des (2 * 26^1) + (3 * 26^0) = 55.
$input_string étant l'index de colonne de la chaîne, $base_value cours de l'ord() la valeur de 'A' moins 1, et $decimal_value étant la valeur de A0. Devrait fonctionner à n'importe quel nombre de colonne. Avons testé. Espérons que cette aide.
(2 * 26) + (3 * 0) != 55
. En fait, vous faites la même erreur que j'ai faite au départ, ce qui est pourquoi j'ai ajouté le if/else.C'est un peu une version simplifiée de dqhendricks réponse. J'ai ajouté aux copies, une fonction en supposant que vous entrez dans la pleine excel cellule de référence (ie. "AB12") et l'autre en supposant que vous entrez seulement la colonne de référence (ie. "AB"). Ils reviennent tous les deux un index de base zéro.
Entrée Plein Cellule De Référence
Colonne D'Entrée De Référence Seulement
La fonction va de l'arrière de la chaîne à l'avant pour augmenter la valeur de la colonne. Il utilise le
ord()
fonction permettant d'obtenir la valeur numérique d'un caractère, puis a la lettre la valeur soustraite à donner le local de la valeur de la colonne. Enfin, il est multiplié par le pouvoir actuel de 26.la solution la plus simple est
$getColumnIndexFromString = PHPExcel_Cell::columnIndexFromString($highestColumn);
Je suggère de convertir excel en tableau, nettoyer les éléments vides et puis de compter le nombre de colonnes:
getNameFromNumber(0) //retourne Un
Test: