Скрытые листы в excel python

I have the following code that reads data from a tab-delimited text file and then writes it to a specified worksheet within an existing Excel workbook. The variables «workbook», «write_sheet», and «text_file» are input by the user

tab_reader = csv.reader(text_file, delimiter='t')
xls_book = openpyxl.load_workbook(filename=workbook)
sheet_names = xls_book.get_sheet_names()
xls_sheet = xls_book.get_sheet_by_name(write_sheet)
for row_index, row in enumerate(tab_reader):
        number = 0
        col_number = first_col
        while number < num_cols:
                cell_tmp = xls_sheet.cell(row = row_index, column = col_number)
                cell_tmp.value = row[number]
                number += 1
                col_number += 1
xls_book.save(workbook)

However when I run this code on a preexisting «workbook» in which «worksheet» is a hidden tab, the output unhides the tab. I think the reason is because openpyxl is not modifying the file but creating a new file entirely. Is there an easy way to tell python to check if the worksheet is hidden and then output a hidden or unhidden sheet based on whether or not the condition is satisfied?

Thanks!

alecxe's user avatar

alecxe

458k119 gold badges1069 silver badges1182 bronze badges

asked Apr 18, 2014 at 15:54

user3543052's user avatar

We currently don’t support hiding worksheets in openpyxl so this is just ignored when reading the file and, therefore, lost when saving it. I don’t think it should be too hard to add it. Please submit a feature request on Bitbucket.

[UPDATE]

The feature is now available:

ws.sheet_state = 'hidden'

Or actually xls_sheet.sheet_state = 'hidden' in your particular case.

Jean-Francois T.'s user avatar

answered Apr 19, 2014 at 13:40

Charlie Clark's user avatar

Charlie ClarkCharlie Clark

18.1k4 gold badges47 silver badges54 bronze badges

5

You need to get a handle to the XlsxWriter worksheet object to hide it. Like this:

import pandas as pd

df = pd.DataFrame({'Attribute1': ['A', 'B'],
                   'Attribute2': ['X', 'Y']})

filename = 'test.xlsx'

writer = pd.ExcelWriter(filename, engine='xlsxwriter')

with writer:
    df.to_excel(writer, sheet_name='df')
    df.to_excel(writer, sheet_name='2nd tab')

    # Get a handle to the worksheet.
    worksheet = writer.sheets['2nd tab']
    worksheet.hide()

Output:

enter image description here

If you want to hide the first worksheet you need to do a bit of extra work since Excel doesn’t allow you to hide the «active» worksheet, which is generally the first worksheet. In that case you also need to «activate» another worksheet. Like this:

with writer:
    df.to_excel(writer, sheet_name='df')
    df.to_excel(writer, sheet_name='2nd tab')

    worksheet = writer.sheets['df']
    worksheet.hide()

    worksheet = writer.sheets['2nd tab']
    worksheet.activate()

Output:

enter image description here

For more details see the Working with Python Pandas and XlsxWriter

Also note, the datetime_format parameter in your example is incorrect. That is a property of the writer class and not the to_excel() method. I left it out of the example above.

Создание и сохранение df:

df = pd.DataFrame({'Attribute1': ['A', 'B'], 'Attribute2': ['X', 'Y']})
filename = 'test.xlsx'

writer = pd.ExcelWriter(filename, engine='xlsxwriter') 
with writer:
    df.to_excel(writer, sheet_name='df')
    df.to_excel(writer, sheet_name='2nd tab')

Я хотел бы добавить что-то вроде hidden=True в условие листа, но pandas, похоже, не поддерживает это.

Мы можем сделать это вручную с помощью openpyxl, но это слишком медленно. для больших файлов:

from openpyxl import load_workbook
wb = load_workbook(filename)
wb["df"].sheet_state='hidden'
wb.save(filename)

Очевидно, что лучшее решение — не использовать Excel, но это требование. Как это сделать на практике?

Основные атрибуты и методы объекта Worksheet.

Объект Worksheet представляет собой рабочий лист, который в электронных таблицах Excel служит контейнером 2-го уровня.

Не создавайте рабочие листы самостоятельно, для этого используйте Workbook.create_sheet(). При создании новой рабочей книги средствами модуля openpyxl, по умолчанию уже создается один рабочий лист, доступ к которому можно получить через свойство Workbook.active.

>>> from openpyxl import Workbook
# создаем объект книги
>>> wb = Workbook()
# список имен листов в только 
# что созданной книге
>>> wb.sheetnames
# ['Sheet']

# доступ к созданному по 
# умолчанию листу 'Sheet' 
>>> ws = wb.active
# переименовываем
>>> ws.title = 'MySheet'
# или создаем новый
>>> ws1 = wb.create_sheet('NewSheet')
# список имен листов в книге
>>> wb.sheetnames
# ['MySheet', 'NewSheet']

Содержание:

  • Worksheet.active_cell имя активной ячейки,
  • Worksheet.add_chart() добавляет объект диаграммы ,
  • Worksheet.add_data_validation() добавляет объект проверки данных,
  • Worksheet.add_image() добавляет изображение,
  • Worksheet.add_table() добавляет объект таблицы,
  • Worksheet.append() добавляет группу значений в последнюю строку,
  • Worksheet.calculate_dimension() возвращают минимальный диапазон ячеек с данными,
  • Worksheet.cell() возвращает объект ячейки,
  • Worksheet.columns генератор всех объектов ячеек с данными по столбцам,
  • Worksheet.column_dimensions информация о свойствах отображения столбца,
  • Worksheet.delete_cols() удаляет столбец или столбцы,
  • Worksheet.delete_rows() удаляет строку или строки,
  • Worksheet.freeze_panes фиксирует строки и колонки,
  • Worksheet.insert_cols() вставляет столбец или столбцы,
  • Worksheet.insert_rows() вставляет строку или строки,
  • Worksheet.iter_cols() читает объекты ячеек,
  • Worksheet.iter_rows() читает объекты строк,
  • Worksheet.max_column максимальный индекс столбца с данными,
  • Worksheet.max_row максимальный индекс строки с данными,
  • Worksheet.merge_cells устанавливает слияние в диапазоне ячеек,
  • Worksheet.min_column минимальный индекс столбца,
  • Worksheet.min_row минимальный индекс строки,
  • Worksheet.move_range() перемещает диапазон ячеек,
  • Worksheet.print_area устанавливает область печати,
  • Worksheet.print_title_cols устанавливает колонки, которые печатаются на каждой странице,
  • Worksheet.print_title_rows устанавливает строки, которые печатаются на каждой странице,
  • Worksheet.row_dimensions информация о свойствах отображения строки,
  • Worksheet.rows генератор всех объектов ячеек с данными по строкам,
  • Worksheet.set_printer_settings() задает параметры принтера,
  • Worksheet.tables все объекты таблиц текущего листа,
  • Worksheet.unmerge_cells() удаляет слияние ячеек,
  • Worksheet.values генератор всех значений ячеек по строкам.

Worksheet.active_cell:

Свойство Worksheet.active_cell возвращает имя активной ячейки листа Worksheet.

>>> ws.active_cell
# 'A1'

Worksheet.add_chart(chart, anchor=None):

Метод Worksheet.add_chart() добавляет объект диаграммы chart на текущий рабочий лист. При необходимости можно указать ячейку anchor для привязки к ней диаграммы. Диаграмма привязывается к левому верхнему углу ячейки.

Worksheet.add_data_validation(data_validation):

Метод Worksheet.add_data_validation() добавляет на рабочий лист электронной таблицы объект проверки данных data_validation.

Объект проверки данных определяет тип применяемой проверки данных и ячейку или диапазон ячеек, к которым она должна применяться.

Worksheet.add_image(img, anchor=None):

Метод Worksheet.add_image() добавляет изображение img на лист электронной таблицы.

При желании можно указать ячейку anchor для привязки изображения. Изображение привязывается к левому верхнему углу ячейки.

Worksheet.add_table(table):

Метод Worksheet.add_table() добавляет объект таблицы table на лист электронной таблицы.

Объект таблицы рабочего листа представляет собой ссылку на группу ячеек, что облегчает работу с данными, если на одном листе представлены несколько таблиц.

Перед добавлением объекта таблицы рабочего листа Table, необходимо сначала проверить наличие имени таблицы displayName в определенных именах и других таблицах рабочего листа во избежании получения исключения.

# проверим имя таблицы
if not ws.tables.get('MyTable'):
    # создаем объект таблицы
    table = Table(displayName="MyTable", ref="A1:E5")
    # добавляем таблицу
    ws.add_table(table)

Worksheet.append(iterable):

Метод Worksheet.append() добавляет группу значений в последнюю строку, которая не содержит данных.

  • Если это список: все значения добавляются по порядку, начиная с первого столбца.
  • Если это словарь: значения присваиваются столбцам, обозначенным ключами (цифрами или буквами).

Варианты использования:

  • добавление списка: .append([‘ячейка A1’, ‘ячейка B1’, ‘ячейка C1’])
  • добавление словаря:
    • вариант 1: .append({‘A’ : ‘ячейка A1’, ‘C’ : ‘ячейка C1’}), в качестве ключей используются буквы столбцов.
    • вариант 2: .append({1 : ‘ячейка A1’, 3 : ‘ячейка C1’}), в качестве ключей используются цифры столбцов.

Пример добавление данных из списка:

# существующие листы рабочей книги
>>> wb.sheetnames
# ['MySheet', 'NewSheet']

# добавим данные в лист с именем `Mysheet2`
>>> ws = wb["MySheet"]
# создадим произвольные данные, используя
# вложенный генератор списков
>>> data = [[row*col for col in range(1, 10)] for row in range(1, 31)]
>>> data
# [
#     [1, 2, 3, 4, 5, 6, 7, 8, 9], 
#     [2, 4, 6, 8, 10, 12, 14, 16, 18], 
# ...
# ...
#     [30, 60, 90, 120, 150, 180, 210, 240, 270]
# ]

# добавляем данные в выбранный лист
>>> for row in data:
...     ws.append(row)
...

Вот и все, данные добавлены…

Worksheet.calculate_dimension()
Worksheet.dimensions:

Метод Worksheet.calculate_dimension() и свойство Worksheet.dimensions возвращают минимальный диапазон для всех ячеек текущего рабочего листа, которые содержат данные (например, ‘A1:M24’).

>>> ws.calculate_dimension()
# 'A1:I35'
>>> ws.dimensions
# 'A1:I35'

Worksheet.cell(row, column, value=None):

Метод Worksheet.cell() возвращает объект ячейки Cell на основе заданных координат.

Аргументы:

  • row — индекс строки ячейки, целое число.
  • column — индекс столбца ячейки, целое число.
  • value — значение ячейки, может быть число или дата/время или строка или bool или None.

Пример:

# доступ к объекту ячейки
>>> cell = ws.cell(row=4, column=2)
>>> cell
# <Cell 'Sheet'.B4>

# доступ с присваиваем значения ячейки
>>> cell = ws.cell(row=4, column=2, value=10)

Важно! Ячейки создаются при первом доступе к ним. Из-за такого поведения, простой перебор ячеек в цикле, создаст объекты этих ячеек в памяти, даже если не присваивать им значения.

Этот код создаст в памяти 100×100=10000 пустых объектов ячеек, просто так израсходовав оперативную память.

>>> for x in range(1,101):
...        for y in range(1,101):
...            # доступ к объекту ячейки
...            ws.cell(row=x, column=y)

Worksheet.columns:

Свойство Worksheet.columns создает генератор всех объектов ячеек текущего рабочего листа, в которых есть данные, по столбцам. Дополнительно смотрите метод Worksheet.iter_cols().

>>> ws.columns
# [(<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>, ...),
# (<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.B3>, ...),
# ...

>>> for col in ws.columns:
...     for cell in col:
...         print(cell)
# <Cell 'Sheet'.A1>
# <Cell 'Sheet'.A2>
# <Cell 'Sheet'.A3>
# ...
# <Cell 'Sheet'.B1>
# <Cell 'Sheet'.B2>
# <Cell 'Sheet'.B3>
...

Worksheet.column_dimensions:

Свойство Worksheet.column_dimensions содержит информацию о свойствах отображения столбцов и представляет собой словарный объект. Ключами объекта служат буквы столбцов рабочего листа. Например, что бы обратиться к группе ячеек определенного столбца, необходимо указать букву этого столбца: Worksheet.column_dimensions['D'].

Этот словарный объект имеет полезные атрибуты .width при помощи которого можно изменять ширину столбца.

Пример изменения высоты строки и ширины ячейки:

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> ws.title = 'RowColDimension'
# изменяем ширину колонки
>>> ws.column_dimensions['B'].width = 30
>>> ws.column_dimensions['D'].width = 50
# изменяем высоту строки
>>> ws.row_dimensions[5].height = 50
# для наглядности запишем в ячейки значения
>>> ws['B5'] = 'ширина = 30, высота = 50'
>>> ws['D5'] = 'ширина = 50, высота = 50'
# ну и выравним 
>>> from openpyxl.styles import Alignment
>>> for cell in ws[5]:
...     if cell.value:
...         cell.alignment = Alignment(horizontal="center", vertical="center")
>>> wb.save('width-height.xlsx')

Примечание: в коде используется свойство рабочего листа электронной таблицы Worksheet.row_dimensions.

Свойство Worksheet.column_dimensions имеет метод .group(start, end=None, outline_level=1, hidden=False), который разрешает группировку ряда последовательных строк или столбцов вместе, что бы свернуть/скрыть или показать их.

Принимаемые аргументы .group():

  • start: первый столбец для группировки (обязательно).
  • end=None: последний столбец для группировки (необязательно).
  • outline_level=1: уровень вложенности сворачивания. Например можно свернуть с 1 по 10 строки с уровнем 1, а потом свернуть строки с 5 по 10 с уровнем 2. В этом случае, при открытии документа появиться возможность показать/развернуть скрытые строки в 2 этапа. Так же это работает и с колонками.
  • hidden=False: должна ли группа быть свернута/скрыта на рабочем листе.

Пример сворачивания группы колонок и строк:

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> ws.title = 'RowColFold'
# свернем колонки с буквами с 'C' до 'F'
>>> ws.column_dimensions.group('C','F', hidden=True)
# свернем строки с номерами с 3 по 10
>>> ws.row_dimensions.group(3, 10, hidden=True)
# теперь свернем строки с номерами с 7 по 10, с уровнем 2
>>> ws.row_dimensions.group(7,10, outline_level=2, hidden=True)
>>> wb.save('fold_row-col.xlsx')

Worksheet.delete_cols(idx, amount=1):

Метод Worksheet.delete_cols() удаляет столбец или столбцы из col==idx, где idx числовой индекс столбца. Аргумент amount — количество удаляемых столбцов. По умолчанию удаляется один столбец.

Например, чтобы удалить столбцы в диапазоне F:H необходимо вызвать ws.delete_cols(6, 3).

# удалим 3 столбцы в диапазоне `F:H`
>>> ws.delete_cols(6, 3)

Worksheet.delete_rows(idx, amount=1):

Метод Worksheet.delete_rows() удаляет строку или строки из row==idx, где idx числовой индекс строки. Аргумент amount — количество удаляемых строк. По умолчанию удаляется одна строка.

Например, чтобы удалить строки в диапазоне 5:8 необходимо вызвать ws.delete_rows(5, 3).

# удалим 3 строки с 5 по 8
>>> ws.delete_rows(5, 3)

Worksheet.freeze_panes:

Свойство Worksheet.freeze_panes фиксирует строки и колонки находящиеся выше и левее указанной ячейки. Другими словами, это свойство фиксирует все что выше и левее указанной ячейки.

Например, если указать ws.freeze_panes = 'A3', то это заставит программу Excel зафиксировать только две верхние строки от прокрутки по вертикали. А если указать ws.freeze_panes = 'B3', то это зафиксирует две верхние строки от прокрутки по вертикали и колонку ‘A’ от прокрутки по горизонтали.

Worksheet.insert_cols(idx, amount=1):

Метод Worksheet.insert_cols() вставляет столбец или столбцы перед col==idx, где idx числовой индекс столбца. Аргумент amount — количество вставляемых столбцов. По умолчанию вставляется один столбец.

Например, чтобы вставить 3 столбца перед существующим столбцом D необходимо вызвать ws.insert_cols(4, 3).

# вставим 3 новых столбца
>>> ws.insert_cols(4, 3)

Worksheet.insert_rows(idx, amount=1):

Метод Worksheet.insert_rows() вставляет строку или строки перед row==idx, где idx числовой индекс строки. Аргумент amount — количество вставляемых строк. По умолчанию вставляется одна строка.

Например, чтобы вставить 3 строки перед существующей 7-ой строкой необходимо вызвать ws.insert_rows(7, 3).

# вставим 3 новые строки перед 
# существующей 7-ой строкой
>>> ws.insert_rows(7, 3)

Worksheet.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False):

Метод Worksheet.iter_cols() читает объекты ячеек на рабочем листе по столбцам (только те, которые имеют данные). Диапазон итерации задается с помощью индексов строк и столбцов. Возвращает генератор объектов из прочитанных ячеек.

  • Если индексы не указаны, то диапазон начинается с ячейки A1.
  • Если на листе нет ячеек с данными, то будет возвращен пустой кортеж.

Аргументы:

  • min_col — наименьший индекс столбца.
  • min_row — наименьший индекс строки.
  • max_col — наибольший индекс столбца.
  • max_row — наибольший индекс строки.
  • values_only — следует ли возвращать только значения ячеек.
>>> for col in ws.iter_cols(max_col=2, min_row=1, max_row=2):
...     for cell in col:
...         print(cell)
# <Cell Sheet1.A1>
# <Cell Sheet1.A2>
# <Cell Sheet1.B1>
# <Cell Sheet1.B2>

Примечание. Из соображений производительности метод Worksheet.iter_cols() недоступен в режиме только для чтения.

Worksheet.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False):

Метод Worksheet.iter_rows() читает объекты ячеек на рабочем листе по строкам (только те, которые имеют данные). Диапазон итерации задается с помощью индексов строк и столбцов. Возвращает генератор объектов из прочитанных ячеек.

  • Если индексы не указаны, то диапазон начинается с ячейки A1.
  • Если на листе нет ячеек с данными, то будет возвращен пустой кортеж.

Аргументы:

  • min_col — наименьший индекс столбца.
  • min_row — наименьший индекс строки.
  • max_col — наибольший индекс столбца.
  • max_row — наибольший индекс строки.
  • values_only — следует ли возвращать только значения ячеек.
>>> for col in ws.iter_rows(min_col=1, max_col=2, max_row=2):
...     for cell in col:
...         print(cell)
# <Cell 'Sheet'.A1>
# <Cell 'Sheet'.B1>
# <Cell 'Sheet'.A2>
# <Cell 'Sheet'.B2>

Worksheet.max_column:

Свойство Worksheet.max_column возвращает максимальный индекс столбца, содержащий данные. Индексы столбцов начинаются с 1, а не с 0, как в списке.

Worksheet.max_row:

Свойство Worksheet.max_row возвращает максимальный индекс строки, содержащий данные. Индексы строк начинаются с 1, а не с 0, как в списке.

Worksheet.merge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):

Свойство Worksheet.merge_cells устанавливает слияние в диапазоне ячеек range_string. Диапазон range_string — это диапазон ячеек, который задается строкой, например, 'A1:E1'.

Диапазон ячеек, также можно установить при помощи аргументов start_row, start_column, end_row и end_column.

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# объединить ячейки, находящиеся 
# в диапазоне `B2 : E2`
>>> ws.merge_cells('B2:E2')

Worksheet.min_column:

Свойство Worksheet.min_column возвращает минимальный индекс столбца, содержащий данные. Индексы столбцов начинаются с 1, а не с 0, как в списке.

Worksheet.min_row:

Свойство Worksheet.min_row возвращает минимальный индекс строки, содержащий данные. Индексы строк начинаются с 1, а не с 0, как в списке.

Worksheet.move_range(cell_range, rows=0, cols=0, translate=False):

Метод Worksheet.move_range() перемещает диапазон ячеек cell_range на количество строк rows и/или столбцов cols:

  • вниз, если rows > 0, и вверх, если rows < 0,
  • вправо, если cols > 0, и влево, если cols < 0.

Существующие ячейки будут перезаписаны. Формулы и ссылки обновляться не будут.

Пример:

>>> ws.move_range("D4:F10", rows=-1, cols=2)

Это приведет к перемещению ячеек в диапазоне ячеек D4:F10 вверх на одну строку и вправо на два столбца. Ячейки будут перезаписаны всеми существующими ячейками.

Если ячейки содержат формулы, то openpyxl может транслировать их, но этот функционал умолчанию отключен. Кроме того, будут транслированы только формулы в самих ячейках. Ссылки на ячейки из других ячеек или определенные имена обновляться не будут. Для этого можно использовать переводчик формул синтаксического анализа:

>>> ws.move_range("G4:H10", rows=1, cols=1, translate=True)

Это приведет к перемещению относительных ссылок в формулах в диапазоне на одну строку и один столбец.

Worksheet.print_area:

Свойство Worksheet.print_area возвращает/устанавливает область печати «по умолчанию» для текущего рабочего листа электронной таблицы. Если область печати не задана, то возвращается None.

Для установки области печати «по умолчанию«, необходимо указать диапазон, например 'A1:D4', или список диапазонов.

>>> print(ws.print_area)
# None

# установим диапазон печати
>>> ws.print_area = 'A1:F10'
>>> ws.print_area
# ['$A$1:$F$10']

# несколько диапазонов для печати по умолчанию
>>> ws.print_area = ['A1:B2', 'C3:F5']
>>> ws.print_area
# ['$A$1:$a$2', '$a$3:$f$10']

Worksheet.print_title_cols:

Свойство Worksheet.print_title_cols устанавливает колонки, которые должны быть напечатаны слева на каждой странице, например: 'A:C'.

# заставляем Excel печатать   
# колонку `A` на каждом листе
>>> ws.print_title_cols = 'A:A'

Worksheet.print_title_rows:

Свойство Worksheet.print_title_rows устанавливает строки, которые должны быть напечатаны вверху каждой страницы, например, '1:3'.

# заставляем Excel печатать диапазон 
# строк со 2 по 3 на каждом листе
>>> ws.print_title_rows = '2:3'

Worksheet.rows:

Свойство Worksheet.rows создает генератор всех объектов ячеек текущего рабочего листа, в которых есть данные, по строкам. Дополнительно смотрите метод Worksheet.iter_rows().

>>> list(ws.rows)
# [(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>, 
# (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>, , ...),
# ...

>>> for row in ws.rows:
...     for cell in row:
...         print(cell)
# <Cell 'Sheet'.A1>
# <Cell 'Sheet'.B1>
# <Cell 'Sheet'.C1>
# ...
# <Cell 'Sheet'.A2>
# <Cell 'Sheet'.B2>
# <Cell 'Sheet'.C2>
...

Worksheet.row_dimensions:

Свойство Worksheet.row_dimensions содержит информацию о свойствах отображения строк и представляет собой словарный объект. Ключами объекта служат номера строк.

Этот словарный объект имеет полезные атрибут .height при помощи которого можно менять высоту строки и метод .group, который служит для группировки строк, для дальнейшего их сворачивания.

Так же смотрите свойство Worksheet.column_dimensions и материал «Изменение размеров строки/столбца модулем openpyxl в Python»

Worksheet.set_printer_settings(paper_size, orientation):

Метод Worksheet.set_printer_settings() устанавливает размер бумаги paper_size и ориентацию страницы orientation по умолчанию для текущего листа электронной таблицы.

Аргумент paper_size может принимать значения:

  • Worksheet.PAPERSIZE_A3 = '8'.
  • Worksheet.PAPERSIZE_A4= '9'.
  • Worksheet.PAPERSIZE_A4_SMALL= '10'.
  • Worksheet.PAPERSIZE_A5= '11'.
  • Worksheet.PAPERSIZE_EXECUTIVE= '7'.
  • Worksheet.PAPERSIZE_LEDGER= '4'.
  • Worksheet.PAPERSIZE_LEGAL= '5'.
  • Worksheet.PAPERSIZE_LETTER= '1'.
  • Worksheet.PAPERSIZE_LETTER_SMALL= '2'.
  • Worksheet.PAPERSIZE_STATEMENT= '6'.
  • Worksheet.PAPERSIZE_TABLOID= '3'.

Ориентация страницы, так же настраивается при помощи констант объекта Worksheet

  • Worksheet.ORIENTATION_LANDSCAPE= 'landscape'.
  • Worksheet.ORIENTATION_PORTRAIT= 'portrait'.

Примечание: В коде не обязательно использовать имена констант, можно напрямую использовать их значения.

# формат `А4`, ориентированный как `landscape`
>>> set_printer_settings('9', 'landscape')

Worksheet.tables:

Свойство Worksheet.tables возвращает все объекты таблиц текущего листа документа XLSX, добавленные методом Worksheet.add_table().

Worksheet.unmerge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):

Метод Worksheet.unmerge_cells() удаляет слияние ячеек в диапазоне range_string. Аргумент range_string — это диапазон ячеек, который ранее был объединен при помощи метода Worksheet.merge_cells() и задается строкой, например, 'A1:E1'.

Диапазон ячеек, также можно установить при помощи аргументов start_row, start_column, end_row и end_column.

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# объединим ячейки
>>> ws.merge_cells('B2:E2')
# а теперь разъединим ячейки,  
# в диапазоне `B2 : E2`
>>> ws.unmerge_cells('B2:E2')

Worksheet.values:

Свойство Worksheet.values создает генератор, который содержит все значения ячеек, которые имеются на текущем листе по строкам.

for row in ws.values:
   for value in row:
     print(value)

Этот код напечатает все значения ячеек текущего рабочего листа, которые имеют какие-то данные.

У меня есть следующий код, который считывает данные из текстового файла с разделителями табуляции, а затем записывает их на указанный лист в существующей книге Excel. Переменные «workbook», «write_sheet» и «text_file» вводятся пользователем

tab_reader = csv.reader(text_file, delimiter='t')
xls_book = openpyxl.load_workbook(filename=workbook)
sheet_names = xls_book.get_sheet_names()
xls_sheet = xls_book.get_sheet_by_name(write_sheet)
for row_index, row in enumerate(tab_reader):
        number = 0
        col_number = first_col
        while number < num_cols:
                cell_tmp = xls_sheet.cell(row = row_index, column = col_number)
                cell_tmp.value = row[number]
                number += 1
                col_number += 1
xls_book.save(workbook)

однако, когда я запускаю этот код на уже существующей «книге», в которой» рабочий лист » является скрытой вкладкой, вывод отображает вкладку. Я думаю, причина в том, что openpyxl не изменяет файл, а создавать новый файл. Есть есть простой способ сказать python, чтобы проверить, скрыт ли лист, а затем вывести скрытый или не скрытый лист на основе того, выполняется ли условие?

спасибо!

2 ответов


в настоящее время мы не поддерживаем скрытие листов в openpyxl, поэтому это просто игнорируется при чтении файла и, следовательно, теряется при его сохранении. Я не думаю, что это будет слишком сложно добавить. Пожалуйста, отправьте запрос на Bitbucket.

[обновление]

функция теперь доступна:

ws.sheet_state = 'hidden'

или на самом деле xls_sheet.sheet_state = 'hidden' в вашем конкретном случае.


комментарий Чарли Кларка верен:

ws.sheet_state = 'hidden'

это работает для меня.


Понравилась статья? Поделить с друзьями:
  • Скрытые строчки excel как открыть
  • Скрытые листы в excel 2010 как показать
  • Скрытые строки в excel это
  • Скрытые знаки форматирования в word что такое
  • Скрытые ссылки в ячейках excel