20

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の条件でこの値を使用するための最も高い列を取得します。この状態で、行1をAから最上位の列までの範囲で、テキストとしてフォーマットするように設定しました。

テンプレートが生成され、すべての数値がテキスト形式になっていますが、問題は、 " fromArray()"メソッドを使用すると、Excelで正しく取得する前に配列の数値が変換されると思うことです。この問題をどのように解決できるか考えていますか?

4

6 に答える 6

34

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

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

編集

セルの範囲にスタイルを設定することもできるため、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() );
于 2012-09-17T10:47:16.893 に答える
8

シート番号全体をテキストに変換する必要がある場合は、を使用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);

注:この例では、 PHPExcelの次のバージョンであるPhpSpreadsheetを使用しています。

于 2019-09-02T17:48:51.737 に答える
7

これはすべて少し前に投稿されたものですが、自分に合ったものを共有したかったので、->fromArrayスプレッドシート全体を繰り返し使用する必要はありません。

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

于 2016-08-12T22:40:58.100 に答える
3
$objPHPExcel
   ->getActiveSheet()
   ->getCellByColumnAndRow($col, $row)
   ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
于 2017-08-31T12:12:35.297 に答える
1

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

$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $row,$user->msisdn.';' );
于 2015-04-17T03:25:23.403 に答える
1

これを試して :

$objPHPExcel->getActiveSheet()->setCellValueExplicit("A1","yourvalue",PHPExcel_Cell_DataType::TYPE_STRING);

ここでsetCellValueExplicit関数を参照してください:https ://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Worksheet.php

于 2021-09-13T07:56:34.950 に答える