Да, можно автоматизировать изменение регистра строк при заполнении шаблона документа с помощью библиотек docxtpl и openpyxl, избегая необходимость создания дубликатов тегов в разных регистрах. Для этого можно написать функцию, которая будет обрабатывать строки перед заменой тегов. Вот пошаговое решение:
### 1. Создайте функцию для изменения регистра
Эта функция будет принимать строку и тип желаемого регистра (например, заглавные буквы, строчные буквы и т.д.).
```python
def format_string(value, case_type):
if case_type == 'uppercase':
return value.upper()
elif case_type == 'sentence_case':
return value.capitalize()
elif case_type == 'lowercase':
return value.lower()
else:
return value
```
### 2. Извлеките теги и соответствующие данные из Excel
Используйте openpyxl для извлечения данных из вашего Excel файла. Затем, при их считывании, примените нужный формат к значениям.
```python
import openpyxl
def load_data_from_excel(file_path):
wb = openpyxl.load_workbook(file_path)
sheet = wb.active
data = {}
# Предположим, что теги находятся в первой колонке (A), а значения во второй (B)
for row in sheet.iter_rows(min_row=2, values_only=True):
tag = row[0]
value = row[1]
# Применяем форматирование в зависимости от требований
data[tag] = {
"uppercase": format_string(value, 'uppercase'),
"sentence_case": format_string(value, 'sentence_case'),
"lowercase": format_string(value, 'lowercase'),
# Добавьте другие форматы по мере необходимости
}
return data
```
### 3. Используйте данные в docxtpl
Теперь, когда вы имеете отформатированные данные, вы можете использовать их для заполнения документа с помощью docxtpl. Передавайте в шаблон нужный формат в зависимости от требований.
```python
from docxtpl import DocxTemplate
def fill_template(template_path, context):
doc = DocxTemplate(template_path)
# Например, используем флаг для определения нужного типа регистра
context['name_upper'] = context['f_name']['uppercase']
context['name_sentence'] = context['f_name']['sentence_case']
# Заполнение документа
doc.render(context)
doc.save('filled_document.docx')
# Основной блок
if __name__ == '__main__':
file_path = 'data.xlsx'
template_path = 'template.docx'
data = load_data_from_excel(file_path)
# Создайте контекст, который будет передан в шаблон
context = {
'f_name': data.get('f_name'), # допустим, это ваш тег
# добавьте другие теги по необходимости
}
fill_template(template_path, context)
```
### Заключение
Такой подход позволяет гибко управлять форматированием строк без необходимости их дублирования в Excel. Вы можете добавлять новые форматы по мере необходимости и использовать их в шаблонах документов.