Листы

Листы


В этом руководстве по Python мы используем следующее определения:

  • лист — это отдельная электронная таблица в документе
  • рабочая книга является документом ACell


Полные примеры с кодом см. "Примеры макросов ACell-Листы"


Вывод в диалоговое окно всех имен листов в документе ACELL с помощью макроса python



def sheet_names():
   list_sheet_names = []

   doc = XSCRIPTCONTEXT.getDocument()
   sheet_names = doc.Sheets.ElementNames

   for name in sheet_names:
       list_sheet_names.append(name)

   msgbox(title="Названия листов в документе", msg="\n".join(map(str, list_sheet_names)))


Вывод в диалоговое окно количество листов в документе ACELL с помощью макроса python


def number_of_sheets():
   doc = XSCRIPTCONTEXT.getDocument()
   count = doc.Sheets.Count
   msgbox(title="Колличество листов в файле", msg=f"Всего листов: {count}")


Перебрать все листы


def loop_through_all_sheets():
   doc = XSCRIPTCONTEXT.getDocument()

   for sheet in doc.Sheets:
       msgbox(
               title="Все листы",
               msg=f"Лист: {sheet.Name}"
       )


Получить активный лист ACELL с помощью макроса python из текущего документа


def get_active_sheet():
   doc = XSCRIPTCONTEXT.getDocument()
   sheet = doc.getCurrentController().getActiveSheet()
   msgbox(title="Активный/открытый лист", msg=sheet.Name)


Получить активный лист ACELL с помощью макроса python по индексу из текущего документа


def get_active_sheet_by_index():
   doc = XSCRIPTCONTEXT.getDocument()
   try:
       sheet = doc.Sheets[2] # индекс массива - номер листа в документе
       msgbox(title="Активный/открытый лист по индексу в python", msg=sheet.Name)
   except IndexError as p:
       msgbox(title="Активный/открытый лист по индексу в python", msg="Неправильный индекс")


Получить активный лист ACELL с помощью макроса python по имени из текущего документа

def get_active_sheet_by_index():
   doc = XSCRIPTCONTEXT.getDocument()
   try:
       sheet = doc.Sheets["name_list"]
       msgbox(title="Активный/открытый лист по имени в python", msg=sheet.Name)
   except KeyError as p:
       msgbox(title="Активный/открытый лист по имени в python", msg="Неправильное имя листа")

Переместиться на определенный лист в ACELL с помощью python по индексу в коде

def focus_on_sheet_by_index():
   index = 4 #индекс массива - номер листа в документе
   doc = XSCRIPTCONTEXT.getDocument()

   try:
       sheet = doc.Sheets[index]
       msgbox(title="Фокус на лист по индексу", msg=f"Вы перешли на лист с индексом: {index}")
       doc.getCurrentController().setActiveSheet(sheet)
   except IndexError as p:
       msgbox(title="Фокус на лист по индексу", msg="Неправильный индекс!")

Изменить имя листа ACELL, с помощью python, видимое пользователю


def change_sheet_name():
   index = 2
   new_name_sheet = "new_name_sheet"

   doc = XSCRIPTCONTEXT.getDocument()

   try:
       sheet = doc.Sheets[index]
       sheet.Name = new_name_sheet
       msgbox(title="Изменение имени листа", msg=f"Имя листа с индексом: {index} изменено на: {new_name_sheet}")
   except IndexError as p:
       msgbox(title="Изменение имени листа", msg="Неправильный индекс!")

Изменение имени листа ACELL с помощью python, видно только из кода


def change_sheet_name_only_code():
   index = 2
   new_name_sheet = "new_name_sheet"

   doc = XSCRIPTCONTEXT.getDocument()

   try:
       sheet = doc.Sheets[index]
       sheet.CodeName = new_name_sheet
       msgbox(
               title="Изменение имя листа отображаемое только в коде",
               msg=f"Имя листа с индексом: {index} изменено на: {new_name_sheet}\nВнимание! Имя листа видно только из кода Python!"
       )
   except IndexError as p:
       msgbox(
               title="Изменение имени листа отображаемое только в коде",
               msg="Неправильный индекс!"
       )

Видимость листа


  • Установить видимость/не видимость листа
def sheet_visibility_true():
   index = 2
   title="Статус видимости листа"
   doc = XSCRIPTCONTEXT.getDocument()

   try:
       sheet = doc.Sheets[index]
       sheet.IsVisible = True
       msgbox(
               title=title,
               msg=f"Лист с индексом: {index} отображен!"
       )
   except IndexError as p:
       msgbox(
               title=title,
               msg="Неправильный индекс!"
       )

def sheet_visibility_false():
   index = 2
   title="Статус видимости листа"
   doc = XSCRIPTCONTEXT.getDocument()

   try:
       sheet = doc.Sheets[index]
       sheet.IsVisible = False
       msgbox(
               title=title,
               msg=f"Лист с индексом: {index} скрыт!"
       )
   except IndexError as p:
       msgbox(
               title=title,
               msg="Неправильный индекс!"
       )

Пароль


  • Установка/удаление пароля

  • def set_password():
       index = 2
       password = "your_password"

       doc = XSCRIPTCONTEXT.getDocument()

       try:
           sheet = doc.Sheets[index]
           sheet.protect(password)

           msgbox(
                   title="Управление паролями",
                   msg=f"Пароль для листа с индексом: {index} задан!"
           )
       except IndexError as p:
           msgbox(
                   title="Ошибка",
                   msg="Неправильный индекс!"
           )

    def remove_password():
       index = 2
       password = "your_password"

       doc = XSCRIPTCONTEXT.getDocument()

       try:
           sheet = doc.Sheets[index]
           sheet.unprotect(password)

           msgbox(
                   title="Управление паролями",
                   msg=f"Пароль для листа с индексом: {index} удален!"
           )
       except IndexError as p:
           msgbox(
                   title="Ошибка",
                   msg="Неправильный индекс!"
           )


    Проверка, существует ли лист в книге


    def does_sheet_exist_book():
       find_name_sheet = "test"
       title = "Результат поиска!"

       doc = XSCRIPTCONTEXT.getDocument()

       if find_name_sheet in doc.Sheets:
           msgbox(
                   title=title,
                   msg=f"Лист: {find_name_sheet} существует!"
           )
       else:
           msgbox(
                   title=title,
                   msg=f"Лист: {find_name_sheet} не существует!"
           )


    Вставьте пустой новый лист


    def insert_blank_new_sheet():
       index = 3
       name_new_sheet = "new"

       doc = XSCRIPTCONTEXT.getDocument()

       doc.Sheets.insertNewByName(name_new_sheet, index)
       msgbox(
               title="Вставьте пустой новый лист",
               msg=f"Лист: {name_new_sheet} вставлен"
       )

    Перемещение положение листа в книге


    def move_sheet_position_in_book():
       index = 3
       name_sheet = "new_test"

       title = "Результат"

       doc = XSCRIPTCONTEXT.getDocument()

       if name_sheet in doc.Sheets:

           doc.Sheets.moveByName(name_sheet, index)

           msgbox(
                   title=title,
                   msg=f"Лист с именем: {name_sheet} перенесен в положение с индексом: {index}"
           )
       else:
           msgbox(
                   title=title,
                   msg=f"Лист с именем: {name_sheet} не найден"
           )


    Удалить лист из рабочей книги


    def move_sheet_position_in_book():
       name_sheet = "new_test"
       title = "Информация"

       doc = XSCRIPTCONTEXT.getDocument()
       count = doc.Sheets.Count

       if name_sheet in doc.Sheets:
           if count >= 2:
               doc.Sheets.removeByName(name_sheet)

               msgbox(
                       title=title,
                       msg=f"Лист: {name_sheet} заменен чистым листом!"
               )
           else:
               msgbox(
                       title=title,
                       msg=f"Листов мало, всего: {count}, добавьте еще!"
               )
       else:
           msgbox(
                   title=title,
                   msg=f"Лист: {name_sheet} не существует!"
           )


    Заменить чистым листом


    ВНИМАНИЕ: Будьте внимательны . Эта функция заменяет лист name_sheet чистым листом.

    def replace_with_blank_sheet():
       name_sheet = "new_test"
       title = "Информация"

       doc = XSCRIPTCONTEXT.getDocument()
       count = doc.Sheets.Count

       if name_sheet in doc.Sheets:
           if count >= 2:
               sheet = doc.createInstance("com.sun.star.sheet.Spreadsheet")
               doc.Sheets.replaceByName(name_sheet, sheet)

               msgbox(
                       title=title,
                       msg=f"Лист: {name_sheet} - заменен чистым листом!"
               )
           else:
               msgbox(
                       title=title,
                       msg=f"Листов мало, всего: {count}, добавьте еще!"
               )
       else:
           msgbox(
                   title=title,
                   msg=f"Лист: {name_sheet} не существует!"
           )

    Переименовать и скопировать лист


    def rename_and_copy_sheet():
       source_name = "test_sheet"
       new_name = "new_test_sheet"
       position = 2

       title = "Информация"

       doc = XSCRIPTCONTEXT.getDocument()

       if source_name in doc.Sheets:
           doc.Sheets.copyByName(source_name, new_name, position)

           msgbox(
                   title=title,
                   msg=f"Лист: {source_name} копирован и переименован в: {new_name}"
           )
       else:
           msgbox(
                   title=title,
                   msg=f"Лист: {source_name} не существует!"
           )

    Копирование/импорт листа с названием "test_sheet" в другой документ


    def copying_sheet_another_workbook():
       title = "Информация"
       name_sheet = "test_sheet"

       doc = XSCRIPTCONTEXT.getDocument()

       if name_sheet in doc.Sheets:
           path = "private:factory/scalc"
           desktop = create_instance("com.sun.star.frame.Desktop", context=True)

           source = desktop.loadComponentFromURL(path, "_default", 0, ())
           source.Sheets.importSheet(doc, name_sheet, 0)

           msgbox(
                   title=title,
                   msg=f"Лист: {name_sheet} скопирован в новый документ!"
           )
       else:
           msgbox(
                   title=title,
                   msg=f"Лист: {name_sheet} не существует!"
           )


    Раскрасить лист с названием test_sheet


    def сolorize_tab_sheet():
       title = "Информация"
       name_sheet = "test_sheet"

       doc = XSCRIPTCONTEXT.getDocument()

       if name_sheet in doc.Sheets:
           sheet = doc.Sheets[name_sheet]
           sheet.TabColor = get_color(255, 0, 0)

           msgbox(
                   title=title,
                   msg=f"Лист: {name_sheet} - перекрашен!"
           )
       else:
           msgbox(
                   title=title,
                   msg=f"Лист: {name_sheet} не существует!"
           )