/**
         * Constructor - used when copying sheets
         *
         * @param index the index into the name table
         */
        public NameRecord(CSharpJExcel.Jxl.Read.Biff.NameRecord sr, int ind)
            : base(Type.NAME)
        {
            data = sr.getData();
            name = sr.getName();
            sheetRef = sr.getSheetRef();
            index = ind;
            modified = false;

            // Copy the ranges
            CSharpJExcel.Jxl.Read.Biff.NameRecord.NameRange[] r = sr.getRanges();
            ranges = new NameRange[r.Length];
            for (int i = 0; i < ranges.Length; i++)
                {
                ranges[i] = new NameRange(r[i]);
                }
        }
Beispiel #2
0
        /**
         * Create a new name record with the given information for 2-range entities.
         *
         * @param theName      Name to be created.
         * @param theIndex     Index of this name.
         * @param extSheet     External sheet index this name refers to.
         * @param theStartRow  First row this name refers to.
         * @param theEndRow    Last row this name refers to.
         * @param theStartCol  First column this name refers to.
         * @param theEndCol    Last column this name refers to.
         * @param theStartRow2 First row this name refers to (2nd instance).
         * @param theEndRow2   Last row this name refers to (2nd instance).
         * @param theStartCol2 First column this name refers to (2nd instance).
         * @param theEndCol2   Last column this name refers to (2nd instance).
         * @param global       TRUE if this is a global name
         */
        public NameRecord(BuiltInName theName,
                          int theIndex,
                          int extSheet,
                          int theStartRow,
                          int theEndRow,
                          int theStartCol,
                          int theEndCol,
                          int theStartRow2,
                          int theEndRow2,
                          int theStartCol2,
                          int theEndCol2,
                          bool global)
            : base(Type.NAME)
        {
            builtInName = theName;
            index       = theIndex;
            sheetRef    = global ? 0 : index + 1;          // 0 indicates a global name, otherwise
            // the 1-based index of the sheet

            ranges    = new NameRange[2];
            ranges[0] = new NameRange(extSheet,
                                      theStartRow,
                                      theEndRow,
                                      theStartCol,
                                      theEndCol);
            ranges[1] = new NameRange(extSheet,
                                      theStartRow2,
                                      theEndRow2,
                                      theStartCol2,
                                      theEndCol2);
        }
Beispiel #3
0
 public virtual void Shift(int offset)
 {
     if (NameRange.Length > 0)
     {
         NameRange.Shift(offset);
     }
 }
Beispiel #4
0
        /**
         * Called when a row is removed on the worksheet
         *
         * @param sheetIndex the sheet index on which the column was inserted
         * @param row the column number which was inserted
         * @reeturn TRUE if the name is to be removed entirely, FALSE otherwise
         */
        public virtual bool columnRemoved(int sheetIndex, int col)
        {
            for (int i = 0; i < ranges.Length; i++)
            {
                if (sheetIndex != ranges[i].getExternalSheet())
                {
                    continue;                     // shame on me - this is no better than a goto
                }

                if (col == ranges[i].getFirstColumn() && col ==
                    ranges[i].getLastColumn())
                {
                    // remove the range
                    ranges[i] = EMPTY_RANGE;
                }

                if (col < ranges[i].getFirstColumn() && col > 0)
                {
                    ranges[i].decrementFirstColumn();
                    modified = true;
                }

                if (col <= ranges[i].getLastColumn())
                {
                    ranges[i].decrementLastColumn();
                    modified = true;
                }
            }

            // If all ranges are empty, then remove the name
            int emptyRanges = 0;

            for (int i = 0; i < ranges.Length; i++)
            {
                if (ranges[i] == EMPTY_RANGE)
                {
                    emptyRanges++;
                }
            }

            if (emptyRanges == ranges.Length)
            {
                return(true);
            }

            // otherwise just remove the empty ones
            NameRange[] newRanges = new NameRange[ranges.Length - emptyRanges];
            for (int i = 0; i < ranges.Length; i++)
            {
                if (ranges[i] != EMPTY_RANGE)
                {
                    newRanges[i] = ranges[i];
                }
            }

            ranges = newRanges;

            return(false);
        }
Beispiel #5
0
        /**
         * Gets the array of ranges for this name.  This method is public as it is
         * used from the writable side when copying ranges
         *
         * @return the ranges
         */
        public NameRange[] getRanges()
        {
            NameRange[] nr  = new NameRange[ranges.Count];
            int         pos = 0;

            foreach (NameRange record in ranges)
            {
                nr[pos++] = record;
            }
            return(nr);
        }
Beispiel #6
0
        /**
         * Constructor - used when copying sheets
         *
         * @param index the index into the name table
         */
        public NameRecord(CSharpJExcel.Jxl.Read.Biff.NameRecord sr, int ind)
            : base(Type.NAME)
        {
            data     = sr.getData();
            name     = sr.getName();
            sheetRef = sr.getSheetRef();
            index    = ind;
            modified = false;

            // Copy the ranges
            CSharpJExcel.Jxl.Read.Biff.NameRecord.NameRange[] r = sr.getRanges();
            ranges = new NameRange[r.Length];
            for (int i = 0; i < ranges.Length; i++)
            {
                ranges[i] = new NameRange(r[i]);
            }
        }
Beispiel #7
0
        /**
         * Create a new name record with the given information.
         *
         * @param theName      Name to be created.
         * @param theIndex     Index of this name.
         * @param extSheet     External sheet index this name refers to.
         * @param theStartRow  First row this name refers to.
         * @param theEndRow    Last row this name refers to.
         * @param theStartCol  First column this name refers to.
         * @param theEndCol    Last column this name refers to.
         * @param global       TRUE if this is a global name
         */
        public NameRecord(string theName,
                          int theIndex,
                          int extSheet,
                          int theStartRow,
                          int theEndRow,
                          int theStartCol,
                          int theEndCol,
                          bool global)
            : base(Type.NAME)
        {
            name     = theName;
            index    = theIndex;
            sheetRef = global ? 0 : index + 1;             // 0 indicates a global name, otherwise
            // the 1-based index of the sheet

            ranges    = new NameRange[1];
            ranges[0] = new NameRange(extSheet,
                                      theStartRow,
                                      theEndRow,
                                      theStartCol,
                                      theEndCol);
            modified = true;
        }
Beispiel #8
0
        /// <summary> Constructs this object from the raw data
        ///
        /// </summary>
        /// <param name="t">the raw data
        /// </param>
        /// <param name="ws">the workbook settings
        /// </param>
        /// <param name="ind">the index in the name table
        /// </param>
        /// <param name="dummy">dummy parameter to indicate a biff7 workbook
        /// </param>
        internal NameRecord(Record t, WorkbookSettings ws, int ind, Biff7 dummy) : base(t)
        {
            index = ind;
            try
            {
                ranges = new ArrayList();
                sbyte[] data   = getRecord().Data;
                int     length = data[3];
                name = StringHelper.getString(data, length, 14, ws);

                int pos = length + 14;

                if (pos >= data.Length)
                {
                    // There appears to be nothing after the name, so return
                    return;
                }

                if (data[pos] == cellReference)
                {
                    int sheet  = IntegerHelper.getInt(data[pos + 11], data[pos + 12]);
                    int row    = IntegerHelper.getInt(data[pos + 15], data[pos + 16]);
                    int column = data[pos + 17];

                    NameRange r = new NameRange(this, sheet, column, row, column, row);
                    ranges.Add(r);
                }
                else if (data[pos] == areaReference)
                {
                    int sheet1 = 0;
                    int sheet2 = 0;
                    int r1     = 0;
                    //        int columnMask = 0;
                    int       c1    = 0;
                    int       r2    = 0;
                    int       c2    = 0;
                    NameRange range = null;

                    while (pos < data.Length)
                    {
                        sheet1 = IntegerHelper.getInt(data[pos + 11], data[pos + 12]);
                        sheet2 = IntegerHelper.getInt(data[pos + 13], data[pos + 14]);
                        r1     = IntegerHelper.getInt(data[pos + 15], data[pos + 16]);
                        r2     = IntegerHelper.getInt(data[pos + 17], data[pos + 18]);

                        c1 = data[pos + 19];
                        c2 = data[pos + 20];

                        range = new NameRange(this, sheet1, c1, r1, c2, r2);
                        ranges.Add(range);

                        pos += 21;
                    }
                }
                else if (data[pos] == subExpression)
                {
                    int sheet1 = 0;
                    int sheet2 = 0;
                    int r1     = 0;
                    //        int columnMask = 0;
                    int       c1    = 0;
                    int       r2    = 0;
                    int       c2    = 0;
                    NameRange range = null;

                    // Consume unnecessary parsed tokens
                    if (pos < data.Length && data[pos] != cellReference && data[pos] != areaReference)
                    {
                        if (data[pos] == subExpression)
                        {
                            pos += 3;
                        }
                        else if (data[pos] == union)
                        {
                            pos += 1;
                        }
                    }

                    while (pos < data.Length)
                    {
                        sheet1 = IntegerHelper.getInt(data[pos + 11], data[pos + 12]);
                        sheet2 = IntegerHelper.getInt(data[pos + 13], data[pos + 14]);
                        r1     = IntegerHelper.getInt(data[pos + 15], data[pos + 16]);
                        r2     = IntegerHelper.getInt(data[pos + 17], data[pos + 18]);

                        c1 = data[pos + 19];
                        c2 = data[pos + 20];

                        range = new NameRange(this, sheet1, c1, r1, c2, r2);
                        ranges.Add(range);

                        pos += 21;

                        // Consume unnecessary parsed tokens
                        if (pos < data.Length && data[pos] != cellReference && data[pos] != areaReference)
                        {
                            if (data[pos] == subExpression)
                            {
                                pos += 3;
                            }
                            else if (data[pos] == union)
                            {
                                pos += 1;
                            }
                        }
                    }
                }
            }
            catch (System.Exception t1)
            {
                // Generate a warning
                // Names are really a nice to have, and we don't want to halt the
                // reading process for functionality that probably won't be used
                logger.warn("Cannot read name.");
                name = "ERROR";
            }
        }
Beispiel #9
0
        /// <summary> Constructs this object from the raw data
        ///
        /// </summary>
        /// <param name="t">the raw data
        /// </param>
        /// <param name="ws">the workbook settings
        /// </param>
        /// <param name="ind">the index in the name table
        /// </param>
        internal NameRecord(Record t, WorkbookSettings ws, int ind) : base(t)
        {
            index = ind;

            try
            {
                ranges = new ArrayList();

                sbyte[] data   = getRecord().Data;
                int     length = data[3];
                name = StringHelper.getString(data, length, 15, ws);
                int pos = length + 15;

                if (data[pos] == cellReference)
                {
                    int sheet      = IntegerHelper.getInt(data[pos + 1], data[pos + 2]);
                    int row        = IntegerHelper.getInt(data[pos + 3], data[pos + 4]);
                    int columnMask = IntegerHelper.getInt(data[pos + 5], data[pos + 6]);
                    int column     = columnMask & 0xff;

                    // Check that we are not dealing with offsets
                    Assert.verify((columnMask & 0xc0000) == 0);

                    NameRange r = new NameRange(this, sheet, column, row, column, row);
                    ranges.Add(r);
                }
                else if (data[pos] == areaReference)
                {
                    int sheet1 = 0;
                    //        int sheet2 = 0;
                    int       r1         = 0;
                    int       columnMask = 0;
                    int       c1         = 0;
                    int       r2         = 0;
                    int       c2         = 0;
                    NameRange range      = null;

                    while (pos < data.Length)
                    {
                        sheet1 = IntegerHelper.getInt(data[pos + 1], data[pos + 2]);
                        r1     = IntegerHelper.getInt(data[pos + 3], data[pos + 4]);
                        r2     = IntegerHelper.getInt(data[pos + 5], data[pos + 6]);

                        columnMask = IntegerHelper.getInt(data[pos + 7], data[pos + 8]);
                        c1         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        columnMask = IntegerHelper.getInt(data[pos + 9], data[pos + 10]);
                        c2         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        range = new NameRange(this, sheet1, c1, r1, c2, r2);
                        ranges.Add(range);

                        pos += 11;
                    }
                }
                else if (data[pos] == subExpression)
                {
                    int sheet1 = 0;
                    //        int sheet2 = 0;
                    int       r1         = 0;
                    int       columnMask = 0;
                    int       c1         = 0;
                    int       r2         = 0;
                    int       c2         = 0;
                    NameRange range      = null;

                    // Consume unnecessary parsed tokens
                    if (pos < data.Length && data[pos] != cellReference && data[pos] != areaReference)
                    {
                        if (data[pos] == subExpression)
                        {
                            pos += 3;
                        }
                        else if (data[pos] == union)
                        {
                            pos += 1;
                        }
                    }

                    while (pos < data.Length)
                    {
                        sheet1 = IntegerHelper.getInt(data[pos + 1], data[pos + 2]);
                        r1     = IntegerHelper.getInt(data[pos + 3], data[pos + 4]);
                        r2     = IntegerHelper.getInt(data[pos + 5], data[pos + 6]);

                        columnMask = IntegerHelper.getInt(data[pos + 7], data[pos + 8]);
                        c1         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        columnMask = IntegerHelper.getInt(data[pos + 9], data[pos + 10]);
                        c2         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        range = new NameRange(this, sheet1, c1, r1, c2, r2);
                        ranges.Add(range);

                        pos += 11;

                        // Consume unnecessary parsed tokens
                        if (pos < data.Length && data[pos] != cellReference && data[pos] != areaReference)
                        {
                            if (data[pos] == subExpression)
                            {
                                pos += 3;
                            }
                            else if (data[pos] == union)
                            {
                                pos += 1;
                            }
                        }
                    }
                }
            }
            catch (System.Exception t1)
            {
                // Generate a warning
                // Names are really a nice to have, and we don't want to halt the
                // reading process for functionality that probably won't be used
                logger.warn("Cannot read name");
                name = "ERROR";
            }
        }
        /**
         * Called when a row is removed on the worksheet
         *
         * @param sheetIndex the sheet index on which the column was inserted
         * @param row the column number which was inserted
         * @reeturn TRUE if the name is to be removed entirely, FALSE otherwise
         */
        public virtual bool rowRemoved(int sheetIndex, int row)
        {
            for (int i = 0; i < ranges.Length; i++)
                {
                if (sheetIndex != ranges[i].getExternalSheet())
                    {
                    continue; // shame on me - this is no better than a goto
                    }

                if (row == ranges[i].getFirstRow() && row == ranges[i].getLastRow())
                    {
                    // remove the range
                    ranges[i] = EMPTY_RANGE;
                    }

                if (row < ranges[i].getFirstRow() && row > 0)
                    {
                    ranges[i].decrementFirstRow();
                    modified = true;
                    }

                if (row <= ranges[i].getLastRow())
                    {
                    ranges[i].decrementLastRow();
                    modified = true;
                    }
                }

            // If all ranges are empty, then remove the name
            int emptyRanges = 0;
            for (int i = 0; i < ranges.Length; i++)
                {
                if (ranges[i] == EMPTY_RANGE)
                    {
                    emptyRanges++;
                    }
                }

            if (emptyRanges == ranges.Length)
                {
                return true;
                }

            // otherwise just remove the empty ones
            NameRange[] newRanges = new NameRange[ranges.Length - emptyRanges];
            for (int i = 0; i < ranges.Length; i++)
                {
                if (ranges[i] != EMPTY_RANGE)
                    {
                    newRanges[i] = ranges[i];
                    }
                }

            ranges = newRanges;

            return false;
        }
        /**
         * Create a new name record with the given information for 2-range entities.
         *
         * @param theName      Name to be created.
         * @param theIndex     Index of this name.
         * @param extSheet     External sheet index this name refers to.
         * @param theStartRow  First row this name refers to.
         * @param theEndRow    Last row this name refers to.
         * @param theStartCol  First column this name refers to.
         * @param theEndCol    Last column this name refers to.
         * @param theStartRow2 First row this name refers to (2nd instance).
         * @param theEndRow2   Last row this name refers to (2nd instance).
         * @param theStartCol2 First column this name refers to (2nd instance).
         * @param theEndCol2   Last column this name refers to (2nd instance).
         * @param global       TRUE if this is a global name
         */
        public NameRecord(BuiltInName theName,
            int theIndex,
            int extSheet,
            int theStartRow,
            int theEndRow,
            int theStartCol,
            int theEndCol,
            int theStartRow2,
            int theEndRow2,
            int theStartCol2,
            int theEndCol2,
            bool global)
            : base(Type.NAME)
        {
            builtInName = theName;
            index = theIndex;
            sheetRef = global ? 0 : index + 1; // 0 indicates a global name, otherwise
            // the 1-based index of the sheet

            ranges = new NameRange[2];
            ranges[0] = new NameRange(extSheet,
                                      theStartRow,
                                      theEndRow,
                                      theStartCol,
                                      theEndCol);
            ranges[1] = new NameRange(extSheet,
                                      theStartRow2,
                                      theEndRow2,
                                      theStartCol2,
                                      theEndCol2);
        }
        /**
         * Create a new name record with the given information.
         *
         * @param theName      Name to be created.
         * @param theIndex     Index of this name.
         * @param extSheet     External sheet index this name refers to.
         * @param theStartRow  First row this name refers to.
         * @param theEndRow    Last row this name refers to.
         * @param theStartCol  First column this name refers to.
         * @param theEndCol    Last column this name refers to.
         * @param global       TRUE if this is a global name
         */
        public NameRecord(string theName,
            int theIndex,
            int extSheet,
            int theStartRow,
            int theEndRow,
            int theStartCol,
            int theEndCol,
            bool global)
            : base(Type.NAME)
        {
            name = theName;
            index = theIndex;
            sheetRef = global ? 0 : index + 1; // 0 indicates a global name, otherwise
            // the 1-based index of the sheet

            ranges = new NameRange[1];
            ranges[0] = new NameRange(extSheet,
                                      theStartRow,
                                      theEndRow,
                                      theStartCol,
                                      theEndCol);
            modified = true;
        }
 /**
  * Gets the array of ranges for this name.  This method is public as it is
  * used from the writable side when copying ranges
  *
  * @return the ranges
  */
 public NameRange[] getRanges()
 {
     NameRange[] nr = new NameRange[ranges.Count];
     int pos = 0;
     foreach (NameRange record in ranges)
         nr[pos++] = record;
     return nr;
 }
        /**
         * Constructs this object from the raw data
         *
         * @param t the raw data
         * @param ws the workbook settings
         * @param ind the index in the name table
         * @param dummy dummy parameter to indicate a biff7 workbook
         */
        public NameRecord(Record t,WorkbookSettings ws,int ind,Biff7 dummy)
            : base(t)
        {
            index = ind;
            isbiff8 = false;

            try
                {
                ranges = new ArrayList();
                byte[] data = getRecord().getData();
                int length = data[3];
                sheetRef = IntegerHelper.getInt(data[8],data[9]);
                name = StringHelper.getString(data,length,14,ws);

                int pos = length + 14;

                if (pos >= data.Length)
                    {
                    // There appears to be nothing after the name, so return
                    return;
                    }

                if (data[pos] == cellReference)
                    {
                    int sheet = IntegerHelper.getInt(data[pos + 11],data[pos + 12]);
                    int row = IntegerHelper.getInt(data[pos + 15],data[pos + 16]);
                    int column = data[pos + 17];

                    NameRange r = new NameRange(sheet,column,row,column,row);
                    ranges.Add(r);
                    }
                else if (data[pos] == areaReference)
                    {
                    int sheet1 = 0;
                    int r1 = 0;
                    int c1 = 0;
                    int r2 = 0;
                    int c2 = 0;
                    NameRange range = null;

                    while (pos < data.Length)
                        {
                        sheet1 = IntegerHelper.getInt(data[pos + 11],data[pos + 12]);
                        r1 = IntegerHelper.getInt(data[pos + 15],data[pos + 16]);
                        r2 = IntegerHelper.getInt(data[pos + 17],data[pos + 18]);

                        c1 = data[pos + 19];
                        c2 = data[pos + 20];

                        range = new NameRange(sheet1,c1,r1,c2,r2);
                        ranges.Add(range);

                        pos += 21;
                        }
                    }
                else if (data[pos] == subExpression)
                    {
                    int sheet1 = 0;
            //					int sheet2 = 0;
                    int r1 = 0;
                    int c1 = 0;
                    int r2 = 0;
                    int c2 = 0;
                    NameRange range = null;

                    // Consume unnecessary parsed tokens
                    if (pos < data.Length &&
                        data[pos] != cellReference &&
                        data[pos] != areaReference)
                        {
                        if (data[pos] == subExpression)
                            pos += 3;
                        else if (data[pos] == union)
                            pos += 1;
                        }

                    while (pos < data.Length)
                        {
                        sheet1 = IntegerHelper.getInt(data[pos + 11],data[pos + 12]);
                        r1 = IntegerHelper.getInt(data[pos + 15],data[pos + 16]);
                        r2 = IntegerHelper.getInt(data[pos + 17],data[pos + 18]);

                        c1 = data[pos + 19];
                        c2 = data[pos + 20];

                        range = new NameRange(sheet1,c1,r1,c2,r2);
                        ranges.Add(range);

                        pos += 21;

                        // Consume unnecessary parsed tokens
                        if (pos < data.Length &&
                            data[pos] != cellReference &&
                            data[pos] != areaReference)
                            {
                            if (data[pos] == subExpression)
                                pos += 3;
                            else if (data[pos] == union)
                                pos += 1;
                            }
                        }
                    }
                }
            catch (Exception t1)
                {
                // Generate a warning
                // Names are really a nice to have, and we don't want to halt the
                // reading process for functionality that probably won't be used
                //logger.warn("Cannot read name.");
                name = "ERROR";
                }
        }
        /**
         * Constructs this object from the raw data
         *
         * @param t the raw data
         * @param ws the workbook settings
         * @param ind the index in the name table
         */
        public NameRecord(Record t,WorkbookSettings ws,int ind)
            : base(t)
        {
            index = ind;
            isbiff8 = true;

            try
                {
                ranges = new ArrayList();

                byte[] data = getRecord().getData();
                int option = IntegerHelper.getInt(data[0],data[1]);
                int length = data[3];
                sheetRef = IntegerHelper.getInt(data[8],data[9]);

                if ((option & builtIn) != 0)
                    {
                    builtInName = BuiltInName.getBuiltInName(data[15]);
                    }
                else
                    {
                    name = StringHelper.getString(data,length,15,ws);
                    }

                if ((option & commandMacro) != 0)
                    {
                    // This is a command macro, so it has no cell references
                    return;
                    }

                int pos = length + 15;

                if (data[pos] == cellReference)
                    {
                    int sheet = IntegerHelper.getInt(data[pos + 1],data[pos + 2]);
                    int row = IntegerHelper.getInt(data[pos + 3],data[pos + 4]);
                    int columnMask = IntegerHelper.getInt(data[pos + 5],data[pos + 6]);
                    int column = columnMask & 0xff;

                    // Check that we are not dealing with offsets
                    Assert.verify((columnMask & 0xc0000) == 0);

                    NameRange r = new NameRange(sheet,column,row,column,row);
                    ranges.Add(r);
                    }
                else if (data[pos] == areaReference)
                    {
                    int sheet1 = 0;
                    int r1 = 0;
                    int columnMask = 0;
                    int c1 = 0;
                    int r2 = 0;
                    int c2 = 0;
                    NameRange range = null;

                    while (pos < data.Length)
                        {
                        sheet1 = IntegerHelper.getInt(data[pos + 1],data[pos + 2]);
                        r1 = IntegerHelper.getInt(data[pos + 3],data[pos + 4]);
                        r2 = IntegerHelper.getInt(data[pos + 5],data[pos + 6]);

                        columnMask = IntegerHelper.getInt(data[pos + 7],data[pos + 8]);
                        c1 = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        columnMask = IntegerHelper.getInt(data[pos + 9],data[pos + 10]);
                        c2 = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        range = new NameRange(sheet1,c1,r1,c2,r2);
                        ranges.Add(range);

                        pos += 11;
                        }
                    }
                else if (data[pos] == subExpression)
                    {
                    int sheet1 = 0;
                    int r1 = 0;
                    int columnMask = 0;
                    int c1 = 0;
                    int r2 = 0;
                    int c2 = 0;
                    NameRange range = null;

                    // Consume unnecessary parsed tokens
                    if (pos < data.Length &&
                        data[pos] != cellReference &&
                        data[pos] != areaReference)
                        {
                        if (data[pos] == subExpression)
                            {
                            pos += 3;
                            }
                        else if (data[pos] == union)
                            {
                            pos += 1;
                            }
                        }

                    while (pos < data.Length)
                        {
                        sheet1 = IntegerHelper.getInt(data[pos + 1],data[pos + 2]);
                        r1 = IntegerHelper.getInt(data[pos + 3],data[pos + 4]);
                        r2 = IntegerHelper.getInt(data[pos + 5],data[pos + 6]);

                        columnMask = IntegerHelper.getInt(data[pos + 7],data[pos + 8]);
                        c1 = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        columnMask = IntegerHelper.getInt(data[pos + 9],data[pos + 10]);
                        c2 = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        range = new NameRange(sheet1,c1,r1,c2,r2);
                        ranges.Add(range);

                        pos += 11;

                        // Consume unnecessary parsed tokens
                        if (pos < data.Length &&
                            data[pos] != cellReference &&
                            data[pos] != areaReference)
                            {
                            if (data[pos] == subExpression)
                                {
                                pos += 3;
                                }
                            else if (data[pos] == union)
                                {
                                pos += 1;
                                }
                            }
                        }
                    }
                else
                    {
                    string n = name != null ? name : builtInName.getName();
                    //logger.warn("Cannot read name ranges for " + n + " - setting to empty");
                    NameRange range = new NameRange(0,0,0,0,0);
                    ranges.Add(range);
                    }
                }
            catch (Exception t1)
                {
                // Generate a warning
                // Names are really a nice to have, and we don't want to halt the
                // reading process for functionality that probably won't be used
                //logger.warn("Cannot read name");
                name = "ERROR";
                }
        }
Beispiel #16
0
        /**
         * Constructs this object from the raw data
         *
         * @param t the raw data
         * @param ws the workbook settings
         * @param ind the index in the name table
         */
        public NameRecord(Record t, WorkbookSettings ws, int ind)
            : base(t)
        {
            index   = ind;
            isbiff8 = true;

            try
            {
                ranges = new ArrayList();

                byte[] data   = getRecord().getData();
                int    option = IntegerHelper.getInt(data[0], data[1]);
                int    length = data[3];
                sheetRef = IntegerHelper.getInt(data[8], data[9]);

                if ((option & builtIn) != 0)
                {
                    builtInName = BuiltInName.getBuiltInName(data[15]);
                }
                else
                {
                    name = StringHelper.getString(data, length, 15, ws);
                }

                if ((option & commandMacro) != 0)
                {
                    // This is a command macro, so it has no cell references
                    return;
                }

                int pos = length + 15;

                if (data[pos] == cellReference)
                {
                    int sheet      = IntegerHelper.getInt(data[pos + 1], data[pos + 2]);
                    int row        = IntegerHelper.getInt(data[pos + 3], data[pos + 4]);
                    int columnMask = IntegerHelper.getInt(data[pos + 5], data[pos + 6]);
                    int column     = columnMask & 0xff;

                    // Check that we are not dealing with offsets
                    Assert.verify((columnMask & 0xc0000) == 0);

                    NameRange r = new NameRange(sheet, column, row, column, row);
                    ranges.Add(r);
                }
                else if (data[pos] == areaReference)
                {
                    int       sheet1     = 0;
                    int       r1         = 0;
                    int       columnMask = 0;
                    int       c1         = 0;
                    int       r2         = 0;
                    int       c2         = 0;
                    NameRange range      = null;

                    while (pos < data.Length)
                    {
                        sheet1 = IntegerHelper.getInt(data[pos + 1], data[pos + 2]);
                        r1     = IntegerHelper.getInt(data[pos + 3], data[pos + 4]);
                        r2     = IntegerHelper.getInt(data[pos + 5], data[pos + 6]);

                        columnMask = IntegerHelper.getInt(data[pos + 7], data[pos + 8]);
                        c1         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        columnMask = IntegerHelper.getInt(data[pos + 9], data[pos + 10]);
                        c2         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        range = new NameRange(sheet1, c1, r1, c2, r2);
                        ranges.Add(range);

                        pos += 11;
                    }
                }
                else if (data[pos] == subExpression)
                {
                    int       sheet1     = 0;
                    int       r1         = 0;
                    int       columnMask = 0;
                    int       c1         = 0;
                    int       r2         = 0;
                    int       c2         = 0;
                    NameRange range      = null;

                    // Consume unnecessary parsed tokens
                    if (pos < data.Length &&
                        data[pos] != cellReference &&
                        data[pos] != areaReference)
                    {
                        if (data[pos] == subExpression)
                        {
                            pos += 3;
                        }
                        else if (data[pos] == union)
                        {
                            pos += 1;
                        }
                    }

                    while (pos < data.Length)
                    {
                        sheet1 = IntegerHelper.getInt(data[pos + 1], data[pos + 2]);
                        r1     = IntegerHelper.getInt(data[pos + 3], data[pos + 4]);
                        r2     = IntegerHelper.getInt(data[pos + 5], data[pos + 6]);

                        columnMask = IntegerHelper.getInt(data[pos + 7], data[pos + 8]);
                        c1         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        columnMask = IntegerHelper.getInt(data[pos + 9], data[pos + 10]);
                        c2         = columnMask & 0xff;

                        // Check that we are not dealing with offsets
                        Assert.verify((columnMask & 0xc0000) == 0);

                        range = new NameRange(sheet1, c1, r1, c2, r2);
                        ranges.Add(range);

                        pos += 11;

                        // Consume unnecessary parsed tokens
                        if (pos < data.Length &&
                            data[pos] != cellReference &&
                            data[pos] != areaReference)
                        {
                            if (data[pos] == subExpression)
                            {
                                pos += 3;
                            }
                            else if (data[pos] == union)
                            {
                                pos += 1;
                            }
                        }
                    }
                }
                else
                {
                    string n = name != null ? name : builtInName.getName();
                    //logger.warn("Cannot read name ranges for " + n + " - setting to empty");
                    NameRange range = new NameRange(0, 0, 0, 0, 0);
                    ranges.Add(range);
                }
            }
            catch (Exception t1)
            {
                // Generate a warning
                // Names are really a nice to have, and we don't want to halt the
                // reading process for functionality that probably won't be used
                //logger.warn("Cannot read name");
                name = "ERROR";
            }
        }