import re import openpyxl from typing import Union, IO class XlsxReplacement: def __init__(self, file: Union[str, IO]): self.file = file self.xlsx = openpyxl.load_workbook(file, read_only=True, data_only=True) self.re_replace = re.compile('\[\[(?:(\w+):)?([a-zA-Z]+\d+)\]\]') self.errors = [] def find_replace_text(self, text: str): if '[[' not in text: return text return self.re_replace.sub(self._regex_replacement, text) def _regex_replacement(self, match): sheet, cell = match.groups() if sheet is None: sheet = self.xlsx.active else: try: sheet = self.xlsx[sheet] except IndexError: self.errors.append('Unknown sheet {sheet}'.format(sheet=sheet)) return 'ERR Unknown sheet' try: return str(sheet[cell].value) except (IndexError, ValueError): self.errors.append('Unknown cell {sheet}:{cell}'.format(sheet=sheet, cell=cell)) return 'ERR Unknown cell'