Форум сайта python.su
Таким образом пытаюсь удалить из временного файла первый счет.
Что не так делаю?
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()
Офлайн
Я поудалял строки, посмотрел, openpyxl при удалении строк не удаляет их целиком как объекты, а просто стирает содержимое из них и на место старого содержимого пишет содержимое, которое смещается снизу вверх. То есть он оставляет форматирование ячеек и просто в них пишет новое содержимое.
Так что это удаление ненадёжно. Если записи будут различаться по количеству строк, то всё поплывёт и данные будут неправильно отформатированы в результате. Пока что оно всё работает, если так первую запись удалять. Но это работает, пока в записях одинаковое количество строк.
Так что либо тебе нужно отказаться от форматирования, расформатировать вообще всё в единичные ячейки, потом это всё в простейшем виде переносить в новый файл, а потом новый файл размечать по формату; либо, действительно, надо писать что-то умное, что будет вставать на начало и конец одной записи, а потом это окно такое, которое стоит на начале и конце записи, целиком переносить в новый файл, полностью копируя всё форматирование, отыскивая все склеенные ячейки и перенося эти склеенности в новый файл на правильные места.
Я думал, openpyxl - нормальная вещь, а оказалось, что поделка. Смотри, вот если взять в Excel'е или, как я, в LibreOffice Calc'е, и удалить строку, в которой склеены ячейки, то она удаляется вся и всё, удаляется вместе со своей этой склеенностью. По идее, вот этот модуль openpyxl должен делать так же, потому что это поведение программ такого рода вполне определено, а он так не делает, потому что дурачок какой-то его писал. Это надо ему теперь оставлять сообщение где-нибудь на его репозиторном ишью-трекере о том, что “вот ты дурак! ты что написал?! изучи поведение Excel'я сначала! строки должны удаляться целиком, вместе со своим форматированием!”. Ну, и он будет целый год эту фигню исправлять. Там не дождёшься даже.
Так что остаётся два варианта, если openpyxl использовать. Не знаю, потянешь ли ты вот это окно реализовать, в котором надо будет все эти диапазоны склеенные отыскивать и копировать. Довольно такая немаленькая структурка получится, там надо будет функции писать, функции на функциях. А ты, я смотрю, даже до функций ещё не дошёл в питоне. Так что без опыта это не прокатит.
Отредактировано py.user.next (Авг. 31, 2022 13:20:51)
Офлайн
ясно) спасибо
Офлайн
В Python есть возможность подключаться к SQL, команда передается в виде текста, а можно так же в Excel передать макрос на удаление строк?
Офлайн
Provi
В Python есть возможность подключаться к SQL, команда передается в виде текста, а можно так же в Excel передать макрос на удаление строк?
Офлайн
а можно пример команды как передать текст макроса в эксель?
Офлайн
Provi
сорри, я неправильно понял вопрос, отбой
Офлайн
Proviпрочитайте файл просто в датафрейм и работайте с ячейками, складывайте, вычитайте.
Или вопрос можно переформулировать: как список merged_cell_ranges, привести к обычном списку, над которым можно совершать операции сложения и вычитания.
Офлайн
ProviТам можно подключиться к самому Excel'ю и через него удалять строки. Там в Windows есть такой механизм подключения к приложениям. Но это такой вариант, что тебе нужен будет Excel на компе и Excel именно той версии. Ну, представь просто, что тебе нужно будет на сервер этот скрипт поставить, чтобы он преобразовывал тысячи этих Excel-файлов в день, а на сервере Excel'я нет и не поставишь его туда, потому что он там не нужен. Питон-то туда поставить можно и нужно.
В Python есть возможность подключаться к SQL, команда передается в виде текста, а можно так же в 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, 2022 00:02:29)
Офлайн
Здесь новый алгоритм побольше этого.
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. Вывести информацию о количестве счетов на экран.
На входе у тебя один общий файл со всеми счетами.
На выходе у тебя входной файл и множество выходных файлов с номерами счетов в именах, где в одном файле один счёт под своим номером счёта и все склеенности ячеек перенесены из входного файла точно.
На экране у тебя информация о проделанной работе.
Отредактировано py.user.next (Сен. 1, 2022 23:24:32)
Офлайн