Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
    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))
Exemple #4
0
    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)
Exemple #6
0
 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
Exemple #7
0
 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