2012-01-19 4 views
1

Я использую одну рабочую книгу HSSF в качестве шаблона для другого. Из-за того, как это работает, поскольку вы, вероятно, знаете, читаете ли вы это, я не могу просто взять ячейку из рабочей книги 1 и установить ее стиль в CellStyle из книги 2. Как это должно быть сделано, это cloneStyleFrom второго стиль.Почему клонированный HSSFCellStyle не равен стилю, с которым он клонирован?

Однако на листе есть максимум 4000 стилей, поэтому я стараюсь избегать клонирования неограниченного количества стилей. Итак, я проверяю, соответствует ли стиль, который я собираюсь клонировать, любому стилю, который уже существует в моей книге. Если это так, я просто использую стиль, который уже существует. Если это не так, я клонирую стиль из учебника шаблонов.

Я использую метод equals, определенный ниже, который, похоже, не заботится о том, из какой книги из этого стиля.

http://www.java2s.com/Open-Source/Java-Document/Collaboration/poi-3.6/org/apache/poi/hssf/usermodel/HSSFCellStyle.java.htm#equalsObject

Однако, когда в конце всего этого я проверяю:

 
     if (!getCellStyle().equals(cell.getCellStyle())) { 
      System.out.println("Not equal to cloned style!"); 
     } else { 
      System.out.println("Equal to cloned style."); 
     } 

... выход указывает на то, что стили не равны.

Почему это?

Примечание: проверено, что оба объекта имеют тип HSSFCellStyle с использованием instanceof.

ответ

3

Я просмотрел метод equals. Если все равно, будет проверяться переменная _index. Кажется, что индекс зависит от позиции в списке объектов ExtendedFormat (см. Ниже Javadoc). Если HSSFCellStyle содержит информацию о позиции и служит в качестве обертки для ExtendedFormatRecord, возможно, вы можете повторно использовать объект ExtendedFormatRecord для экономии места.

/** 
     * get the index within the HSSFWorkbook (sequence within the collection of ExtnededFormat objects) 
     * @return unique index number of the underlying record this style represents (probably you don't care 
     * unless you're comparing which one is which) 
     */ 
     public short getIndex() { 
      return _index; 
     } 
+0

Спасибо, хороший улов. Я не знаю, почему я об этом не думал. Вероятно, ослепленный мышлением equals(), намеревался проверить сходство стиля, а не конкретное равенство рабочей книги. –

+0

Это отвечает на этот вопрос, но вызывает другое ... как определить сходство стиля. По-видимому, DataFormatString - это еще не все. –

+1

Вы можете иметь два стиля в одной книге, которые отображают то же самое, отличающиеся только их индексом. Они не будут одинаковыми, поэтому метод equals ведет себя так, как он делает – Gagravarr