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

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

23 Октябрь 2021, 17:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Программный вызов SetOptimalColumnWidth [РЕШЕНО]  (Прочитано 6539 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Vadim
Участник
**
Offline Offline

Пол: Мужской
Расположение: Ukraine
Сообщений: 8


« Стартовое сообщение: 11 Август 2011, 12:17 »

 OOo 3.3.0
  Экспортирую данные в эл. таблицу посредством Asp.NET C#. Нужно отформатировать колонки так, чтобы они имели оптимальную ширину (т.е. поставить выравнивание по содержимому). Создаю новый документ в скрытом режиме, заполняю его, вызываю SetOptimalColumnWidth, сохраняю и закрываю. Но в процессе возникает нюанс: с командой вызова появляется окошко "Оптимальная ширина столбца" (Формат -> Столбец -> Оптимальная ширина), которое ожидает подтверждения (клика на "ОК"). Так как все это автоматизация и выполняется на сервере, то конечно же, никто вручную не подтвердит.
   Вопрос:
      Как сделать чтобы команда выполнилась (или по крайней мере, как имитировать нажатие "ОК" в этом окне) ?

Вот то, что имею сейчас:
C#
Код:
using OOo = unoidl.com.sun.star;
using UNO = unoidl.com.sun.star.uno;
..
XComponent oDoc;
..
// тут выбираю область (ячейки заголовка)
XController currController = ((XModel)oDoc).getCurrentController();
OOo.view.XSelectionSupplier xSel = (OOo.view.XSelectionSupplier)currController;
XCellRange oRange = oSheet.getCellRangeByPosition(0, 0, colCount, 0);
xSel.select(new uno.Any(oRange.GetType(), oRange));

// далее вызываю  SetOptimalColumnWidth
UNO.XComponentContext localContext = uno.util.Bootstrap.bootstrap();
XMultiServiceFactory ServiceFactory = (XMultiServiceFactory)localContext.getServiceManager();
XDispatchHelper oDispHelper = (XDispatchHelper)ServiceFactory.createInstance("com.sun.star.frame.DispatchHelper");
XFrame frame = ((XModel)oDoc).getCurrentController().getFrame();            
oDispHelper.executeDispatch((XDispatchProvider)frame, ".uno:SetOptimalColumnWidth", "", 0, new OOo.beans.PropertyValue[0]);
..

Пока проверяю вот это решение, которое на Java.
Других способов задать SetOptimalColumnWidth пока не нашел, прошу подсказать более подходящий вариант.
« Последнее редактирование: 11 Август 2011, 15:05 от Vadim » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 11 Август 2011, 13:00 »

Там фишка кроется в последнем параметре executeDispatch. У тебя он просто пустой, вот офис и пристает с дурацкими вопросами.
Попробуй задать .Name = "aExtraWidth" и .Value, например, = 200
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
RFJ
Форумчанин
***
Offline Offline

Сообщений: 220


« Ответ #2: 11 Август 2011, 13:02 »

Пример с http://www.oooforum.org/forum/viewtopic.phtml?t=9677
Код:
Sub OptimalColumnWidth
   oDoc = ThisComponent
   oSheet = oDoc.getSheets().getByIndex(0)
   oColumns = oSheet.getColumns()
   
   iLastColumn = 10 'last column to be applied with OptimalWidth
   
for iIndex = 0 to iLastColumn
   oColumn = oColumns.getByIndex(iIndex)
   oColumn.OptimalWidth = true
next iIndex
End Sub
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #3: 11 Август 2011, 13:24 »

Да, бэйсик в этом отношении проще и роднее...

А из других языков приходится большую часть делать через DispatchHelper.

Если мне приходится с ним сталкиваться, пользуюсь [MEMO] Использование диспетчера (Thank you, dr.Faust!) и книгой slots.sxc (Thank you, Mr.Pitonyak!)
В slots в последнем столбце перечисляются параметры, которые могут быть использованы в команде.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
RFJ
Форумчанин
***
Offline Offline

Сообщений: 220


« Ответ #4: 11 Август 2011, 13:59 »

Цитата:
Пока проверяю вот это решение, которое на на Java.
Это то же самое, что я привел на Basic.

Цитата:
А из других языков приходится большую часть делать через DispatchHelper.
Совсем не обязательно. Можно и без DispatchHelper. Даже нужно.
Записан

Vadim
Участник
**
Offline Offline

Пол: Мужской
Расположение: Ukraine
Сообщений: 8


« Ответ #5: 11 Август 2011, 14:48 »

  Благодарю за ссылки и советы.

Там фишка кроется в последнем параметре executeDispatch. У тебя он просто пустой, вот офис и пристает с дурацкими вопросами.
Попробуй задать .Name = "aExtraWidth" и .Value, например, = 200
Уже пробовал - результат такой же, вылазит окно, но уже с моим параметром (а не default-ным).

Это то же самое, что я привел на Basic.
Знаю, но мне Basic здесь никак не поможет. Веб-сервер на шарпе, вот на нем и приходиться извращаться с ОО.
И те API, которые отлично работают для той же Java, не всегда подойдут для C# (что меня все больше удивляет).

  Успел протестить еще пару методов, даже учитывал уже такой известный дефект как XTableColumns.getByIndex broken. Но пока что ни один вариант в обход DispatchHelper не работает - выдает исключения преобразования типов.
  Буду "копать" дальше по методам без Dispatch-а.
Записан
Vadim
Участник
**
Offline Offline

Пол: Мужской
Расположение: Ukraine
Сообщений: 8


« Ответ #6: 11 Август 2011, 15:04 »

Хех )  Таки нашел решение!
помог этот Thread, на который натолкнулся со всезнающего Гугла )
Оказалось, если добавить .Value в getByIndex(), то все работает как надо.

В общем решение выглядит так:
C#
Код:
            XColumnRowRange oColRange = (XColumnRowRange)oSheet;
            OOo.container.XIndexAccess xTableCols = (XIndexAccess)oColRange.getColumns();             
            Object column;   
     
            for (int j = 0; j < colCount; j++)
            {
                column = xTableCols.getByIndex(j).Value;
                if (column != null)
                    ((XPropertySet)column).setPropertyValue("OptimalWidth", new uno.Any((Boolean)true));               
            }

Закрываю топик.
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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