Beispiel #1
0
def write_to_excel2_2(datas, file_full_name):
    workbook = openpyxl.Workbook(write_only=True)  # 默认无sheet sheet名从'Sheet'开始
    workbook.create_sheet()  # 创建名为'Sheet'的sheet
    for data in datas:
        worksheet = workbook.create_sheet()  # 创建名为'Sheet1'的sheet
        alignment_title = Alignment(horizontal='center')
        font_title = Font(bold=True, size=10)
        font_content = Font(size=9)
        keys = data[0].keys()
        row = []
        for key in keys:
            cell = WriteOnlyCell(worksheet,
                                 str(key) if key is not None else '')
            cell.font = font_title
            cell.alignment = alignment_title
            row.append(cell)
        worksheet.append(row)
        for js in data:
            row = []
            for key in keys:
                cell = WriteOnlyCell(
                    worksheet,
                    str(js[key]) if js[key] is not None else '')
                cell.font = font_content
                cell.alignment = alignment_title
                row.append(cell)
            worksheet.append(row)
    workbook.remove(workbook[workbook.sheetnames[0]])  # 删除名为'Sheet'的sheet
    workbook.save(file_full_name)
    log_util.log('file_util.write_to_excel', 'filename:%s' % (file_full_name))
Beispiel #2
0
    def __get_cell(self, string, color=None, style=None):
        """
        Helper method for log message. This method takes a string as well as color and style
        arguments to create a write-only cell.

        Args:
            string: a string object to be written to the cell's value field.
            color: a string object containing a color hex code "######"
            style: a string choosing 1 of 3 formatting options (ITALICS, BOLD, UNDERLINED)
        """
        if not MODULE_INSTALLED:
            return

        cell = WriteOnlyCell(self.worksheet, value=string)
        if color is not None:
            # pylint: disable=E0237
            cell.fill = PatternFill("solid", fgColor=color)
        # pylint: disable=E0237
        cell.font = Font(
            name=self.font_name,
            bold=(style == self.BOLD),
            italic=(style == self.ITALICS),
            underline=("single" if style == self.UNDERLINED else "none"),
        )
        # pylint: disable=E0237
        cell.alignment = self.__align
        return cell
Beispiel #3
0
    def _create_cell(self, worksheet: WriteOnlyWorksheet, data: dict) -> WriteOnlyCell:
        cell = WriteOnlyCell(ws=worksheet, value=data.get('value'))
        cell.column = data.get('column')
        cell.row = data.get('row')

        cell.font = self._create_cell_font(data.get('font'))
        cell.alignment = self._dict_to_object(data.get('alignment'), Alignment)
        cell.border = self._create_cell_borders(data.get('border'))
        return cell
Beispiel #4
0
    def get_cell(self,
                 value,
                 wrap=False,
                 shrink_to_fit=False,
                 bold=False,
                 unlock=False) -> WriteOnlyCell:
        cell = WriteOnlyCell(self.work_sheet, value=value)

        if bold:
            cell.font = self.font_regular_bold
        else:
            cell.font = self.font_regular

        if wrap:
            cell.alignment = self.alignment_wrap_text
        elif shrink_to_fit:
            cell.alignment = self.alignment_shrink_to_fit

        if unlock:
            cell.protection = Protection(locked=False)

        return cell
def write_dataframe_values_to_excel(worksheet, dataframe, start_row=None, wrap_text=True):
    """Write DataFrame values to Excel worksheet

    :param worksheet: target Excel worksheet
    :type worksheet: openpyxl.worksheet.worksheet.Worksheet
    :param dataframe: source dataframe
    :type dataframe: pandas.DataFrame
    :param start_row: start row index for writing data
    :param wrap_text: wrap text in cell
    :type wrap_text: boolean
    :return: None
    """
    # init styles for values
    border_side = Side(border_style='thin', color='000000')
    border_style = Border(left=border_side, right=border_side, top=border_side, bottom=border_side)
    alignment = Alignment(wrap_text=wrap_text)
    for row_idx, row_data in enumerate(dataframe.itertuples()):
        values_list = []
        row_cells = []
        for val in row_data:
            # value in dataframe may be a tuple in case of existing multiindex and it cannot be correctly written to
            # excel worksheet; so convert the tuple into a list and merge it with values list
            if isinstance(val, tuple):
                values_list += list(val)
            else:
                values_list.append(val)
        for col_idx, val in enumerate(values_list):
            cell = WriteOnlyCell(worksheet)
            cell.border = border_style
            if isinstance(val, Iterable) and not isinstance(val, string_types):
                cell.value = ', '.join([str(v) for v in val])
            else:
                cell.value = None if isnull(val) else val
            cell.alignment = alignment
            row_cells.append(cell)
        if start_row is None:
            worksheet.append(row_cells)
        else:
            worksheet.insert_rows(start_row, amount=1)
            for col_idx, cell in enumerate(row_cells):
                new_cell = worksheet.cell(row=start_row, column=col_idx+1)
                new_cell.value = cell.value
                new_cell.border = border_style
                new_cell.alignment = alignment
            start_row += 1
Beispiel #6
0
def members_excel_export():
    community = g.community
    attributes = [attrgetter(a) for a in MEMBERS_EXPORT_ATTRS]
    BaseModel = db.Model
    wb = openpyxl.Workbook()

    if wb.worksheets:
        wb.remove_sheet(wb.active)

    ws_title = _("%(community)s members", community=community.name)
    ws_title = ws_title.strip()
    if len(ws_title) > 31:
        # sheet title cannot exceed 31 char. max length
        ws_title = ws_title[:30] + "…"
    ws = wb.create_sheet(title=ws_title)
    row = 0
    cells = []

    cols_width = []
    for _col, label in enumerate(MEMBERS_EXPORT_HEADERS, 1):
        value = text_type(label)
        cell = WriteOnlyCell(ws, value=value)
        cell.font = HEADER_FONT
        cell.alignment = HEADER_ALIGN
        cells.append(cell)
        cols_width.append(len(value) + 1)

    ws.append(cells)

    for membership_info in _members_query().all():
        row += 1
        cells = []
        for col, getter in enumerate(attributes):
            value = None
            try:
                value = getter(membership_info)
            except AttributeError:
                pass

            if isinstance(value, (BaseModel, Role)):
                value = text_type(value)

            cell = WriteOnlyCell(ws, value=value)
            cells.append(value)

            # estimate width
            value = text_type(cell.value)
            width = max(len(l) for l in value.split("\n")) + 1
            cols_width[col] = max(width, cols_width[col])

        ws.append(cells)

    # adjust columns width
    MIN_WIDTH = 3
    MAX_WIDTH = openpyxl.utils.units.BASE_COL_WIDTH * 4

    for idx, width in enumerate(cols_width, 1):
        letter = openpyxl.utils.get_column_letter(idx)
        width = min(max(width, MIN_WIDTH), MAX_WIDTH)
        ws.column_dimensions[letter].width = width

    fd = BytesIO()
    wb.save(fd)
    fd.seek(0)

    response = current_app.response_class(fd, mimetype=XLSX_MIME)

    filename = "{}-members-{}.xlsx".format(
        community.slug, strftime("%d:%m:%Y-%H:%M:%S", gmtime())
    )
    response.headers["content-disposition"] = 'attachment;filename="{}"'.format(
        filename
    )

    return response
Beispiel #7
0
def members_excel_export():
    community = g.community
    attributes = [attrgetter(a) for a in MEMBERS_EXPORT_ATTRS]
    BaseModel = db.Model
    wb = openpyxl.Workbook()

    if wb.worksheets:
        wb.remove_sheet(wb.active)

    ws_title = _("%(community)s members", community=community.name)
    ws_title = ws_title.strip()
    if len(ws_title) > 31:
        # sheet title cannot exceed 31 char. max length
        ws_title = ws_title[:30] + "…"
    ws = wb.create_sheet(title=ws_title)
    row = 0
    cells = []

    cols_width = []
    for _col, label in enumerate(MEMBERS_EXPORT_HEADERS, 1):
        value = str(label)
        cell = WriteOnlyCell(ws, value=value)
        cell.font = HEADER_FONT
        cell.alignment = HEADER_ALIGN
        cells.append(cell)
        cols_width.append(len(value) + 1)

    ws.append(cells)

    for membership_info in _members_query().all():
        row += 1
        cells = []
        for col, getter in enumerate(attributes):
            value = None
            try:
                value = getter(membership_info)
            except AttributeError:
                pass

            if isinstance(value, (BaseModel, Role)):
                value = str(value)

            cell = WriteOnlyCell(ws, value=value)
            cells.append(value)

            # estimate width
            value = str(cell.value)
            width = max(len(l) for l in value.split("\n")) + 1
            cols_width[col] = max(width, cols_width[col])

        ws.append(cells)

    # adjust columns width
    MIN_WIDTH = 3
    MAX_WIDTH = openpyxl.utils.units.BASE_COL_WIDTH * 4

    for idx, width in enumerate(cols_width, 1):
        letter = openpyxl.utils.get_column_letter(idx)
        width = min(max(width, MIN_WIDTH), MAX_WIDTH)
        ws.column_dimensions[letter].width = width

    fd = BytesIO()
    wb.save(fd)
    fd.seek(0)

    response = current_app.response_class(fd, mimetype=XLSX_MIME)

    filename = "{}-members-{}.xlsx".format(
        community.slug, strftime("%d:%m:%Y-%H:%M:%S", gmtime())
    )
    response.headers["content-disposition"] = 'attachment;filename="{}"'.format(
        filename
    )

    return response
Beispiel #8
0
 def cell(val):
     cell = WriteOnlyCell(ws, value=val)
     cell.font = Font(name='Calibri', size=FONT_SIZE)
     cell.alignment = Alignment(vertical='center')
     return cell