この phpspreadsheet は非常に優れていますが、実際にはドキュメントがありません。それで、私はたくさん読んで、自分の個人的な valueBinder を定義しようとしていました。それは正しいと思いますが、実行されていないと思います。
まず最初に、次のようにバインダーを作成します。
class MyValueBinder extends DefaultValueBinder{
/**
* Bind value to a cell.
*
* @param Cell $cell Cell to bind value to
* @param mixed $value Value to bind in cell
*
* @return bool
*/
public function bindValue(Cell $cell, $value){
if($cell->getColumn() == 'D'){
// Set value explicit
//$cell->setValueExplicit($value, DataType::TYPE_STRING);
$cell->setValueExplicit("ok", DataType::TYPE_STRING);
}
return parent::bindValue($cell, $value);
}
}
ご覧のとおり、D列のすべてのセルにタイプ文字列をバインドするだけでしたが、デバッグのためにD列のすべてのセルにokの値を入れようとしました。
次に、私のメインページで:
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Cell\Cell;
\PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder(new \PhpOffice\PhpSpreadsheet\Cell\MyValueBinder());
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
//After this I load my file e do some modifications and then I make
// a Writer CSV and write everything on a csv file.
この時点で悲しいことがありました。csv ファイルで同じ間違った値を見つけたからです。たとえば、csv に 1345 のような数値がある場合、1,345 があります。
何万もの行があるため、このことを修正するために CSV を再スキャンしたくありません