Уведомления

Группа в Telegram: @pythonsu

#1 Март 4, 2021 21:22:35

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

Доброго времени суток!

Перешел на редактирование Excel файлов, но есть одна проблема, область печати документа при редактировании таким образом сбивается. Если нет возможности “Содрать” данные настроек печати со старого файла. Можно реализовать это вручную, количество строк и колон фиксированное.

Использую модули xlrd, xlwt и xlutils - так как они поддерживают xls (НЕ xlsx)

Единственное упоминание об этой проблеме, что я нашел в интернете:

Вы читаете в файле с помощью xlrd, а затем копируете его в рабочую книгу xlwt с помощью xlutils.copy.copy().

Обратите внимание, что вам нужно будет установить библиотеки xlrd и xlutils.

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

мой код:
 from xlrd import open_workbook
from xlutils.copy import copy
import os
# Эти две функции просто устанавливают предыдущий стиль ячейки, скоммуниздил их где-то в интернете
def setOutCell(outSheet, col, row, value):
    previousCell = _getOutCell(outSheet, col, row)
    outSheet.write(row, col, value)
    if previousCell:
        newCell = _getOutCell(outSheet, col, row)
        if newCell:
            newCell.xf_idx = previousCell.xf_idx
def _getOutCell(outSheet, colIndex, rowIndex):
    row = outSheet._Worksheet__rows.get(rowIndex)
    if not row: return None
    cell = row._Row__cells.get(colIndex)
    return cell
book = open_workbook("Мой загружаемый файл.xls", formatting_info=True)
sheet = book.sheet_by_index(0)
items = sheet.nrows - 37
wb = copy(book) #тут 'перехожу в режим' редактирования, оно и не копирует область печати
s = wb.get_sheet(0)
setOutCell(s, 17, 26 + items, 'Тут что-то меняю')
setOutCell(s, 17, 30 + items, 'И тут')
setOutCell(s, 11, 34 + items, 'И тут')
setOutCell(s, 31, 26 + items, 'И тут тоже')
setOutCell(s, 29, 28 + items, 'Само собой тут тоже')
wb.save("Test.xls") #Создание и сохранение нового файла
os.startfile("Test.xls", "print") # Вывод печати на принтер
Надеюсь, тут найдется человек, страдавший подобной хе*нёй что и я.
Буду очень признателен.

Офлайн

#2 Март 6, 2021 18:01:56

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

Добрый вечер!

Еле нарыл инфу, что модуль xlrd не умеет читать такую инфу с файла, а xlwt записывать.

Думаю моя проблема состоит в формате таблицы.
Через модуль xls2xlsx сконвертировал свой результат в xlsx
Но, так как модуль xls2xlsx работает на основе модулей xlrd и xlwt, в итоговом файле так же сбрасываются настройки области печати


(в первоначальном, нетронутом файле всё это было страницей 1)

Но прогресс есть!
Теперь у меня есть xlsx файл, с которым уже работает большинство модулей по чтению/записью excel

Посоветуйте простенький модуль для изменении области печати в xlsx файле

Офлайн

#3 Март 6, 2021 18:39:40

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

https://xlsxwriter.readthedocs.io/page_setup.html

print_area(first_row, first_col, last_row, last_col)
Set the print area in the current worksheet.
оно?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#4 Март 6, 2021 19:28:10

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

PEHDOM
оно?
Я так обрадовался когда увидел эти строки!

Но как оказалось, это функция модуля xlsxwriter, которая не читает файлы, а только пишет.
Теперь я в глубокой депрессии.

Офлайн

#5 Март 6, 2021 20:43:20

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

хмм, а это https://openpyxl.readthedocs.io/en/stable/print_settings.html?highlight=print_area#add-a-print-area
openpyxl вроде читает и пишет



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Март 7, 2021 08:12:23

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

PEHDOM
Спасибо большое за помощь,

Как оказалось, print_area меняет общий размер печатной области, на моём скрине выше, это жирный синий квадрат. Как же изменить пунктирную синюю линию разделяющую первую страницу от второй?

Openpyxl - при открытии и последующем сохранении через этот модуль содержимое файла так сказать немного “шакалится” особенно это заметно при отрисовки линий таблицы при объединённых ячейках.
Может в функции load_workbook имеется какой-нибудь параметр исправляющий это? Как в xlrd : formatting_info=True

Офлайн

#7 Март 7, 2021 10:10:16

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

хмм тут не скажу все парметры лоад_воркбук можно посмотреть тут https://openpyxl.readthedocs.io/en/stable/api/openpyxl.reader.excel.html
по поводу стилей ячеек https://openpyxl.readthedocs.io/en/stable/styles.html может чтото найдете судя по картинке оно не коректно работает с обьединенными ячейками. попробуйте посмотреть какие там стили оно загружает для этих ячеек. И как это можо исправить.
И по поводу синих лниний, скорее всего нужо смотреть или настройки принтера/стриницы https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.page.html
или попробовать задать не одну область, а список областей

Спойлер из документации:https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.worksheet.html
print_area
The print area for the worksheet, or None if not set. To set, supply a range like ‘A1:D4’ or a list of ranges.
Тогда возможно оно будет считать каждую область отдельной страницей.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 7, 2021 10:11:32)

Офлайн

#8 Март 8, 2021 05:08:50

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

PEHDOM
Доброе утро!
У меня возникла прекрасная идея, так как я собираюсь лишь слегка подредактировать xls файл,
могу ли я в питоне записать код на VBA (его я знаю) и заставить определенный файл excel исполнить его?

Офлайн

#9 Март 8, 2021 06:55:56

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

УРА!!! Поздравьте меня!

Наконец, нашел модуль который подходит для моих задач!
1. Открывает редактирует и сохраняет xls excel
2. Не поганит файл.
3. Мне даже кажется что он работает быстрее тех модулей, что были выше по переписке

https://habr.com/ru/post/232291/

Офлайн

#10 Март 8, 2021 11:14:09

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Изменение области печати Excel через Python

Temp
Наконец, нашел модуль который подходит для моих задач!
Из вашего поста непонятно что именно вы нашли. Методом исключения win32com?
Temp
1. Открывает редактирует и сохраняет xls excel
Честно говоря с самого начала дискуссии мне была непонятна ваша привязанность к давно устаревшему формату xls, который даже микрософт рекомендует выкинуть. Мне интересно с чем это связано?
Temp
3. Мне даже кажется что он работает быстрее тех модулей, что были выше по переписке
Если вы о win32com то должен вас огорчить. Вызовы win32com очень дорогие. На обычных задчах он в сотни раз медленнее перечисленных выше модулей. Настолько медленный что мне даже пришлось отказаться от него для решения прикладных задачек, поскольку приходилось ждать десятки минут, в то время прямое редактирование справлялось за секунды. (речь правда идет о ворде).

В питоне есть средство измерения времени выполнения https://docs.python.org/3/library/timeit.html. Оно позволит измерить результат а не опираться на ощущения или веру.

Ну у всего есть плюсы и минусы… Если удобно то почему его не использовать.



Отредактировано doza_and (Март 8, 2021 11:21:08)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version