def set_columns_width(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) cols = list(ColumnHelper.get_range(begin[0], end[0])) # определим интервал столбцов, начинаемый со столбца начальной ячейки, куда надо прописать ширину end_col = ColumnHelper.add(start_cell[0], ColumnHelper.difference(end[0], begin[0])) new_cols = list(ColumnHelper.get_range(start_cell[0], end_col)) # запишем ширину столбцов в интервал for index, src_col in enumerate(cols): dst_col = new_cols[index] src_col_el = self._create_or_get_output_col(src_col) # если нет исходной колонки, то не надо копировать if not src_col_el is None: # копируем данные attrib_col = dict(src_col_el.items()) dst_col_el = self._create_or_get_output_col( dst_col, attrib_col) # записываем в новую колонку self._set_new_column_width(dst_col, src_col_el, dst_col_el)
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)
def get_width(self): u""" Получение ширины секции """ begin_col, begin_row = self.begin end_col, end_row = self.sheet_data.get_cell_end(self.end) return ColumnHelper.difference(end_col, begin_col) + 1
def get_next_column(self, current_col, end_col, begin_col): """ Получение следующей колонки :param current_col: текущая колонка :type current_col: str :param end_col: конечная колонка :type end_col: str :param begin_col: начальная колонка :type begin_col: str """ return ColumnHelper.add( current_col, ColumnHelper.difference(end_col, begin_col) + 1)
def get_next_formula(self, row, column): """ Изменяем формулу и отдаём """ diff_row = row - self._last_row self._last_row = row diff_column = ColumnHelper.difference(column, self._last_column) self._last_column = column if not self.first: formula = self.formula for start, end in self._get_cell_coord(): # Подстрока с адресом ячейки cell_coord = self.formula[start:end] change_column, change_row = self._change_analyze(cell_coord) column_index = self._get_next_index(cell_coord, change_column, diff_column, is_column=True) row_index = self._get_next_index(cell_coord, change_row, diff_row, is_column=False) # Сцепляем индекс колонки и индекс ячейки new_cell_coord = ''.join([column_index, row_index]) # Заменяем подстроку в формуле formula = formula.replace(cell_coord, new_cell_coord) self.formula = formula else: self.first = False return self.formula
def flush(self, params, oriented=ISpreadsheetSection.LEFT_DOWN, used_formulas=None): """ Вывод. Имеется два механизма вывода. Для использования старого не передавать direction :param params: параметры замены :type params: dict :param oriented: направление ориентации :type oriented: ISpreadsheetSection :param used_formulas: использованные формулы :type used_formulas: dict """ assert isinstance(params, dict) assert oriented in (Section.VERTICAL, Section.HORIZONTAL, Section.LEFT_DOWN, Section.RIGHT_UP, Section.RIGHT, Section.HIERARCHICAL) # Тут смещение курсора, копирование данных из листа и общих строк # Генерация новых данных и новых общих строк cursor = self.sheet_data.cursor begin_col, begin_row = self.begin end_col, end_row = self.sheet_data.get_cell_end(self.end) current_col, current_row = CalculateNextCursorXLSX().get_next_cursor( cursor, (begin_col, begin_row), (end_col, end_row), oriented, self) self.sheet_data.last_section.row = (current_col, current_row) self.sheet_data.last_section.column = (ColumnHelper.add( current_col, ColumnHelper.difference( end_col, begin_col)), current_row + end_row - begin_row) self.sheet_data.flush(self.begin, self.end, (current_col, current_row), params, used_formulas)