使用openpyxl操作Excel

from openpyxl import Workbook
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment, numbers
from openpyxl.utils.cell import coordinate_to_tuple
from openpyxl.utils import get_column_letter
import numpy as np

def tuple_to_coordinate(row, column):
    col_letter = get_column_letter(column)
    return '{}{}'.format(col_letter, row)

def set_range_style(ws, cell_range, border=Border(), fill=None, font=None, alignment=None, number_format=None, merged=True):
    """
    Apply styles to a range of cells as if they were a single cell.

    :param ws:  Excel worksheet instance
    :param range: An excel range to style (e.g. A1:F20)
    :param border: An openpyxl Border
    :param fill: An openpyxl PatternFill or GradientFill
    :param font: An openpyxl Font object
    :param alignment: An openpyxl Alignment object
    :param number_format: An openpyxl Number_format object
    :param merged: Whether merge cells

    """

    top = Border(top=border.top)
    left = Border(left=border.left)
    right = Border(right=border.right)
    bottom = Border(bottom=border.bottom)
    # default border
    inline = Side(border_style="thin", color="BFBFBF")
    in_border = Border(right=inline , bottom=inline, left=inline, top=inline)

    if merged:
        ws.merge_cells(cell_range)

    rows = ws[cell_range]

    for row in rows:
        for c in row:
            c.border = in_border
            if fill:
                c.fill = fill
            if font:
                c.font = font
            if alignment:
                c.alignment = alignment
            if number_format:
                c.number_format = number_format

    for c in rows[0]:
        new_border = Border(left=c.border.left, top=top.top, right=c.border.right, bottom=c.border.bottom)
        c.border = new_border
    for c in rows[-1]:
        new_border = Border(left=c.border.left, top=c.border.top, right=c.border.right, bottom=bottom.bottom)
        c.border = new_border
    for row in rows:
        l = row[0]
        r = row[-1]
        new_border = Border(left=left.left, top=l.border.top, right=l.border.right, bottom=l.border.bottom)
        l.border = new_border
        new_border = Border(left=r.border.left, top=r.border.top, right=right.right, bottom=r.border.bottom)
        r.border = new_border


def set_header(ws, cell_range, name=None, merged=False):
    if name:
        first_cell = ws[cell_range.split(":")[0]]
        first_cell.value = name
    thin = Side(border_style="thin", color="000000")
    border = Border(top=thin, left=thin, right=thin, bottom=thin)
    fill = PatternFill("solid", fgColor="BCD6EE")
    al = Alignment(horizontal="center", vertical="center")
    font = Font(name=u'微软雅黑', size=11)
    set_range_style(ws, cell_range, border=border, fill=fill, font=font, alignment=al, merged=merged)

def set_title(ws, cell, title):
    ws[cell].font = Font(name=u'微软雅黑', bold=True, size=11)
    ws[cell].value = title
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容