Найти - Пользователи
Полная версия: openpyxl перенести диапазоны объединения ячеек из одного файла в другой с небольшим сдвигом
Начало » Python для новичков » openpyxl перенести диапазоны объединения ячеек из одного файла в другой с небольшим сдвигом
1 2 3
Provi
Таким образом пытаюсь удалить из временного файла первый счет.
Что не так делаю?
            book_temp = excl.load_workbook(output_temp_file)   
page_temp = book_temp[sheet_name]
page_temp.delete_rows(0, row_end+4)
book_temp.save(output_temp_file)
book_temp.close()
После удаления, когда пытаюсь открыть excel говорит ошибка и предлагает восстановить файл.
py.user.next
Я поудалял строки, посмотрел, openpyxl при удалении строк не удаляет их целиком как объекты, а просто стирает содержимое из них и на место старого содержимого пишет содержимое, которое смещается снизу вверх. То есть он оставляет форматирование ячеек и просто в них пишет новое содержимое.

Так что это удаление ненадёжно. Если записи будут различаться по количеству строк, то всё поплывёт и данные будут неправильно отформатированы в результате. Пока что оно всё работает, если так первую запись удалять. Но это работает, пока в записях одинаковое количество строк.

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

Я думал, openpyxl - нормальная вещь, а оказалось, что поделка. Смотри, вот если взять в Excel'е или, как я, в LibreOffice Calc'е, и удалить строку, в которой склеены ячейки, то она удаляется вся и всё, удаляется вместе со своей этой склеенностью. По идее, вот этот модуль openpyxl должен делать так же, потому что это поведение программ такого рода вполне определено, а он так не делает, потому что дурачок какой-то его писал. Это надо ему теперь оставлять сообщение где-нибудь на его репозиторном ишью-трекере о том, что “вот ты дурак! ты что написал?! изучи поведение Excel'я сначала! строки должны удаляться целиком, вместе со своим форматированием!”. Ну, и он будет целый год эту фигню исправлять. Там не дождёшься даже.

Так что остаётся два варианта, если openpyxl использовать. Не знаю, потянешь ли ты вот это окно реализовать, в котором надо будет все эти диапазоны склеенные отыскивать и копировать. Довольно такая немаленькая структурка получится, там надо будет функции писать, функции на функциях. А ты, я смотрю, даже до функций ещё не дошёл в питоне. Так что без опыта это не прокатит.
Provi
ясно) спасибо
Provi
В Python есть возможность подключаться к SQL, команда передается в виде текста, а можно так же в Excel передать макрос на удаление строк?
FishHook
Provi
В Python есть возможность подключаться к SQL, команда передается в виде текста, а можно так же в Excel передать макрос на удаление строк?

>команда передается в виде текста
>а можно передать макрос на удаление строк
допустим, что некий “макрос” можно передать, что это по-вашему должно быть, если не текст?
Provi
а можно пример команды как передать текст макроса в эксель?
FishHook
Provi
сорри, я неправильно понял вопрос, отбой
xam1816
Provi
Или вопрос можно переформулировать: как список merged_cell_ranges, привести к обычном списку, над которым можно совершать операции сложения и вычитания.
прочитайте файл просто в датафрейм и работайте с ячейками, складывайте, вычитайте.
py.user.next
Provi
В Python есть возможность подключаться к SQL, команда передается в виде текста, а можно так же в Excel передать макрос на удаление строк?
Там можно подключиться к самому Excel'ю и через него удалять строки. Там в Windows есть такой механизм подключения к приложениям. Но это такой вариант, что тебе нужен будет Excel на компе и Excel именно той версии. Ну, представь просто, что тебе нужно будет на сервер этот скрипт поставить, чтобы он преобразовывал тысячи этих Excel-файлов в день, а на сервере Excel'я нет и не поставишь его туда, потому что он там не нужен. Питон-то туда поставить можно и нужно.

xam1816
прочитайте файл просто в датафрейм и работайте с ячейками, складывайте, вычитайте.
Ему нужно сохранить форматирование ячеек. Хотя бы склеенность этих ячеек. Датафрейм работает только с данными. А с данными можно работать и без всякого pandas'а.


Так что, я думаю, надо побольше алгоритм сделать. На входной файл такое окно ставишь, которое видит, где начало очередной записи и где конец этой очередной записи. Потом выбираешь все диапазоны склеенных ячеек, вообще все диапазоны. Потом из всех этих диапазонов склеенных ячеек выбираешь только те диапазоны, которые относятся к этой очередной записи, на которой стоит это окно, определяющее начало и конец этой записи. Потом эти выбранные диапазоны склеенных ячеек только для этой записи все смещаешь на “начало листа”. А для этого тебе нужно следить, где стоит окно в данный момент, сколько там строк до начала окна. И вот их надо будет отнимать каждый раз. То есть это число строк будет всё время меняться при переходе к каждой последующей записи.

Нашёл метод у диапазона, которым можно сдвигать диапазон на несколько строк вверх
  
>>> import openpyxl
>>> 
>>> ifname = 'in.xlsx'
>>> 
>>> workbook = openpyxl.load_workbook(filename=ifname)
>>> sheet = workbook['TDSheet']
>>> 
>>> ranges = sheet.merged_cells.ranges
>>> 
>>> r = ranges[0]
>>> r
<MergedCellRange AA14:AE14>
>>> 
>>> r.shift(0, -1)
>>> r
<MergedCellRange AA13:AE13>
>>>

Потом просто переписываешь данные записи, на которой стоит окно, в новый файл и туда же переписываешь вот эти диапазоны этой записи, смещённые на правильное количество строк вверх.

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

1. Определить количество счетов в исходном файле.
1.1. Открыть исходный файл.
1.2. Посчитать начальные строки счетов.
1.3. Закрыть исходный файл.
2. Создать выходные файлы отдельных счетов из исходного файла.
2.1. Открыть исходный файл.
2.2. Определить список всех диапазонов объединённых ячеек в исходном файле.
2.3. Установить текущий номер счёта в ноль.
2.4. Для известного количества счетов:
2.4.1. Увеличить текущий номер счёта на единицу.
2.4.2. Установить начало окна в исходном файле на начало счёта для текущего номера счёта.
2.4.3. Установить конец окна в исходном файле на конец счёта для текущего номера счёта.
2.4.4. Вычислить количество строк в текущем счёте.
2.4.4.1. Вычесть из конца окна начало окна и прибавить единицу.
2.4.5. Выбрать из списка всех диапазонов объединённых ячеек список диапазонов объединённых ячеек для текущего счёта.
2.4.6. Сместить диапазоны объединённых ячеек текущего счёта вверх на количество строк, стоящих до начала окна.
2.4.6. Создать выходной файл текущего счёта с номером текущего счёта в имени файла.
2.4.7. Скопировать строки окна от начала окна до конца окна включительно в выходной файл текущего счёта.
2.4.7. Записать диапазоны объединённых ячеек текущего счёта в выходной файл текущего счёта.
2.4.8. Скопировать форматирование каждой ячейки окна в выходной файл текущего счёта.
2.4.8.1. Тут пока что заглушка, которая ничего не делает.
2.4.9. Закрыть выходной файл текущего счёта.
2.4.10. Перейти к пункту 2.4.
2.5. Закрыть исходный файл.
3. Вывести информацию о количестве счетов на экран.


На входе у тебя один общий файл со всеми счетами.
На выходе у тебя входной файл и множество выходных файлов с номерами счетов в именах, где в одном файле один счёт под своим номером счёта и все склеенности ячеек перенесены из входного файла точно.
На экране у тебя информация о проделанной работе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB