3

私のコードはgetFormattedValue()メソッドを使用してデータをPHPにプルします。

これは、列Dに「テキストとして格納された数値」を持つ.xlsの問題部分です。

Excel cells contains next values:   D7 -> 0,43;  E7 -> =D7*1,2;  F7 -> =E7*11,2;
getFormattedValue() returns:          0,43;        #VALUE!;          #VALUE!;
getCalculatedValue() also returns     0,43;        #VALUE!;          #VALUE!;
getValue() returns                    0,43;        D7*1.2;           E7*11.2;

私がそれをExcelで修正すれば、それが提案するように、数になります。その後、getFormattedValue()は問題なく機能します。しかし、私はあなたのxlsが間違っていることをクライアントに伝えることができません...

では、質問ですが、PHPExcelをExcelのように動作させることは可能ですか?または、これを機能させるための他の方法かもしれません。

あなたの助けと時間をありがとう!

---編集1---

基本的には、マーク・ベイカーの答えに対するコメントです。

.xlsファイルへの変更を含まないソリューションを見つけたいと思います。それがどのような構造になるのか、問題のあるセルはどこにあるのかなどはわかりません。

PHPExcelにそのセルを認識させる方法はありますか?多分MSExcelはそれをどのように行うのでしょうか?または、それを行うための方法を見つけてください。

セルの値をそれ自体で除算しようと考えています。1を取得すると、それは数値セルになります。AND\OR数学計算に含まれるセルを検索します。私が何を意味するかをよりよく理解するために-セルE7にはD7*1,2が含まれています。だから、私たちはチェックすることができます-D7は数値ですか?そんな感じ。

現時点では、この問題に対する解決策はありません...ですから、どんな助けでも素晴らしいでしょう。

4

1 に答える 1

2

E列とF列のセルから値を取得する前に、D列のこれらの文字列値を有効な数値に変換する必要があります(コンマではなく小数点を使用)。問題のあるセルが常に同じ列にある場合(または予測が最も難しい)ワークブックがロードされるときに、セルバインダーを使用してこの変換を処理できます。

編集

次のようなバインダーを作成する必要があります。

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

        // Find out data type
        $dataType = parent::dataTypeForValue($value);

        if ($dataType === PHPExcel_Cell_DataType::TYPE_STRING && 
            !$value instanceof PHPExcel_RichText) {
            if (preg_match('/^\d+,\d+$/', $value)) {
                list($w, $d) = explode(',', $value);
                $value = (float) $w . '.' . $d;
                $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
                return true;
            }
        }

        // Not bound yet? Use parent...
        return parent::bindValue($cell, $value);
    }
}
于 2012-11-18T16:49:07.563 に答える