您的位置:首页 > Web前端 > JavaScript

基于JavaScript的公式解释器 - 14 【单元格对象】

2010-10-19 21:33 399 查看
Cell单元格对象

文件:Cell.js

// JScript source code
var $MIN_ROW = 1,
    $MAX_ROW = 65535,
    $MIN_COL = 1,
    $MAX_COL = 256,
    $COL_STEP = 26;
// -------------- Cell ---------------
function Cell(addrStr, absoluteAddr) {
    this.set_ClassName("Cell");
    this._row = 1;
    this._col1 = 0;
    this._col2 = 1;
    this._content = null;
    this._absoluteCol = false;
    this._absoluteRow = false;
    if (arguments.length > 0) {
        switch ($T(addrStr)) {
            case "Cell": // copy
                {
                    this.set_Row(addrStr.get_Row());
                    this.set_Col(addrStr.get_Col());
                    this.set_Content(addrStr.get_Content());
                    this.set_AbsoluteCol(addrStr.get_AbsoluteCol());
                    this.set_AbsoluteRow(addrStr.get_AbsoluteRow());
                }
                break;
            case "string": // Assignment
                {
                    this.FromAddress(addrStr);
                    
                    if (arguments.length > 0)
                        this._absoluteAddress = absoluteAddr == true;
                }
                break;
        } // switch
    } // if arguments 
};
Cell.prototype = {
    // Property: Content
    get_Content: function() { return this._content; },
    set_Content: function(val) { this._content = val; },
    // Property: Row
    get_Row: function() { return this._row; },
    set_Row: function(val) {
        if (arguments.length == 0)
            throw new Exception(this, "set_Row", "Need an argument");
        switch ($T(val)) {
            case "number":
                {
                    this._row = val.toFixed();
                }
                break;
            case "string":
                {
                    var match = //$(/d+)/.exec(val);
                    if (match != null) {
                        this.set_AbsoluteRow(true);
                    }
                    else {
                        match = /(/d+)/.exec(val);
                        if (match != null)
                            this.set_AbsoluteRow(false);
                    } // if ... else match $123
                    if (match == null)
                        throw new Exception(this, "set_Row", "Wrong address type:" + val);
                    this._row = parseInt(match[1]);
                }
                break;
            default: throw new Exception(this, "set_Row", "Unsupported argument type:" + $T(val));
        } // switch
    },
    // Property: Col
    get_Col: function() { return this._col1 * $COL_STEP + this._col2; },
    set_Col: function(val) {
        if (arguments.length == 0)
            throw new Exception(this, "set_Col", "Need an argument");
        switch ($T(val)) {
            case "number":
                {
                    this._col1 = (val / $COL_STEP).toFixed();
                    this._col2 = (val - ($COL_STEP * this._col1)).toFixed();
                }
                break;
            case "string":
                {
                    var col1 = 0, col2 = 0;
                    var match = //$([a-z]{1, 2})/i.exec(val);
                    if (match != null) {
                        this.set_AbsoluteCol(true);
                    }
                    else {
                        match = /([a-z]{1,2})/i.exec(val);
                        if (match != null)
                            this.set_AbsoluteCol(false);
                    } // if ... else match 
                    if (match == null)
                        throw new Exception(this, "set_Col", "Invalid address:" + val);
                    this.set_AbsoluteCol(false);
                    // absolute
                    switch (match[1].length) {
                        case 1:
                            {
                                col2 = $Ord(match[1].charAt(0)) - $Ord('A') + $MIN_COL;
                            }
                            break;
                        case 2:
                            {
                                col1 = $Ord(match[1].charAt(0)) - $Ord('A') + $MIN_COL;
                                col2 = $Ord(match[1].charAt(1)) - $Ord('A') + $MIN_COL;
                            }
                            break;
                        default: throw new Exception(this, "FromAddress", "Invalid address:" + val);
                    } // switch
                    var col = col1 * $COL_STEP + col2;
                    if (col < $MIN_COL || col > $MAX_COL)
                        throw new Exception(this, "set_Col", "Column overrange");
                    this._absoluteAddress = absAddr;
                    this._col1 = col1;
                    this._col2 = col2;
                }
                break;
            default: throw new Exception(this, "set_Col", "Invalid format:" + val);
        } // switch
    },
    // Property: Absolute Col/row
    get_AbsoluteCol: function() { return this._absoluteCol; },
    set_AbsoluteCol: function(val) { this._absoluteCol = val; },
    get_AbsoluteRow: function() { return this._absoluteRow; },
    set_AbsoluteRow: function(val) { this._absoluteRow = val; },
    // Property: IsValid
    IsValid: function() {
        return
        this._row >= $MIN_ROW &&
            this._row <= $MAX_ROW &&
            this._col >= $MIN_COL &&
            this._col <= $MAX_COL;
    },
    // Function: ToString
    // Return the formatted string address
    ToString: function() { return this.ToAddress(); },
    // Function: ToAddress()
    // Return the formated cell address.
    ToAddress: function() {
        var col = (this.get_AbsoluteCol() ? "$" : "") +
                    $Chr($ALPHABET, this._col2 - $MIN_COL); ;
        if (this._col1 > 0) {
            col = (this.get_AbsoluteCol() ? "$" : "") +
                    $Chr($ALPHABET, this._col1 - $MIN_COL) +
                    col;
        }
        return col +
                (this.get_AbsoluteRow() ? "$" : "") + this.get_Row().toString();
    }, // function ToAddress
    // Function: FromAddress(addr)
    // Convert an address string to row/col position.
    FromAddress: function(addrStr) {
        if (arguments.length == 0)
            throw new Exception(this, "FromAddress", "Need arguments");
        var row = 0, col1 = 0, col2 = 0;
        var match = //$([a-z]{1,2})/$(/d+)/i.exec(addrStr);
        if (match != null) {
            this.set_AbsoluteCol(true);
            this.set_AbsoluteRow(true);
        }
        else {
            match = //$([a-z]{1,2})(/d+)/i.exec(addrStr);
            if (match != null) {
                this.set_AbsoluteCol(true);
                this.set_AbsoluteRow(false);
            }
            else {
                match = /([a-z]{1,2})/$(/d+)/i.exec(addrStr);
                if (match != null) {
                    this.set_AbsoluteCol(false);
                    this.set_AbsoluteRow(false);
                }
                else {
                    match = /([a-z]{1,2})(/d+)/i.exec(addrStr);
                    if (match != null) {
                        this.set_AbsoluteCol(false);
                        this.set_AbsoluteRow(false);
                    } // if ... else match 4: AB123
                } // if ... else match 3: AB$123
            } // if ... else match 2: $AB123
        } // if ... else match: $AB$123
        if (match == null)
            throw new Exception(this, "FromAddress", "Invalid address:" + addrStr);
        // absolute
        switch (match[1].length) {
            case 1:
                {
                    col2 = $Ord(match[1].charAt(0)) - $Ord('A') + $MIN_COL;
                }
                break;
            case 2:
                {
                    col1 = $Ord(match[1].charAt(0)) - $Ord('A') + $MIN_COL;
                    col2 = $Ord(match[1].charAt(1)) - $Ord('A') + $MIN_COL;
                }
                break;
            default: throw new Exception(this, "FromAddress", "Invalid address:" + addrStr);
        } // switch
        row = parseInt(match[2]);
        var col = col1 * $COL_STEP + col2;
        if (col < $MIN_COL || col > $MAX_COL || row < $MIN_ROW || row > $MAX_ROW)
            throw new Exception(this, "FromAddress", "Address over range:" + addrStr);
        this._col1 = col1;
        this._col2 = col2;
        this._row = row;
    }, // function FromAddress
    // ------------------------ Test ------------------------
    Test: function() {
        var str = [
                "Ax12",
                "A0",
                "A1",
                "A5",
                "A9",
                "A999",
                "Z0",
                "Z1",
                "Z5",
                "Z9",
                "Z999",
                "ZZ0",
                "ZZ9",
                "ZZ5",
                "AZ0",
                "AZ1",
                "AZ9",
                "AZ999",
                "ZA0",
                "ZA1",
                "ZA9",
                "ZA999",
                "$A$1",
                "$A$B$255",
                "$A1"
            ];
        var cell = new Cell();
        for (var v in str) {
            if ($T(str[v]) == "function")
                continue;
            try {
                cell.FromAddress(str[v]);
                $Debug.WriteLine(str[v] + "=" + cell.ToAddress());
            }
            catch (e) {
                $Debug.WriteLine("Invalid address:" + str[v] + "/nException:" + e.description);
            } // try ... catch
        } // for
    } // Test
};                                  // prototype



注意,Cell._content对象未使用,留待有用之人来完成吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: