Операции с Excel документами
Создание, редактирование и анализ Excel-файлов через Python в песочнице: формулы, сводные таблицы, форматирование, диаграммы, объединение листов и выгрузка готовых отчётов в формате .xlsx.
Excel (v4.3)
Маршрутизация
XML-справочник: ooxml_cheatsheet.md
.agg() и .rename() — имена результирующих колонок
Кварг-имя в .agg(name=('col','func')) обязано быть валидным Python-идентификатором: латиница/кириллица + цифры + _. Дефис ломает парсер: Кол-во= читается как Кол - во=, и интерпретатор валится с SyntaxError: expression cannot contain assignment, perhaps you meant "=="?.
Английский snake_case в .agg(), человекочитаемые имена через .rename():
Альтернатива — дикт-распак, принимает любые символы сразу:
ASCII-операторы в исходнике
Сравнения и форматирование внутри Python-кода — только ASCII: >=, <=, !=. Юникод ≥ ≤ ≠ ловится парсером как SyntaxError, особенно в f-string'ах для красивого вывода. Юникод-символы — в финальный markdown/текст для пользователя, не в исходник.
Чтение xlsx без потери чисел
pd.read_excel(...).fillna('').values сохраняет dtype: числа остаются float, текст — str. После .astype(str) все числа становятся пустыми строками, и любой float(s) даёт NaN. Конвертируй точечно, не массово.
1С: иерархические отчёты («История по заказ-нарядам» и аналоги)
Структура: клиент → VIN → заказ-наряд → строки работ/запчастей. Все четыре уровня живут в col[0], числовые суммы — в правых колонках, индекс зависит от шаблона отчёта. Колонки Работ / Запчастей / Всего обычно в индексах 5 / 6 / 7, проверяй на образце.
Алгоритм: один проход, state-machine с тремя переменными cur_vin / cur_zn / cur_customer. Порядок проверок: skip-заголовки → VIN → ЗН → детальная строка → клиент. Клиент проверяется последним, иначе VIN или ЗН-строка попадает в клиенты.
Контрольная сумма: zn_df['works_sum'].sum() должна сходиться с суммой work_cost по it_df[it_df.kind=='work'] (±ровные комплексные строки — норма). Расходится в 2-3 раза — индексы WORK_COL / PARTS_COL / TOTAL_COL не те, проверь образец строки рядом с первым ЗН.
Умные таблицы (Excel Tables)
Заголовок таблицы — только явные строки; ref начинается со строки текстовых заголовков. Если header-ячейка содержит формулу или дату, Excel открывает файл только через «восстановление» — для пользователя это «файл повреждён». openpyxl при этом лишь warning'ует (column headings must be strings) и сохраняет битый XML.
Имена листов
Excel запрещает в именах листов символы: \ * ? : / [ ]
Ремонт структуры (битый файл)
xlsx не открывается / BadZipFile / XMLSyntaxError / Excel сообщает о повреждении — сначала структурный ремонт, потом обычные операции. Это другой класс, чем починка формул (fix_guide.md): тут разорваны сами XML-теги.
- Первый вызов без output — диагностика, файл не трогаем; второй — ремонт в output.
- Output ≠ input по имени (
fixed.xlsx). - Битые теги (zip цел) чинятся; битый zip-контейнер (обрыв/CRC) — exit 2, нерекаверабелен.
- После ремонта дальнейшие правки — на
*_fixed.xlsxчерез unpack→edit→pack.
RU-форматы
| Формат | numFmt |
|---|---|
| 1 234 567 | #\ ##0 |
| 1 234,56 | #\ ##0.00 |
| 1 234 руб. | #\ ##0\ "руб." |
| 12,5% | 0.0% |
| 05.04.2026 | DD.MM.YYYY |
1С-экспорт: encoding="utf-8-sig", sep=";", decimal=",".
Пути
| Что | Путь |
|---|---|
| Входные файлы | /tmp/ |
| Результат | $OUTPUT_ROOT/ |
Похожие навыки
Попробуйте этот навык
Зарегистрируйтесь и используйте навык «Операции с Excel документами» бесплатно.