Как изменить регистр букв при слиянии документов с помощью библиотек docxtpl и openpyxl?

Я разрабатываю шаблон условного документа и сталкиваюсь с проблемой, связанной с разным регистром строк в таблице с данными. В зависимости от их расположения в тексте, они могут быть написаны полностью заглавными, с заглавной первой буквой или полностью строчными. Например: 

Образец данных в Excel выглядит следующим образом: 

Код скрипта: 

Если в Word применить стиль или формат регистра (Uppercase/Sentence case), то тег изменяется в соответствии с новым форматом, что приводит к его пропуску при обработке. В настоящее время я решил эту задачу с помощью создания дубликатов тегов в разных регистрах, добавляя строки в Excel с тегами f_name, F_name, F_NAME и соответствующими данными. Однако этот подход неудобен, так как я хотел бы также внедрить падежи, такие как f_name_p, f_name_r и т.д., чтобы избежать необходимости подбора формулировок исключительно под именительный падеж.

Существует ли более автоматизированный способ применения регистра?
  • 26 сентября 2024 г. 10:13
Ответы на вопрос 1
Да, можно автоматизировать изменение регистра строк при заполнении шаблона документа с помощью библиотек 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. Вы можете добавлять новые форматы по мере необходимости и использовать их в шаблонах документов.
Похожие вопросы