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
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
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
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
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)
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)
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)
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)
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"]
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"]