Фильтрация по цвету [MEMO]

Автор p1ter, 23 декабря 2010, 15:08

0 Пользователи и 1 гость просматривают эту тему.

ape

Цитата: Клио от 24 декабря 2010, 16:35
...удобно использовать Netbeans + плагин для OOo.
Извините, какой плагин и где его можно найти?

Рыбка Рио

Цитата: ape от 24 декабря 2010, 14:43Извините, какой плагин и где его можно найти?
Netbeans OOo API Plugin - OpenOffice NetBeans Integration — OpenOffice.org Wiki
Последняя стабильная версия плагина (если совсем недавно не вышла новая)- это для Netbeans 6.8 - это версия 2.0.6. А для Netbeans 6.9.1 там есть ссылка на нестабильную версию - 2.0.7alpha.
ubuntu 12.04 + LibO3.6.0

convas

Перенес в Мои макросы.
Все равно при загрузке ошибка.

Ошибка связана с тем, что эти функции загружаются раньше, чем ThisComponent - и выдается ошибка.

И не обновляются значения функций.

ЦитироватьПросто я храню макросы в папке профиля, а не в файле - там таких ошибок не возникает и всё сразу работает.
Просьба привести подробности.

ЦитироватьЕсли хотите, могу попробовать сделать функции fontcolor и backcolor на Яве или на Питоне
Очень хотим.


[вложение удалено Администратором]

Рыбка Рио

#18
Цитата: convas от 24 декабря 2010, 16:10Просьба привести подробности.
Не могу вопроизвести (на другом компьютере мне показалосьчто всё было нормально - хотя скорее всего и там ошибки были). Действительно, при загрузке файла ошибки выдаёт , как вы и описали.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

#19
Вот, установите это расширение. Оно работает с sumif, имеет описание в мастере функций. Функции называются ЦВЕТФ и ЦВЕТШ (на русской сборке) и FONTCOLOR и BACKCOLOR (на английской и всех остальных). Не забудьте удалить или закомментировать старые функции basic, если у вас английская сборка - то точно нужно это сделать). Исходный код прилагаю в файле zip. В следующем сообщении пошагово напишу, как все это сделать. (И файл для проверки работы функций Без имени.ods)

[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

#20
Итак, инструкция.
1. Устанавливаем: NetBeans 6.9.1, плагин org-openoffice-extensions-2.0.7.alpha.nbm, Java и OOo SDK
( OOo-SDK_3.3.0rc8_20101214_Linux_x86-64_install-deb_en-US.tar.gz  14-Dec-2010 07:51  8.5M  
OOo-SDK_3.3.0rc8_20101214_Linux_x86-64_install-rpm_en-US.tar.gz  14-Dec-2010 07:47  8.2M  
OOo-SDK_3.3.0rc8_20101214_Linux_x86_install-deb_en-US.tar.gz     13-Dec-2010 23:40  8.8M  
OOo-SDK_3.3.0rc8_20101214_Linux_x86_install-rpm_en-US.tar.gz     13-Dec-2010 23:35  8.4M  
OOo-SDK_3.3.0rc8_20101214_MacOS_x86_install_en-US.dmg            13-Dec-2010 19:43   12M  
OOo-SDK_3.3.0rc8_20101214_Solaris_Sparc_install_en-US.tar.gz     13-Dec-2010 22:32  6.3M  
OOo-SDK_3.3.0rc8_20101214_Solaris_x86_install_en-US.tar.gz       13-Dec-2010 20:33  6.3M  
OOo-SDK_3.3.0rc8_20101214_Win_x86_install_en-US.exe              13-Dec-2010 20:30  7.6M  
).

2. Откройте Netbeans, создайте новый проект Calc Add-In (см. скриншоты)
3. Затем нам понадобится расширение MRI. Установите его, затем перезапустите OOo, откройте Calc, идите в меню Сервис/Дополнение/MRI<-selection.
4. В открывшемся окне MRI выставите флажок в меню Tools/Code Java (см. скриншот). Затем в окне поднимите нижнюю границу, чтобы увидеть сгенерированный код Java (см. следующий скриншот). дважды кликните на CellBackColor и код изменится.
5. Теперь в Netbeans нам нужно отредактировать файл cellcolorImpl.java, в котором нам нужно только отредактировать функции fontcolor и backcolor, которые по умолчанию возвращают значение 0 (т.е., они уже работают, нам их нужно только отредактировать) (см. скриншот)
Нужно заменить их на код, который легко извлечь из MRI, немного подправив его (да, нужно немного понимать что делаешь - но знать Яву вам особо не нужно)
public int backcolor(com.sun.star.table.XCellRange parameter0)
   {
       XCell xCell = null;
       int nCellBackColor=0;
       try {
           xCell = parameter0.getCellByPosition(0, 0);
       } catch (IndexOutOfBoundsException ex) {
           Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
       }
       XPropertySet xPropertySet = UnoRuntime.queryInterface(
XPropertySet.class, xCell);
       try {
           try {
               nCellBackColor = AnyConverter.toInt(xPropertySet.getPropertyValue("CellBackColor"));
           } catch (UnknownPropertyException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (WrappedTargetException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           }
       } catch (IllegalArgumentException ex) {
           Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
       }
       // TODO: Exchange the default return implementation for "backcolor" !!!
       // NOTE: Default initialized polymorphic structs can cause problems
       // because of missing default initialization of primitive types of
       // some C++ compilers or different Any initialization in Java and C++
       // polymorphic structs.
       return nCellBackColor;
   }

public int fontcolor(com.sun.star.table.XCellRange parameter0)
   {

       XCell xCell = null;
       int nCharColor=0;
       try {
           xCell = parameter0.getCellByPosition(0, 0);
       } catch (IndexOutOfBoundsException ex) {
           Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
       }
       XPropertySet xPropertySet = UnoRuntime.queryInterface(
XPropertySet.class, xCell);
       try {
           try {
               nCharColor = AnyConverter.toInt(xPropertySet.getPropertyValue("CharColor"));
           } catch (UnknownPropertyException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (WrappedTargetException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           }
       } catch (IllegalArgumentException ex) {
           Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
       }// TODO: Exchange the default return implementation for "fontcolor" !!!
       // NOTE: Default initialized polymorphic structs can cause problems
       // because of missing default initialization of primitive types of
       // some C++ compilers or different Any initialization in Java and C++
       // polymorphic structs.
       return nCharColor;
   }

6. Теперь всё готово. Можно кликнуть правой кнопкой мыши по проекту cellcolor и выбрать "Deploy and run extension in OpenOffic.org" Откроется OpenOffice.org и менеджер расширений. Перезапуск OOo после установки расширения не нужен.
7. Ещё перед этим можно кликнуть правой кнопкой мыши по проекту в Netbeans и выбрать Properties. Откроется окно для редактирования описания, названия расширения, выбора иконки, лицензии и т.д. (см. скриншот)




[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Продолжение скриншотов (т.к. в посте их не может быть более 4-х)

[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Хотя с sumif всё еще не работает - берет из диапазона только самую первую ячейку, видимо. Значит там немножко код подправить надо, чтоб заработало. Может кто поможет?
ubuntu 12.04 + LibO3.6.0

Risovod

Клио
ЦитироватьХотя с sumif всё еще не работает
Жаль, будем ждать положительного результата. Тем не менее спасибо Вам за начатое дело.

Рыбка Рио

#24
Вот версия cellcolor-0.0.2.oxt (работает с SUMIF и как функция массива - короче как нормальная функция) + тестовый файл (Без имени 1.ods) + исходный код (cellcolor-0.0.2.zip). Функции в мастере функций находятся в разделе "Электронные таблицы".

По F9 функция не обновляется. Нужно изменить значения ячеек - тогда обновится (т.к. обновляются только значения ячеек с изменившимися значениями, а не свойствами.) Как только значение ячейки изменяется, и эти функции обновляются.

Оказалось, чтобы функция работала с SUMIF как нормальная функция, функция должна возвращать не просто целое, а последовательность последовательностей целых чисел. В Java это равносильно двумерному массиву. Т.е., когда вы создаете функцию, нужно выбирать параметр не int, а int[][]. (см. скриншот)

Ниже привожу код самих функций:
   public int[][] backcolor(com.sun.star.table.XCellRange parameter0)
   {
       XCellRangeAddressable xCellRangeAddressable = UnoRuntime.queryInterface(
                   XCellRangeAddressable.class, parameter0);
       CellRangeAddress aCellRangeAddress = xCellRangeAddressable.getRangeAddress();
       int nx = aCellRangeAddress.EndColumn-aCellRangeAddress.StartColumn;
       int ny = aCellRangeAddress.EndRow-aCellRangeAddress.StartRow;
       int[][] nCellBackColor;
       nCellBackColor = new int[ny+1][nx+1];
       for( int i = 0;  i <= nx+1;  i++ ) {
           for( int j = 0;  j <= ny+1;  j++ ) {
           try {
               XCell xCell = parameter0.getCellByPosition(i, j);
               XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xCell);
               nCellBackColor[j][i] = AnyConverter.toInt(xPropertySet.getPropertyValue("CellBackColor"));
           } catch (IllegalArgumentException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (IndexOutOfBoundsException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (UnknownPropertyException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (WrappedTargetException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           }
           }
       }
       return nCellBackColor;
   }

   public int[][] fontcolor(com.sun.star.table.XCellRange parameter0)
   {
       XCellRangeAddressable xCellRangeAddressable = UnoRuntime.queryInterface(
                   XCellRangeAddressable.class, parameter0);
       CellRangeAddress aCellRangeAddress = xCellRangeAddressable.getRangeAddress();
       int nx = aCellRangeAddress.EndColumn-aCellRangeAddress.StartColumn;
       int ny = aCellRangeAddress.EndRow-aCellRangeAddress.StartRow;
       int[][] nCharColor;
       nCharColor = new int[ny+1][nx+1];
       for( int i = 0;  i <= nx+1;  i++ ) {
           for( int j = 0;  j <= ny+1;  j++ ) {
           try {
               XCell xCell = parameter0.getCellByPosition(i, j);
               XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xCell);
               nCharColor[j][i] = AnyConverter.toInt(xPropertySet.getPropertyValue("CharColor"));
           } catch (IllegalArgumentException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (IndexOutOfBoundsException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (UnknownPropertyException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           } catch (WrappedTargetException ex) {
               Logger.getLogger(cellcolorImpl.class.getName()).log(Level.SEVERE, null, ex);
           }
           }
       }
       return nCharColor;
   }

(нужно учитывать, что в отличие от Basic, массив nCellBackColor = new int[1][1]; имеет лишь 1 элемент - nBackColor[0][0] - в Basic Dim nCellBackColor(1,1) As Long имеет 4 элемента, nCellBackColor(0,0),nCellBackColor(1,1), nCellBackColor(0,1),nCellBackColor(1,0))

[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Risovod

Клио
Спасибо за работу, но у меня почему-то Ваша функция с SUMIF не работает. Может я что-то не так делаю? Вот итоговая моя формула:
=SUMIF(A1:A21;ЦВЕТШ(A9);A1:A21)
где A9 - одна из ячеек массива с окрашенным шрифтом. Выводит "0".

ЦитироватьПо F9 функция не обновляется. Нужно изменить значения ячеек - тогда обновится
Это я то же не понял. Это значит если я буду менять свойства ячеек в массиве, то формула не будет автоматически пересчитываться? Или что именно?

И на счет файла "Без имени 1.ods". Там приведены примеры, но они почему-то не считают или я их не до конца понял, если можно подробную инструкцию.

Рыбка Рио

Цитата: Risovod от 25 декабря 2010, 21:12Это значит если я буду менять свойства ячеек в массиве, то формула не будет автоматически пересчитываться? Или что именно?
Если у ячейки А1 изменить фон, то функция цветф(A1) не изменит своего значения автоматически (ни по F9), но если в ячейке A1 изменится значение, то все функции от этой ячейки (в т.ч. и цветф(А1)) будут пересчитаны.

Цитата: Risovod от 25 декабря 2010, 21:12И на счет файла "Без имени 1.ods". Там приведены примеры, но они почему-то не считают или я их не до конца понял, если можно подробную инструкцию.
У меня примеры считаются. Вот так выглядит этот файл у меня.

Цитата: Risovod от 25 декабря 2010, 21:12=SUMIF(A1:A21;ЦВЕТШ(A9);A1:A21)
где A9 - одна из ячеек массива с окрашенным шрифтом. Выводит "0".
а так считает: =SUM(IF(ЦВЕТФ(C2:C9)=-1;C2:C9;0)) ?

[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

#27
Цитата: Risovod от 25 декабря 2010, 21:12=SUMIF(A1:A21;ЦВЕТШ(A9);A1:A21)
где A9 - одна из ячеек массива с окрашенным шрифтом. Выводит "0".
А... понятно в чем дело. Нужно записать вот так: =SUMIF(ЦВЕТШ(A1:A21);">0";A1:A21)
Т.е., берем массив ЦВЕТШ(A1:A21), смотрим удовлетворяет ли данные в нем условию ">0" (т.е. шрифт в ячейке окрашен ли каким-нибудь цветом? если нужен конкретный шрифт, то условие "=16711680" для красного цвета,к примеру) , и если да, то прибавляем к сумме значение соответствующей ячейки в массиве A1:A21. Так работает?
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

О, ещё проще!
Вот так: =SUMIF(ЦВЕТШ(A1:A21);ЦВЕТШ(A9);A1:A21)
ubuntu 12.04 + LibO3.6.0

Risovod

#29
Клио
Большое СПАСИБО всё работает.

А пример сначала не работал из-за того, что после установки Вашего дополнения не перезапустил OpenOffice. Теперь работает.

А что нужно сделать, что бы пересчет формулы на изменившиеся цвета был автоматический? Или только вручную?