web-dev-qa-db-de.com

Zahlen als Textformat mit PHPExcel lesen

Ich habe ein Array, das Zahlen speichern kann, z. B. 01, 01A, 01B, 02, 2 und Wenn ich diesen Wert mit PHPExcel erhalte, werden die '0' beispielsweise für 01, 02 entfernt. Um dieses Problem zu lösen, habe ich versucht, die Zeile, in der diese Werte in Excel gespeichert werden, zu formatieren und als Texttyp festzulegen, genau wie im folgenden Code:

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

Dadurch bekomme ich das Array mit Zahlen wie 01, 01A, 02, 02B ... und speichere es in der Zeile A2. Ich erhalte die höchste Spalte, um diesen Wert in der Bedingung For zu verwenden. In diesem Zustand habe ich für die Zeile 1 im Bereich A bis zur obersten Spalte festgelegt, die als Text formatiert werden soll. 

Meine Vorlage wird generiert und alle Zahlen sind im Textformat, aber das Problem ist, dass ich denke, wenn ich die "fromArray()" -Methode verwende, werden die Zahlen des Arrays transformiert, bevor ich es richtig in Excel bekommen kann Hast du eine Ahnung, wie ich dieses Problem lösen kann?

14
Periback

Die Formatierung mit einem Zahlenformat hat Einfluss darauf, wie eine Zahl angezeigt wird nicht wie sie gespeichert wird .

Sie müssen speichern die Zahlen explizit als Zeichenfolgen verwenden, so dass Sie fromArray () ..__ nicht verwenden können. Verwenden Sie stattdessen setCellValueExplicit () oder setCellValueExplicitByColumnAndRow ().

EDIT

Beachten Sie, dass Sie auch Stile für einen Zellbereich festlegen können, sodass Sie den Overhead der for-Schleife nicht hinzufügen müssen:

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

EDIT # 2 Verwenden eines Zellbinders

Erstellen Sie einen benutzerdefinierten Zellenwertordner:

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); 
    } 
} 

Um Probleme mit dem Autoloader zu vermeiden, erstellen Sie diesen im Verzeichnis/Classes/PHPExcel/Cell. Andernfalls geben Sie der Klasse einen anderen Namen als PHPExcel und stellen Sie sicher, dass sie unabhängig geladen wird.

Bevor Sie Ihren fromArray () - Aufruf verwenden, weisen Sie PHPExcel an, anstelle des Standardordners Ihren Wertordner zu verwenden:

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

Ich weiß, dass dies alles schon vor einiger Zeit veröffentlicht wurde, aber ich wollte etwas mitteilen, was für mich funktionierte. Sie können also weiterhin ->fromArray verwenden und müssen nicht die gesamte Tabelle durchlaufen.

Wenn Sie Ihre Werte in ="VALUE" einpacken, werden sie als Text angezeigt und nicht konvertiert. In Ihrer Tabelle werden keine Anführungszeichen angezeigt

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

Sie können den Wert mit dem Zeichen vor oder nach dem Wert in Text formatieren. Beispiel add after value Zeichen ";"

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

Falls Sie die gesamten Blattnummern in Text konvertieren müssen , können Sie calculateWorksheetDimension() verwenden, um die Blattabmessungen abzurufen (Beispiel: ' A1: B200 'oder' A1: C150 ') und benutze es dann in getStyle() wie folgt:

// Get sheet dimension
$sheet_dimension = $spreadsheet->getActiveSheet()->calculateWorksheetDimension();

// Apply text format to numbers
$spreadsheet->getActiveSheet()->getStyle($sheet_dimension)->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);

Hinweis: In diesem Beispiel wird PhpSpreadsheet verwendet, da es sich um die nächste Version von handelt. -PHPExcel.

0
Jimmy Adaro