Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

4 Июль 2020, 19:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 »   Вниз
  Печать  
Автор Тема: Фильтрация по цвету [MEMO]  (Прочитано 41621 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ape
Форумчанин
***
Offline Offline

Сообщений: 2 468


« Ответ #15: 24 Декабрь 2010, 16:43 »

...удобно использовать Netbeans + плагин для OOo.
Извините, какой плагин и где его можно найти?
Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #16: 24 Декабрь 2010, 16:52 »

Извините, какой плагин и где его можно найти?
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
Форумчанин
***
Offline Offline

Сообщений: 310


« Ответ #17: 24 Декабрь 2010, 18:10 »

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

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

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

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

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


[вложение удалено Администратором]
Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #18: 24 Декабрь 2010, 18:47 »

Просьба привести подробности.
Не могу вопроизвести (на другом компьютере мне показалосьчто всё было нормально - хотя скорее всего и там ошибки были). Действительно, при загрузке файла ошибки выдаёт , как вы и описали.
« Последнее редактирование: 24 Декабрь 2010, 21:21 от Клио » Записан

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #19: 24 Декабрь 2010, 20:44 »

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

[вложение удалено Администратором]
« Последнее редактирование: 24 Декабрь 2010, 20:46 от Клио » Записан

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #20: 24 Декабрь 2010, 21:13 »

Итак, инструкция.
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. Откроется окно для редактирования описания, названия расширения, выбора иконки, лицензии и т.д. (см. скриншот)




[вложение удалено Администратором]
« Последнее редактирование: 29 Декабрь 2010, 15:01 от Клио » Записан

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #21: 24 Декабрь 2010, 21:14 »

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

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

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #22: 24 Декабрь 2010, 21:41 »

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

ubuntu 12.04 + LibO3.6.0
Risovod
Участник
**
Offline Offline

Сообщений: 7


« Ответ #23: 24 Декабрь 2010, 22:07 »

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

Сообщений: 1 678


« Ответ #24: 25 Декабрь 2010, 19:22 »

Вот версия 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))

[вложение удалено Администратором]
« Последнее редактирование: 25 Декабрь 2010, 19:26 от Клио » Записан

ubuntu 12.04 + LibO3.6.0
Risovod
Участник
**
Offline Offline

Сообщений: 7


« Ответ #25: 25 Декабрь 2010, 23:12 »

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

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

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

Сообщений: 1 678


« Ответ #26: 25 Декабрь 2010, 23:27 »

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

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

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

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

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #27: 27 Декабрь 2010, 02:05 »

=SUMIF(A1:A21;ЦВЕТШ(A9);A1:A21)
где A9 - одна из ячеек массива с окрашенным шрифтом. Выводит "0".
А... понятно в чем дело. Нужно записать вот так: =SUMIF(ЦВЕТШ(A1:A21);">0";A1:A21)
Т.е., берем массив ЦВЕТШ(A1:A21), смотрим удовлетворяет ли данные в нем условию ">0" (т.е. шрифт в ячейке окрашен ли каким-нибудь цветом? если нужен конкретный шрифт, то условие "=16711680" для красного цвета,к примеру) , и если да, то прибавляем к сумме значение соответствующей ячейки в массиве A1:A21. Так работает?
« Последнее редактирование: 27 Декабрь 2010, 02:07 от Клио » Записан

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #28: 27 Декабрь 2010, 02:09 »

О, ещё проще!
Вот так: =SUMIF(ЦВЕТШ(A1:A21);ЦВЕТШ(A9);A1:A21)
Записан

ubuntu 12.04 + LibO3.6.0
Risovod
Участник
**
Offline Offline

Сообщений: 7


« Ответ #29: 27 Декабрь 2010, 14:16 »

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

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

А что нужно сделать, что бы пересчет формулы на изменившиеся цвета был автоматический? Или только вручную?
« Последнее редактирование: 27 Декабрь 2010, 14:37 от Risovod » Записан
Страниц: « 1 2 3 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!