Активная ячейка

Автор BazZile, 14 мая 2015, 09:49

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

BazZile

Как получить активную ячейку на Java UNO?

JohnSUN

У контроллера документа есть свойство ViewData и метод для его получения getViewData. В этом свойстве хранится информация о текущем отображении документа. Хранится в виде обычной текстовой строки с разделителями.
Формат этой строки довольно сложен и плохо документирован. Но тем не менее воспользоваться сведениями из него можно.
Для электронной книги эта строка выглядит приблизительно так:
100/60/0;4;tw:612;3/16/0/0/0/0/2/0/0/0/0;3/7/0/0/0/0/2/0/0/0/0;3/19/0/0/0/0/2/0/0/0/0;...;0/0/0/0/0/0/2/0/0/0/0
Если распарсить её (разделить на отдельные строки) по точке с запятой, то получим
100/60/0
4
tw:612
3/16/0/0/0/0/2/0/0/0/0
3/7/0/0/0/0/2/0/0/0/0
3/19/0/0/0/0/2/0/0/0/0
2/1/0/0/0/0/2/0/0/0/0
3/8/0/0/0/0/2/0/0/0/0
3/9/0/0/0/0/2/0/0/0/0
3/8/0/0/0/0/2/0/0/0/0
0/0/0/0/0/0/2/0/0/0/0
Во второй строке расположен индекс текущего, активного листа. А начиная с четвертой строки перечисляются параметры каждого из листов книги. Первые два числа в этих строках как раз и обозначают индексы колонки и строки активной ячейки.
Небольшая трудность заключается в том, что в некоторых случаях разделителем в этих строках будет не косая черта, а знак плюса. Но это можно учесть в коде
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

BazZile

То есть определенных методов на языке Java, в отличие от Basic, нет?

BazZile

Ну вот, например, получил строку:
100/60/0;
0;
tw:270;
2/3/0/0/0/0/2/0/0/0/0;;
Получается для вставки (например текста) в активную ячейку, мне нужно использовать параметры в sheet.getCellByPosition(2,3)?

JohnSUN

А в StarBasic "родного" объекта ActiveCell тоже нет. В VBA есть. И пытаясь выполнить код из экселевского макроса, в котором встречается упоминание ActiveCell, офис как раз и проделывает что-то в этом роде:
REM Функция для определения активной ячейки
REM Параметры:
REM iSheet - индекс листа, для которого ищется активная ячейка.
REM Не обязателен. По умолчанию - активный лист
REM oDoc - электронная книга, для которой ищется активная ячейка.
REM Не обязателен. По умолчанию - текущий документ
REM Возвращает ссылку на активную ячейку или Null, если её не удалось определить
REM Автор: Владислав Орлов aka JohnSUN, Украина, Киев, 2012
REM by UROS > http://www.oooforum.org/forum/viewtopic.phtml?t=19348
REM by Villeroy > http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=38672#p177590
Function ActiveCell(Optional iSheet As Long, Optional oDoc As Variant) As Object
Dim arrayOfString() ' Массив текстовых строк для парсинга
Dim lRow&, lColumn& ' Координаты искомой ячейки
Dim tmpString$ ' Временная строка
Dim oCurrentController ' Контроллер анализируемого документа
Dim oSheets As Variant ' Все листы текущей книги
Dim oSheet As Variant ' Активный (анализируемый) лист книги
REM Проверить входные параметры и установить значения по умолчанию:
If IsMissing(oDoc) Then oDoc = ThisComponent
If NOT oDoc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then Exit Function
oCurrentController = oDoc.getCurrentController()
If IsMissing(iSheet) Then
oSheet = oCurrentController.getActiveSheet()
iSheet = oSheet.getRangeAddress().Sheet
Else
If (iSheet < 0) Then Exit Function
oSheets = ThisComponent.getSheets()
If (iSheet >= oSheets.getCount()) Then Exit Function
oSheet = oSheets.getByIndex(iSheet)
EndIf
tmpString = oCurrentController.getViewData()
arrayOfString() = Split(tmpString, ";")
If UBound(arrayOfString) < (3 + iSheet) Then Exit Function
tmpString = arrayOfString(3 + iSheet)
If InStr(tmpString,"+") > 0 Then
arrayOfString() = Split(tmpString, "+")
Else
arrayOfString() = Split(tmpString, "/")
EndIf
lColumn = CLng(arrayOfString(0))
lRow = CLng(arrayOfString(1))
Set ActiveCell = oSheet.getCellByPosition(lColumn, lRow)
End Function

Цитата: BazZile от 14 мая 2015, 10:18
Ну вот, например, получил строку:
100/60/0;
0;
tw:270;
2/3/0/0/0/0/2/0/0/0/0;;
Получается для вставки (например текста) в активную ячейку, мне нужно использовать параметры в sheet.getCellByPosition(2,3)?
Бинго! Угадал! В конце приведенной функции именно так и написано
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

BazZile