web-dev-qa-db-fra.com

Lecture de nombres au format texte avec PHPExcel

J'ai un tableau qui peut stocker des nombres tels que 01, 01A, 01B, 02, 2 et quand j'obtiens cette valeur en utilisant PHPExcel, elle est supprimée des '0' dans le cas de 01, 02, par exemple. Pour résoudre ce problème, j'ai essayé de formater la ligne dans laquelle ces valeurs seront stockées dans Excel et de la définir comme type de texte, comme dans le code suivant:

    $objPHPExcel->setActiveSheetIndexByName('BlocksList');
    $objPHPExcel->getActiveSheet()->fromArray($blockNames, null, 'A2');
    $latestBLColumn = $objPHPExcel->getActiveSheet()->getHighestDataColumn();
    $column = 'A';
    $row = 1;
    for ($column = 'A'; $column != $latestBLColumn; $column++) {
        $objPHPExcel->getActiveSheet()->getStyle($column.$row)->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_TEXT );
    }
    $objPHPExcel->getActiveSheet()->fromArray($blockNames, null, 'A1');

Donc, en faisant cela, je reçois le tableau avec des nombres comme 01, 01A, 02, 02B ... et je le stocke dans la rangée A2. J'obtiens la colonne la plus haute pour utiliser cette valeur dans la condition Pour. Dans cette condition, je règle pour la ligne 1 dans la plage A jusqu'à la colonne la plus haute, à formater en tant que texte. 

Mon modèle est généré et tous les nombres sont au format texte, mais le problème est que, lorsque j'utilise la méthode "fromArray()", les nombres du tableau sont transformés avant que je puisse les obtenir correctement dans Excel . vous avez une idée de comment puis-je résoudre ce problème?

14
Periback

Le formatage à l'aide d'un format numérique affecte la manière dont un nombre est affiché est affiché et non pas comme il est enregistré.

Vous devez stocker explicitement les nombres sous forme de chaînes, vous ne pouvez donc pas utiliser fromArray () . Utilisez setCellValueExplicit () ou setCellValueExplicitByColumnAndRow () à la place d'un argument $ pDataType de PHPExcel_Cell_DataType :: TYPE_STRING.

MODIFIER

Notez que vous pouvez également définir des styles pour une plage de cellules. Il n'est donc pas nécessaire d'ajouter la surcharge de la boucle for:

$range = 'A'.$row.':'.$latestBLColumn.$row;
$objPHPExcel->getActiveSheet()
    ->getStyle($range)
    ->getNumberFormat()
    ->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_TEXT );

EDIT # 2 Utilisation d'un classeur de cellules

Créez un classeur de valeur de cellule personnalisé:

class PHPExcel_Cell_MyValueBinder extends PHPExcel_Cell_DefaultValueBinder
    implements PHPExcel_Cell_IValueBinder 
{ 
    public function bindValue(PHPExcel_Cell $cell, $value = null) 
    { 
        // sanitize UTF-8 strings 
        if (is_string($value)) { 
            $value = PHPExcel_Shared_String::SanitizeUTF8($value); 
        } 

        // Implement your own override logic 
        if (is_string($value) && $value[0] == '0') { 
            $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); 
            return true; 
        } 

        // Not bound yet? Use default value parent... 
        return parent::bindValue($cell, $value); 
    } 
} 

Pour éviter tout problème avec l'autoloader, créez-le dans le répertoire/Classes/PHPExcel/Cell. Sinon, donnez à la classe votre propre nom non-PHPExcel et assurez-vous qu'il est chargé de manière indépendante.

Ensuite, avant d’utiliser votre appel fromArray (), dites à PHPExcel d’utiliser votre classeur de valeur au lieu du classeur par défaut:

PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_MyValueBinder() );
26
Mark Baker

Je sais que tout cela a été posté il y a quelque temps, mais je voulais partager quelque chose qui fonctionnait pour moi. Vous pouvez donc toujours utiliser ->fromArray sans avoir à parcourir le tableur dans son intégralité.

Si vous placez vos valeurs dans ="VALUE", elles apparaîtront sous forme de texte et ne seront pas converties. Il n'y aura pas de guillemets dans votre feuille de calcul.

2
Arkitecht
$objPHPExcel
   ->getActiveSheet()
   ->getCellByColumnAndRow($col, $row)
   ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
1
Hưng

Vous pouvez mettre en forme une valeur en texte avec un caractère avant ou après la valeur. Exemple caractère d'ajout après valeur ";"

$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $row,$user->msisdn.';' );
0
user3313585