* @param count the number of rows to be removed
	 * @param shift whether to shift subsequent rows up to fill the empty space
	 */
	public void removeRows( int first, int count, boolean shift )
	{

		for( int rowIdx = first; rowIdx < (first + count); rowIdx++ )
		{
			//this.removeRowContents(rowIdx);

			Row row = rows.get( rowIdx );
			if( null == row )
			{
				continue;
			}

			Iterator<BiffRec> iter = row.getCells().iterator();
			while( iter.hasNext() )
			{
				BiffRec cell = iter.next();

				// This removes the cell from the Row's map without perturbing
				// the iterator. When removeCell tries to remove it later the
				// map will silently do nothing instead of throwing a CME.
				iter.remove();

				removeCell( cell );
			}

			rows.remove( rowIdx );
			removeRecFromVec( row );
		}

		// shift all following rows up to fill the gap left by the removed rows
		if( shift && !rows.isEmpty() )
		{
			int shiftBy = -1 * count;
			int lastrow = lastRow.getRowNumber();
			for( int rowIdx = first + 1; rowIdx <= lastrow; rowIdx++ )
			{
				Row row = rows.get( rowIdx );
				if( null == row )
				{
					continue;
				}

				shiftRow( row, shiftBy );
			}
		}

		// update sheet dimensions
		dimensions.setRowLast( (null != lastRow) ? lastRow.getRowNumber() : 0 );
	}