/** * 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]); } }
/** * 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); }
public virtual void Shift(int offset) { if (NameRange.Length > 0) { NameRange.Shift(offset); } }
/** * 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); }
/** * 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); }
/** * 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; }
/// <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"; } }
/// <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; }
/** * 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"; } }
/** * 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"; } }