web-dev-qa-db-ja.com

PHPExcelで数値をテキスト形式として読み取る

01、01A、01B、02、2などの数値を格納できる配列があり、PHPExcelを使用してこの値を取得すると、たとえば01、02の場合は「0」が削除されます。この問題を解決するために、これらの値がExcelに格納される行をフォーマットし、次のコードのようにテキストタイプとして設定しようとしました。

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

したがって、これを行うことで、01、01A、02、02Bなどの番号を持つ配列を取得し、行A2に格納します。 For条件でこの値を使用するための最高の列を取得します。この状態で、範囲Aの行1を最上位の列まで設定し、テキストとしてフォーマットします。

私のテンプレートは生成され、すべての数値はテキスト形式ですが、問題は、「fromArray()」メソッドを使用すると、配列の数値を変換してから正しく取得できると思うことですエクセル。この問題をどのように解決できますか?

16
Periback

数値形式を使用した書式設定は、数値の格納ではなく、数値の表示に影響します。

store数値を文字列として明示的に指定する必要があるため、fromArray()を使用できません。代わりに、setCellValueExplicit()またはsetCellValueExplicitByColumnAndRow()を使用して、PHPExcel_Cell_DataType :: TYPE_STRINGの$ pDataType引数を渡します。

[〜#〜] edit [〜#〜]

セル範囲にスタイルを設定することもできるため、forループのオーバーヘッドを追加する必要がないことに注意してください。

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

編集#2セル​​バインダーの使用

カスタマイズされたセル値バインダーを作成します。

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

オートローダーの問題を回避するには、/ Classes/PHPExcel/Cellディレクトリに作成します。それ以外の場合は、クラスに独自の非PHPExcel名を付けて、独立してロードされるようにします。

次に、fromArray()呼び出しを使用する前に、PHPExcelにデフォルトのバインダーの代わりに値バインダーを使用するように指示します。

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

これはすべて以前に投稿されたことを知っていますが、私のために働いたものを共有したかったので、->fromArrayを引き続き使用でき、スプレッドシート全体を繰り返す必要はありません。

値を="VALUE"でラップすると、変換されずにテキストとして処理され、スプレッドシートでは引用符で囲まれなくなります

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

値の前または後に文字を追加して、値をテキストにフォーマットできます。例値の後に追加する文字「;」

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

シート番号全体をテキストに変換する必要がある場合calculateWorksheetDimension()を使用してシートの寸法を取得できます(例: ' A1:B200 'または'A1:C150 ')そしてgetStyle()で使用します。 :

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

注:この例では PhpSpreadsheet を使用しますPHPExcel

0
Jimmy Adaro