def prepare_merge(self, begin_new_merge, end_new_merge): """ Если в документе имеются объединенные ячейки и мы добавляем свою область перес. данную, то необходимо прежде всего удалить, то что уже имеется. :param begin_new_merge: начало диапазона :type begin_new_merge: 2-tuple :param end_new_merge: конец диапазона :type end_new_merge: 2-tuple """ begin_new_column, begin_new_row = get_addr_cell(begin_new_merge) end_new_column, end_new_row = get_addr_cell(end_new_merge) # Все смерженные ячейки на листе merge_cells = self._write_xml.xpath('.//mergeCell') for merge_cell in merge_cells: ref_attr = merge_cell.attrib.get('ref') # D1:D3 Например begin_old_merge, end_old_merge = ref_attr.split(':') # D1, D3 begin_old_column, begin_old_row = get_addr_cell(begin_old_merge) end_old_column, end_old_row = get_addr_cell(end_old_merge) if not (begin_new_column > end_old_column or end_new_column < begin_old_column or begin_new_row > end_old_row or end_new_row < begin_old_row): self.write_merge_cell.remove(merge_cell)
def set_merge_cells(self, section_begin, section_end, start_cell): """ Объединение ячеек :param section_begin: начало секции :type section_begin: 2-tuple :param section_end: конец секции :type section_end: 2-tuple :param start_cell: стартовая ячейка :type start_cell: 2-tuple """ def cell_dimensions(section, merge_cell, start_cell): """ Получение координаты ячейки после смещения из-за объединения ячеек :param section: начало секции :type section: 2-tuple :param merge_cell: начало объединенной ячейки :type merge_cell: 2-tuple :param start_cell: стартовая ячейка :type start_cell: 2-tuple """ section_begin_col, section_begin_row = section start_col, start_row = start_cell begin_col, begin_row = merge_cell new_begin_row = start_row + begin_row - section_begin_row new_begin_col = ColumnHelper.add( start_col, ColumnHelper.difference(begin_col, section_begin_col)) return new_begin_col + str(new_begin_row) range_rows, range_cols = self._range(section_begin, section_end) for begin, end in self._get_merge_cells(): begin_col, begin_row = get_addr_cell(begin) end_col, end_row = get_addr_cell(end) # Если объединяемый диапазон лежит внутри секции if (begin_col in range_cols and end_col in range_cols and begin_row in range_rows and end_row in range_rows): begin_merge = cell_dimensions(section_begin, (begin_col, begin_row), start_cell) end_merge = cell_dimensions(section_begin, (end_col, end_row), start_cell) attrib = {'ref': ':'.join((begin_merge, end_merge))} SubElement(self.write_merge_cell, 'mergeCell', attrib) if self.write_merge_cell is not None: count_merge_cells = len(self.write_merge_cell) self.write_merge_cell.set('count', str(count_merge_cells))
def set_merge_cells(self, section_begin, section_end, start_cell): """ Объединение ячеек :param section_begin: начало секции :type section_begin: 2-tuple :param section_end: конец секции :type section_end: 2-tuple :param start_cell: стартовая ячейка :type start_cell: 2-tuple """ def cell_dimensions(section, merge_cell, start_cell): """ Получение координаты ячейки после смещения из-за объединения ячеек :param section: начало секции :type section: 2-tuple :param merge_cell: начало объединенной ячейки :type merge_cell: 2-tuple :param start_cell: стартовая ячейка :type start_cell: 2-tuple """ section_begin_col, section_begin_row = section start_col, start_row = start_cell begin_col, begin_row = merge_cell new_begin_row = start_row + begin_row - section_begin_row new_begin_col = ColumnHelper.add(start_col, ColumnHelper.difference(begin_col, section_begin_col)) return new_begin_col + str(new_begin_row) range_rows, range_cols = self._range(section_begin, section_end) for begin, end in self._get_merge_cells(): begin_col, begin_row = get_addr_cell(begin) end_col, end_row = get_addr_cell(end) # Если объединяемый диапазон лежит внутри секции if (begin_col in range_cols and end_col in range_cols and begin_row in range_rows and end_row in range_rows): begin_merge = cell_dimensions(section_begin, (begin_col, begin_row), start_cell) end_merge = cell_dimensions(section_begin, (end_col, end_row), start_cell) attrib = {'ref': ':'.join((begin_merge, end_merge))} SubElement(self.write_merge_cell, 'mergeCell', attrib) if self.write_merge_cell is not None: count_merge_cells = len(self.write_merge_cell) self.write_merge_cell.set('count', str(count_merge_cells))
def _add_section(self, values): text = values[0] cell = values[1] values = self.section_pattern.findall(text) addr = get_addr_cell(cell) for value in values: section_name = self._get_name_section(value) # Такой объект должен быть if value.startswith('-'): # Такой элемент уже должен быть if not self.sections.get(section_name): raise SectionException('Start section "%s" not found' % section_name) section = self.sections[section_name] # Второго конца быть не может if section.end: raise SectionException('For section "%s" more than one ending tag' % section_name) section.end = addr else: # Второго начала у секции быть не может if self.sections.get(section_name): raise SectionException('For section "%s" more than one beging tag' % section_name) self.sections[section_name] = Section(self._sheet_data, section_name, begin=addr)
def get_cell_end(self, cell_addr): """ Получение (правого нижнего) конца ячейки :param cell_addr: адрес ячейки :type cell_addr: 2-tuple """ cell_end = cell_addr # Если указанный адрес пападает в объединенную ячейку, то адресс конца ячейки указывается как конец # объединенной ячейки for begin_merge, end_merge in self._get_merge_cells(): begin_addr = get_addr_cell(begin_merge) end_addr = get_addr_cell(end_merge) if self._addr_in_range(cell_addr, begin_addr, end_addr): cell_end = end_addr break return cell_end