def format_paste_format(self): """Pastes cell formats Pasting starts at cursor or at top left bbox corner """ clipboard = QApplication.clipboard() mime_data = clipboard.mimeData() grid = self.main_window.grid model = grid.model row, column, table = grid.current if "application/x-pyspread-cell-attributes" not in mime_data.formats(): return cas_data = mime_data.data("application/x-pyspread-cell-attributes") cas_data_str = str(cas_data, encoding='utf-8') cas = literal_eval(cas_data_str) assert isinstance(cas, list) tabu_attrs = "merge_area", "renderer", "frozen" description_tpl = "Paste format for selections {}" description = description_tpl.format([ca[0] for ca in cas]) for selection_params, attrs in cas: if not any(tabu_attr in attrs for tabu_attr in tabu_attrs): selection = Selection(*selection_params) shifted_selection = selection.shifted(row, column) new_cell_attribute = shifted_selection, table, attrs selected_idx = [] for key in shifted_selection.cell_generator(model.shape): selected_idx.append(model.index(*key)) command = CommandSetCellFormat(new_cell_attribute, model, grid.currentIndex(), selected_idx, description) self.main_window.undo_stack.push(command)
def _xls2attributes(self, worksheet, tab): """Updates attributes in code_array""" # Merged cells for top, bottom, left, right in worksheet.merged_cells: attrs = {"merge_area": (top, left, bottom - 1, right - 1)} selection = Selection([(top, left)], [(bottom - 1, right - 1)], [], [], []) self.code_array.cell_attributes.append((selection, tab, attrs)) # Which cell comprise which format ids xf2cell = dict((xfid, []) for xfid in xrange(self.workbook.xfcount)) rows, cols = worksheet.nrows, worksheet.ncols for row, col in product(xrange(rows), xrange(cols)): xfid = worksheet.cell_xf_index(row, col) xf2cell[xfid].append((row, col)) for xfid, xf in enumerate(self.workbook.xf_list): selection = Selection([], [], [], [], xf2cell[xfid]) selection_above = selection.shifted(-1, 0) selection_left = selection.shifted(0, -1) attributes = {} # Alignment xfalign2justification = { 0: "left", 1: "left", 2: "center", 3: "right", 4: "left", 5: "left", 6: "center", 7: "left", } xfalign2vertical_align = { 0: "top", 1: "middle", 2: "bottom", 3: "middle", 4: "middle", } def xfrotation2angle(xfrotation): """Returns angle from xlrotatation""" # angle is counterclockwise if 0 <= xfrotation <= 90: return xfrotation elif 90 < xfrotation <= 180: return -(xfrotation - 90) return 0 try: attributes["justification"] = \ xfalign2justification[xf.alignment.hor_align] attributes["vertical_align"] = \ xfalign2vertical_align[xf.alignment.vert_align] attributes["angle"] = \ xfrotation2angle(xf.alignment.rotation) except AttributeError: pass # Background if xf.background.fill_pattern == 1: color_idx = xf.background.pattern_colour_index color = self.idx2colour(color_idx) attributes["bgcolor"] = color.GetRGB() # Border border_line_style2width = { 0: 1, 1: 3, 2: 5, 5: 7, } bottom_color_idx = xf.border.bottom_colour_index if self.workbook.colour_map[bottom_color_idx] is not None: bottom_color = self.idx2colour(bottom_color_idx) attributes["bordercolor_bottom"] = bottom_color.GetRGB() right_color_idx = xf.border.right_colour_index if self.workbook.colour_map[right_color_idx] is not None: right_color = self.idx2colour(right_color_idx) attributes["bordercolor_right"] = right_color.GetRGB() bottom_width = border_line_style2width[xf.border.bottom_line_style] attributes["borderwidth_bottom"] = bottom_width right_width = border_line_style2width[xf.border.right_line_style] attributes["borderwidth_right"] = right_width # Font font = self.workbook.font_list[xf.font_index] attributes["textfont"] = font.name attributes["pointsize"] = font.height / 20.0 fontweight = wx.BOLD if font.weight == 700 else wx.NORMAL attributes["fontweight"] = fontweight if font.italic: attributes["fontstyle"] = wx.ITALIC if self.workbook.colour_map[font.colour_index] is not None: attributes["textcolor"] = \ self.idx2colour(font.colour_index).GetRGB() if font.underline_type: attributes["underline"] = True if font.struck_out: attributes["strikethrough"] = True # Handle cells above for top borders attributes_above = {} top_width = border_line_style2width[xf.border.top_line_style] if top_width != 1: attributes_above["borderwidth_bottom"] = top_width top_color_idx = xf.border.top_colour_index if self.workbook.colour_map[top_color_idx] is not None: top_color = self.idx2colour(top_color_idx) attributes_above["bordercolor_bottom"] = top_color.GetRGB() # Handle cells above for left borders attributes_left = {} left_width = border_line_style2width[xf.border.left_line_style] if left_width != 1: attributes_left["borderwidth_right"] = left_width left_color_idx = xf.border.left_colour_index if self.workbook.colour_map[left_color_idx] is not None: left_color = self.idx2colour(left_color_idx) attributes_above["bordercolor_right"] = left_color.GetRGB() if attributes_above: self._cell_attribute_append(selection_above, tab, attributes_above) if attributes_left: self._cell_attribute_append(selection_left, tab, attributes_left) if attributes: self._cell_attribute_append(selection, tab, attributes)
def _xls2attributes(self, worksheet, tab): """Updates attributes in code_array""" # Merged cells for top, bottom, left, right in worksheet.merged_cells: attrs = {"merge_area": (top, left, bottom - 1, right - 1)} selection = Selection([(top, left)], [(bottom - 1, right - 1)], [], [], []) self.code_array.cell_attributes.append((selection, tab, attrs)) # Which cell comprise which format ids xf2cell = dict((xfid, []) for xfid in xrange(self.workbook.xfcount)) rows, cols = worksheet.nrows, worksheet.ncols for row, col in product(xrange(rows), xrange(cols)): xfid = worksheet.cell_xf_index(row, col) xf2cell[xfid].append((row, col)) for xfid, xf in enumerate(self.workbook.xf_list): selection = Selection([], [], [], [], xf2cell[xfid]) selection_above = selection.shifted(-1, 0) selection_left = selection.shifted(0, -1) attributes = {} # Alignment xfalign2justification = { 0: "left", 1: "left", 2: "center", 3: "right", 4: "left", 5: "left", 6: "center", 7: "left", } xfalign2vertical_align = { 0: "top", 1: "middle", 2: "bottom", 3: "middle", 4: "middle", } def xfrotation2angle(xfrotation): """Returns angle from xlrotatation""" # angle is counterclockwise if 0 <= xfrotation <= 90: return xfrotation elif 90 < xfrotation <= 180: return - (xfrotation - 90) return 0 try: attributes["justification"] = \ xfalign2justification[xf.alignment.hor_align] attributes["vertical_align"] = \ xfalign2vertical_align[xf.alignment.vert_align] attributes["angle"] = \ xfrotation2angle(xf.alignment.rotation) except AttributeError: pass # Background if xf.background.fill_pattern == 1: color_idx = xf.background.pattern_colour_index color = self.idx2colour(color_idx) attributes["bgcolor"] = color.GetRGB() # Border __border_line_style2width = { 0: 1, 1: 1, 2: 4, 5: 7, } def constant_factory(value): return repeat(value).next border_line_style2width = defaultdict(constant_factory(1)) border_line_style2width.update(__border_line_style2width) bottom_color_idx = xf.border.bottom_colour_index if bottom_color_idx in self.workbook.colour_map and \ self.workbook.colour_map[bottom_color_idx] is not None: bottom_color = self.idx2colour(bottom_color_idx) attributes["bordercolor_bottom"] = bottom_color.GetRGB() right_color_idx = xf.border.right_colour_index if right_color_idx in self.workbook.colour_map and \ self.workbook.colour_map[right_color_idx] is not None: right_color = self.idx2colour(right_color_idx) attributes["bordercolor_right"] = right_color.GetRGB() bottom_width = border_line_style2width[xf.border.bottom_line_style] attributes["borderwidth_bottom"] = bottom_width right_width = border_line_style2width[xf.border.right_line_style] attributes["borderwidth_right"] = right_width # Font font = self.workbook.font_list[xf.font_index] attributes["textfont"] = font.name attributes["pointsize"] = font.height / 20.0 fontweight = wx.BOLD if font.weight == 700 else wx.NORMAL attributes["fontweight"] = fontweight if font.italic: attributes["fontstyle"] = wx.ITALIC if font.colour_index in self.workbook.colour_map and \ self.workbook.colour_map[font.colour_index] is not None: attributes["textcolor"] = \ self.idx2colour(font.colour_index).GetRGB() if font.underline_type: attributes["underline"] = True if font.struck_out: attributes["strikethrough"] = True # Handle top cells' top borders attributes_above = {} top_width = border_line_style2width[xf.border.top_line_style] if top_width != 1: attributes_above["borderwidth_bottom"] = top_width top_color_idx = xf.border.top_colour_index if top_color_idx in self.workbook.colour_map and \ self.workbook.colour_map[top_color_idx] is not None: top_color = self.idx2colour(top_color_idx) attributes_above["bordercolor_bottom"] = top_color.GetRGB() # Handle leftmost cells' left borders attributes_left = {} left_width = border_line_style2width[xf.border.left_line_style] if left_width != 1: attributes_left["borderwidth_right"] = left_width left_color_idx = xf.border.left_colour_index if left_color_idx in self.workbook.colour_map and \ self.workbook.colour_map[left_color_idx] is not None: left_color = self.idx2colour(left_color_idx) attributes_above["bordercolor_right"] = left_color.GetRGB() if attributes_above: self._cell_attribute_append(selection_above, tab, attributes_above) if attributes_left: self._cell_attribute_append(selection_left, tab, attributes_left) if attributes: self._cell_attribute_append(selection, tab, attributes)