Library: fill Excel (.xlsx) templates with Jinja2 and optional row expansion from a context dict
Project description
docfill
Заполнение шаблонов Excel (.xlsx) через Jinja2 и опциональное размножение строки-шаблона по списку из JSON.
Установка
pip install -e .
pip install -e ".[dev]" # опционально: pytest
Тесты без pytest (stdlib):
set PYTHONPATH=src
python -m unittest discover -s tests -p "test_*.py" -v
Шаблон и контекст
- Все листы книги обрабатываются подряд одним контекстом; лист без размеченной строки под список и без блоков
{% for %}получает только глобальный Jinja (если в контексте есть непустойitems, авторазвёртывание на таком листе пропускается, чтобы не падать на пустых листах). - Несколько таблиц на листе: для каждой пары
{% for var in listKey %}…{% endfor %}в контексте должен быть списокlistKey(напримерitems,items2). Блоки обрабатываются снизу вверх, чтобы вставка строк не сдвигала нижележащие шаблоны. Сдвиг формул под верхней таблицей не затрагивает строки нижней (до начала её блокаfor). - Если на листе нет тегов
{% for %}, но в контексте есть непустой список по ключуitems, строка-шаблон ищется автоматически: сначала строка с{{ item., иначе строка с наибольшим числом ячеек с{{(при равенстве — нижняя). Если максимум 1 ячейка и таких строк несколько (например шапка «Customer» / «Date» в разных строках), авторазвёртывание не делается — только глобальный Jinja; таблицу пометьте{% for %}или{{ item.... }}на строке данных. - Для каждого элемента списка контекст строки = глобальный контекст без этого списка + поля элемента (плоское объединение) +
item(тот же объект). Работают и{{ name }}, и{{ item.name }}. - Поддерживается шаблон с маркерами цикла в Excel: в строке-шаблоне можно использовать
{% for item in items %}..., а в следующей строке{% endfor %}. Эти служебные маркеры удаляются в результате. В ячейках строки данных доступен объектloop(как в Jinja):loop.index,loop.index0,loop.first/loop.last,loop.length,loop.revindex/loop.revindex0,loop.previtem/loop.nextitem. - Формулы ниже блока цикла (например строка
Итого) автоматически сдвигаются по относительным ссылкам на число добавленных строк. - Значения вида
2,10,3.5после Jinja записываются как числа, а не текст — иначеSUMи другие формулы дают 0. - После размножения строк выполняется второй проход по листу: подставляются глобальные плейсхолдеры вне строки-шаблона (например
{{ customer_name }}в шапке). - Формулы в строке-шаблоне копируются со сдвигом относительных ссылок (
openpyxlTranslator), как при протягивании в Excel. Накопительный итог в колонке (running total): в шаблоне первая строка данных, например строка 2, задайте=SUM($E$2:E2)или локально=СУММ($E$2:E2)— начало диапазона с двумя долларами у строки ($E$2). Вариант=SUM($E2:E2)после копирования вниз даст=SUM($E3:E3)и посчитает только текущую строку; это не ошибка листа или docfill, а формула шаблона. - Ячейки-формулы Jinja не обрабатывает (только обычный текст в ячейках).
Библиотека
Установка: pip install . из корня репозитория или pip install -e . для разработки. Пакет следует PEP 517 (python -m build при наличии build).
from docfill import fill_workbook
ctx = {"title": "Отчёт", "items": [{"name": "A", "qty": 1}]}
fill_workbook("template.xlsx", "out.xlsx", ctx)
Контекст всегда передаётся словарём (или иным Mapping). Прочитать JSON из файла — на стороне вызывающего кода, например json.loads(Path("context.json").read_text(encoding="utf-8")).
Публикация на PyPI
- Зарегистрируйте аккаунт на pypi.org. Загрузка с GitHub Actions идёт через trusted publishing (OIDC): в настройках проекта на PyPI добавьте publisher с вашим
owner/repo, workflowpublish.yml, окружениеpypi. Отдельный API token для CI не нужен. Для ручной загрузки черезtwineможно создать API token. - Имя пакета
docfillдолжно быть свободно на PyPI; при занятости сменитеnameвpyproject.toml. - При желании добавьте в
pyproject.tomlв[project.urls]поля Repository и Issues (рядом сHomepage). - Версия в
pyproject.tomlдолжна совпадать с релизом: при каждом GitHub Release поднимайтеversionиначе PyPI отклонит повтор той же версии. - Сборка и проверка дистрибутивов вручную:
pip install -e ".[publish]"
python -m build
twine check dist/*
- Загрузка вручную (тестовый индекс TestPyPI или основной PyPI):
twine upload dist/*
Для TestPyPI: twine upload --repository testpypi dist/* и установка проверки: pip install -i https://test.pypi.org/simple/ docfill.
Лицензия: MIT (файл LICENSE). Версию перед релизом поднимайте в pyproject.toml и синхронно в запасном значении в docfill/__init__.py (PackageNotFoundError).
Ограничения
- Нет пересчёта формул при сохранении — результат пересчитает Excel при открытии.
- Объединённые ячейки в строке-шаблона не поддерживаются.
- Rich text в ячейке не разбирается как шаблон.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file docfill-0.2.2.tar.gz.
File metadata
- Download URL: docfill-0.2.2.tar.gz
- Upload date:
- Size: 17.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa51a13856938e0886680f1a99097f6ab8af84eaf8286c56265eefa66c7db0a7
|
|
| MD5 |
bbb9060d038b66d1bfd395489cea9631
|
|
| BLAKE2b-256 |
b45d5eacf23ef0f8ee1ddd5ae649ab778cff60c2a0b8ea12a44da90da86f79fe
|
Provenance
The following attestation bundles were made for docfill-0.2.2.tar.gz:
Publisher:
publish.yml on ametist-dev/logistic-docfill
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
docfill-0.2.2.tar.gz -
Subject digest:
fa51a13856938e0886680f1a99097f6ab8af84eaf8286c56265eefa66c7db0a7 - Sigstore transparency entry: 1252424801
- Sigstore integration time:
-
Permalink:
ametist-dev/logistic-docfill@0eff958509575f7c60c5731bc8c10990d2a46f71 -
Branch / Tag:
refs/tags/0.2.2 - Owner: https://github.com/ametist-dev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0eff958509575f7c60c5731bc8c10990d2a46f71 -
Trigger Event:
release
-
Statement type:
File details
Details for the file docfill-0.2.2-py3-none-any.whl.
File metadata
- Download URL: docfill-0.2.2-py3-none-any.whl
- Upload date:
- Size: 12.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea6dc0d5068ef3393a5c1cd466ed5ebc79fceac4341d1a123886caf7982396f6
|
|
| MD5 |
281822664296fc6fba024835183ffe21
|
|
| BLAKE2b-256 |
693057817ac7c3acbe1641d771a868d9647aadf14d65f0c3f514117164d99859
|
Provenance
The following attestation bundles were made for docfill-0.2.2-py3-none-any.whl:
Publisher:
publish.yml on ametist-dev/logistic-docfill
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
docfill-0.2.2-py3-none-any.whl -
Subject digest:
ea6dc0d5068ef3393a5c1cd466ed5ebc79fceac4341d1a123886caf7982396f6 - Sigstore transparency entry: 1252424806
- Sigstore integration time:
-
Permalink:
ametist-dev/logistic-docfill@0eff958509575f7c60c5731bc8c10990d2a46f71 -
Branch / Tag:
refs/tags/0.2.2 - Owner: https://github.com/ametist-dev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0eff958509575f7c60c5731bc8c10990d2a46f71 -
Trigger Event:
release
-
Statement type: