Пример #1
0
    def _create_or_get_output_col(self, col_index, attrib_col=None):
        """
        Найдем существующую колонку в результирующих данных
        Если не передали начальные данные, то колонка не создается,
        если не найдена,
        
        :param col_index: индекс колонки
        :type col_index: int
        :param attrib_col: атрибуты элемента колонки
        :type attrib_col: dict
        """
        # найдем интервал, в который попадаем искомый индекс
        col_index = ColumnHelper.column_to_number(col_index) + 1
        col_el = None
        for col in self.write_cols.getchildren():
            begin_col = int(col.attrib['min'])
            end_col = int(col.attrib['max'])
            if begin_col <= col_index <= end_col:
                col_el = col
                break

        if col_el is None:
            # если не нашли - создадим
            if attrib_col is None:
                return None
            attrib_col["min"] = str(col_index)
            attrib_col["max"] = str(col_index)
            col_el = SubElement(self.write_cols, 'col', attrib=attrib_col)
        return col_el
Пример #2
0
    def _create_or_get_output_col(self, col_index, attrib_col=None):
        """
        Найдем существующую колонку в результирующих данных
        Если не передали начальные данные, то колонка не создается,
        если не найдена,
        
        :param col_index: индекс колонки
        :type col_index: int
        :param attrib_col: атрибуты элемента колонки
        :type attrib_col: dict
        """
        # найдем интервал, в который попадаем искомый индекс
        col_index = ColumnHelper.column_to_number(col_index) + 1
        col_el = None
        for col in self.write_cols.getchildren():
            begin_col = int(col.attrib['min'])
            end_col = int(col.attrib['max'])
            if begin_col <= col_index <= end_col:
                col_el = col
                break

        if col_el is None:
            # если не нашли - создадим
            if attrib_col is None:
                return None
            attrib_col["min"] = str(col_index)
            attrib_col["max"] = str(col_index)
            col_el = SubElement(self.write_cols, 'col', attrib=attrib_col)
        return col_el
Пример #3
0
    def _calculate_merge_column(self, column):

        column_number = ColumnHelper.column_to_number(column)

        first_section_column = ColumnHelper.number_to_column(column_number - self.section.get_width())
        last_section_column = ColumnHelper.number_to_column(column_number - 1)

        return first_section_column, last_section_column
Пример #4
0
    def _calculate_merge_column(self, column):

        column_number = ColumnHelper.column_to_number(column)

        first_section_column = ColumnHelper.number_to_column(
            column_number - self.section.get_width())
        last_section_column = ColumnHelper.number_to_column(column_number - 1)

        return first_section_column, last_section_column
Пример #5
0
    def calculate_indent(self, column, w):
        """
        Получение колонки на `w` раньше чем `column`

        :param column: строковое представление колонки
        :type column: str
        :param w: смещение
        :type w: int
        """
        return ColumnHelper.number_to_column(
            ColumnHelper.column_to_number(column) - w)
Пример #6
0
    def calculate_indent(self, column, w):
        """
        Получение колонки на `w` раньше чем `column`

        :param column: строковое представление колонки
        :type column: str
        :param w: смещение
        :type w: int
        """
        return ColumnHelper.number_to_column(
            ColumnHelper.column_to_number(column) - w)
Пример #7
0
    def set_pagebreaks(self, begin, end, start_cell):
        """
        Копирование разделителей страниц
        :param begin: начало секции, пример ('A', 1)
        :type begin: 2-tuple
        :param end: конец секции, пример ('E', 6)
        :type end: 2-tuple
        :param start_cell: ячейка с которой выводилась секция
        :type start_cell: 2-tuple
        """
        # определим интервал столбцов и колонок из которых надо взять разделители
        end = self.get_cell_end(end)
        begin_col = ColumnHelper.column_to_number(begin[0])
        end_col = ColumnHelper.column_to_number(end[0])
        begin_row = int(begin[1])
        end_row = int(end[1])
        # определим интервал столбцов и колонок, начинаемый с начальной ячейки, куда надо добавить разделители
        new_begin_col = ColumnHelper.column_to_number(start_cell[0])
        new_begin_row = int(start_cell[1])
        # вытащим смещение индексов столбцов у которых есть разделители и которые попали в этот интервал
        colbreaks = []
        if self.read_colbreaks is not None:
            for elem in self.read_colbreaks.getchildren():
                col_index = int(elem.attrib['id'])
                if begin_col <= col_index - 1 <= end_col:
                    colbreaks.append(col_index - begin_col + new_begin_col)

        self._set_colpagebreaks(colbreaks)

        # вытащим смещение индексов строк у которых есть разделители и которые попали в этот интервал
        rowbreaks = []
        if self.read_rowbreaks is not None:
            for elem in self.read_rowbreaks.getchildren():
                row_index = int(elem.attrib['id'])
                if begin_row <= row_index <= end_row:
                    rowbreaks.append(row_index - begin_row + new_begin_row)

        self._set_rowpagebreaks(rowbreaks)
Пример #8
0
    def set_pagebreaks(self, begin, end, start_cell):
        """
        Копирование разделителей страниц
        :param begin: начало секции, пример ('A', 1)
        :type begin: 2-tuple
        :param end: конец секции, пример ('E', 6)
        :type end: 2-tuple
        :param start_cell: ячейка с которой выводилась секция
        :type start_cell: 2-tuple
        """
        # определим интервал столбцов и колонок из которых надо взять разделители
        end = self.get_cell_end(end)
        begin_col = ColumnHelper.column_to_number(begin[0])
        end_col = ColumnHelper.column_to_number(end[0])
        begin_row = int(begin[1])
        end_row = int(end[1])
        # определим интервал столбцов и колонок, начинаемый с начальной ячейки, куда надо добавить разделители
        new_begin_col = ColumnHelper.column_to_number(start_cell[0])
        new_begin_row = int(start_cell[1])
        # вытащим смещение индексов столбцов у которых есть разделители и которые попали в этот интервал
        colbreaks = []
        if self.read_colbreaks is not None:
            for elem in self.read_colbreaks.getchildren():
                col_index = int(elem.attrib['id'])
                if begin_col <= col_index - 1 <= end_col:
                    colbreaks.append(col_index - begin_col + new_begin_col)

        self._set_colpagebreaks(colbreaks)

        # вытащим смещение индексов строк у которых есть разделители и которые попали в этот интервал
        rowbreaks = []
        if self.read_rowbreaks is not None:
            for elem in self.read_rowbreaks.getchildren():
                row_index = int(elem.attrib['id'])
                if begin_row <= row_index <= end_row:
                    rowbreaks.append(row_index - begin_row + new_begin_row)

        self._set_rowpagebreaks(rowbreaks)
Пример #9
0
    def _set_new_column_width(self, col_index, src_col, dst_col):
        """
        Установка новой ширины колонки
        Особенность в том, что нужно разбивать интервалы, если потребуется
        
        :param col_index: индекс колонки
        :type col_index: int
        :param src_col: элемент исходной колонки
        :type src_col: lxml.etree.Element
        :param dst_col: элемент выходной колонки
        :type dst_col: lxml.etree.Element
        """
        col_index = ColumnHelper.column_to_number(col_index) + 1
        # если ширина колонок отличается и колонка-приемник является интервалом,
        # то нужно разбить интервал на части с разной шириной колонок
        if dst_col.attrib["width"] != src_col.attrib["width"]:
            begin_col = int(dst_col.attrib['min'])
            end_col = int(dst_col.attrib['max'])
            # если задано интервалом, то будем разбивать
            if end_col - begin_col > 0:
                if col_index > begin_col:
                    # предыдущий интервал: max = col-1
                    prev_attrib_col = dict(dst_col.items())
                    prev_attrib_col['max'] = str(col_index - 1)
                    prev_col_el = SubElement(self.write_cols,
                                             'col',
                                             attrib=prev_attrib_col)

                if col_index < end_col:
                    # следующий интервал: min = col+1
                    next_attrib_col = dict(dst_col.items())
                    next_attrib_col["min"] = str(col_index + 1)
                    next_col_el = SubElement(self.write_cols,
                                             'col',
                                             attrib=next_attrib_col)

                # интервал для текущей колонки: min = max = col
                dst_col.attrib["min"] = str(col_index)
                dst_col.attrib["max"] = str(col_index)

            dst_col.attrib["width"] = src_col.attrib["width"]
Пример #10
0
    def _set_new_column_width(self, col_index, src_col, dst_col):
        """
        Установка новой ширины колонки
        Особенность в том, что нужно разбивать интервалы, если потребуется
        
        :param col_index: индекс колонки
        :type col_index: int
        :param src_col: элемент исходной колонки
        :type src_col: lxml.etree.Element
        :param dst_col: элемент выходной колонки
        :type dst_col: lxml.etree.Element
        """
        col_index = ColumnHelper.column_to_number(col_index) + 1
        # если ширина колонок отличается и колонка-приемник является интервалом,
        # то нужно разбить интервал на части с разной шириной колонок
        if dst_col.attrib["width"] != src_col.attrib["width"]:
            begin_col = int(dst_col.attrib['min'])
            end_col = int(dst_col.attrib['max'])
            # если задано интервалом, то будем разбивать
            if end_col - begin_col > 0:
                if col_index > begin_col:
                    # предыдущий интервал: max = col-1
                    prev_attrib_col = dict(dst_col.items())
                    prev_attrib_col['max'] = str(col_index - 1)
                    prev_col_el = SubElement(self.write_cols, 'col', attrib=prev_attrib_col)

                if col_index < end_col:
                    # следующий интервал: min = col+1
                    next_attrib_col = dict(dst_col.items())
                    next_attrib_col["min"] = str(col_index + 1)
                    next_col_el = SubElement(self.write_cols, 'col', attrib=next_attrib_col)

                # интервал для текущей колонки: min = max = col
                dst_col.attrib["min"] = str(col_index)
                dst_col.attrib["max"] = str(col_index)

            dst_col.attrib["width"] = src_col.attrib["width"]