zoukankan      html  css  js  c++  java
  • python模块之openpyxl扩展

    主要是对openpyxl扩展进行扩展,使用归类等

    1、 安装

    pip install openpyxl

    想要在文件中插入图片文件,需要安装pillow,安装文件:PIL-fork-1.1.7.win-amd64-py2.7.exe

    · font(字体类):字号、字体颜色、下划线等

    · fill(填充类):颜色等

    · border(边框类):设置单元格边框

    · alignment(位置类):对齐方式

    · number_format(格式类):数据格式

    · protection(保护类):写保护

    2、 创建一个excel 文件,并写入不同类的内容

    from openpyxl import Workbook
    
    wb = Workbook() #创建excel文件对象
    ws = wb.active   #获取第一个sheet,第一sheet一般为默认的活动sheet
    
    ws['A1'] = 12   #单元格写入数字和文字等信息
    ws['B1'] = "你好"+"world"
    ws.append([1,2,3])  #一次性写入多个单元格,按行写入
    
    import datetime
    import time
    ws['A3'] = datetime.datetime.now() #写入一个当前时间
    ws['A4'] = time.strftime('%Y{y}%m{m}%d{d} %H{h}%M{f}%S{s}').format(y='年',m='月',d='日',h='时',f='分',s='秒') #写入一个自定义的时间格式
    
    wb.save('sample.xlsx') #保存excel文件
    

    3、 创建sheet

    from openpyxl import Workbook
    
    wb = Workbook() #创建excel文件对象
    ws1 = wb.create_sheet("Mysheet")  #创建新的sheet
    ws1.title = "NewTitle"  #新sheet取名
    ws2 = wb.create_sheet("Mysheet",0) #创建新的sheet,并插入到第一个位置
    ws2.title = '你好'
    ws1.sheet_properties.tabColor = '1072BA'  #sheet标签颜色
    
    print(wb.get_sheet_by_name('你好')) #获取某个sheet对象
    print(wb["NewTitle"]) #获取某个sheet对象
    
    for sheet_name in wb.sheetnames: #获取sheet名称方法一
        print(sheet_name)
    for sheet in wb: #获取sheet名称方法二
        print(sheet.title)
    
    
    wb["NewTitle" ]["A1"]="zeke"  #对特定的sheet的单元格赋值
    source = wb["NewTitle" ]
    target = wb.copy_worksheet(source)  #复制sheet
    
    wb.save('sample.xlsx') #保存excel文件
    

    4、 操作单元格

    from openpyxl import Workbook
    
    wb = Workbook() #创建excel文件对象
    ws1 = wb.create_sheet("Mysheet")  #创建新的sheet
    
    ws1["A1"] = 3.1415926
    ws1["B2"] = "hello"
    d = ws1.cell(row=4, column=2, value=10) #相当于ws1["B4"]=10
    
    print(ws1["A1"].value)
    print(ws1["B2"].value)
    print(d.value)
    
    wb.save('sample.xlsx') #保存excel文件
    

    5、 操作批量的单元格

    无论ws.rows还是ws.iter_rows都是一个对象

    from openpyxl import Workbook
    
    wb = Workbook() #创建excel文件对象
    ws1 = wb.create_sheet("Mysheet")  #创建新的sheet
    
    ws1["A1"] = 3.1415926
    ws1["A2"] = "hello"
    ws1["A3"] = "你好"
    
    ws1.append([5,2,3])
    
    print(ws1["A"]) #操作单列:(<Cell 'Mysheet'.A1>, <Cell 'Mysheet'.A2>, <Cell 'Mysheet'.A3>, <Cell 'Mysheet'.A4>)
    for i in ws1["A"]:
        print(i.value)
    
    print(ws1["A:C"]) #操作多列,获取每一个值
    for column in ws1["A:C"]:
        for cell in column:
            print(cell.value)
    
    #无论ws.rows还是ws.iter_rows都是一个对象
    for row in ws1.iter_rows(min_row=1, min_col=1, max_col=3, max_row=3): #操作多列,获取每一个值
        for cell in row:
            print(cell.value)
    
    print(ws1.rows)  #获取所有行
    for row in ws1.rows:
        print(row)
    
    print(ws1.columns)  #获取所有列
    for column in ws1.columns:
        print(column)
    
    wb.save('sample.xlsx') #保存excel文件
    

    使用百分数

    from openpyxl import Workbook
    from openpyxl import load_workbook
    
    wb = load_workbook('sample.xlsx') #创建excel文件对象
    # wb.guess_types = True  #结果会打印小数
    wb.guess_types = False  #结果会打印百分数
    ws = wb.active
    ws["D1"] = "12%"
    print(ws["D1"].value)
    
    wb.save('sample.xlsx') #保存excel文件
    

    获取所有的行/列对象

    from openpyxl import Workbook
    from openpyxl import load_workbook
    
    wb = load_workbook('sample.xlsx') #创建excel文件对象
    ws = wb.active
    rows = []
    colunms = []
    
    #获取所有的行对象:
    for row in ws.iter_rows():  # for row in ws. rows:
        rows.append(row)
    
    print(rows)   #所有行
    print(rows[0]) #获取第一行
    print(rows[0][0]) #获取第一行第一列的单元格对象
    print(rows[0][0].value) #获取第一行第一列的单元格对象的值
    
    print(rows[len(rows)-1]) #获取最后行 print rows[-1]
    print(rows[len(rows)-1][len(rows[0])-1]) #获取第后一行和最后一列的单元格对象
    print(rows[len(rows)-1][len(rows[0])-1].value) #获取第后一行和最后一列的单元格对象的值
    
    #获取所有的列对象:
    for col in ws.iter_cols():  # for col in ws.columns:
        colunms.append(col)
    
    print(colunms)   #所有行
    print(colunms[0]) #获取第一行
    print(colunms[0][0]) #获取第一行第一列的单元格对象
    print(colunms[0][0].value) #获取第一行第一列的单元格对象的值
    
    print(colunms[len(colunms)-1]) #获取最后行 print rows[-1]
    print(colunms[len(colunms)-1][len(colunms[0])-1]) #获取第后一行和最后一列的单元格对象
    print(colunms[len(colunms)-1][len(colunms[0])-1].value) #获取第后一行和最后一列的单元格对象的值
    
    wb.save('sample.xlsx') #保存excel文件
    

    6、 操作已经存在的文件

    from openpyxl import Workbook
    from openpyxl import load_workbook
    
    wb = load_workbook('sample.xlsx')
    wb.guess_types = True   #猜测单元格格式类型
    ws=wb.active
    wb.save("sample.xlsx")
    

    #注意如果原文件有一些图片或者图标,保存的时候可能会导致图片丢失

    7、 单元格类型

    from openpyxl import Workbook
    from openpyxl import load_workbook
    import datetime
    
    wb = load_workbook('sample.xlsx') #创建excel文件对象
    ws = wb.active
    wb.guess_types = True
    
    #如果是常规,显示general,如果是数字,显示'0.00_ ',如果是百分数显示0%
    ws["A1"] = datetime.datetime.now()
    print(ws["A1"].number_format)  #单元格中数据类型为yyyy-mm-dd h:mm:ss
    print(ws["A1"].value)
    
    ws["A2"] = "12%"
    print(ws["A2"].number_format) #单元格中数据类型为百分数,显示为0%
    print(ws["A2"].value)
    
    ws["A3"] = 1.154
    print(ws["A3"].number_format)  #单元格中数据类型为常规,显示general。注:数字需要在Excel中设置数字类型,直接写入的数字是常规类型
    print(ws["A3"].value)
    
    ws["A4"] = "中国"
    print(ws["A4"].number_format) #单元格中数据类型为常规,显示general
    print(ws["A4"].value)
    
    wb.save('sample.xlsx') #保存excel文件
    

    8、 使用公式

    from openpyxl import Workbook
    from openpyxl import load_workbook
    import datetime
    
    wb = load_workbook('sample.xlsx') #创建excel文件对象
    ws1 = wb.active
    ws1["A1"] = 1
    ws1["A2"] = 2
    ws1["A3"] = 3
    
    ws1["A4"] = "SUM(1,1)"
    ws1["A5"] = "SUM(A1,A3)"
    
    print(ws1["A4"].value)  #打印的是公式内容,不是公式计算后的值,程序无法取到计算后的值
    print(ws1["A5"].value)  #打印的是公式内容,不是公式计算后的值,程序无法取到计算后的值
    
    wb.save('sample.xlsx') #保存excel文件
    

    9、 合并单元格

    from openpyxl import Workbook
    from openpyxl import load_workbook
    
    wb = load_workbook('sample.xlsx')
    ws1=wb.active
    
    ws.merge_cells('A2:D2')
    ws.unmerge_cells('A2:D2')  #合并后的单元格,脚本单独执行拆分操作会报错,需要重新执行合并操作再拆分
    
    # 或对应具体的行列,与上面两条结果相同
    ws.merge_cells(start_row=2,start_column=1,end_row=2,end_column=4)
    ws.unmerge_cells(start_row=2,start_column=1,end_row=2,end_column=4)
    
    wb.save("sample.xlsx")  #保存文件
    

    10、插入一个图片

    需要先安装Pilow,安全文件是:PIL-fork-1.1.7.win-amd64-py2.7.exe

    from openpyxl import load_workbook
    from openpyxl.drawing.image import Image
    
    wb = load_workbook('e:sample.xlsx')
    ws1=wb.active
    
    img = Image('1.png')
    ws1.add_image(img, 'A1')
    
    wb.save("sample.xlsx")
    

    11、 隐藏单元格

    from openpyxl import load_workbook
    
    wb = load_workbook('sample.xlsx')
    ws1=wb.active
    
    ws1.column_dimensions.group('A', 'D', hidden=True)   #隐藏a到d列范围内的列
    #注:ws1.row_dimensions 无group方法
    wb.save("sample.xlsx")
    

    12、 画一个柱状图

    from openpyxl import load_workbook
    from openpyxl import Workbook
    from openpyxl.chart import BarChart, Reference, Series
    
    wb = load_workbook('sample.xlsx')
    ws1=wb.active
    
    wb = Workbook()
    ws = wb.active
    for i in range(10):
        ws.append([i])
    
    values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10)  #获取表格中具体的数值
    chart = BarChart()  #创建柱状图
    chart.add_data(values)  #柱状图中添加数据
    ws.add_chart(chart, "E15")  #将柱状图添加到工作薄中,并从E15单元格中开始添加
    
    wb.save("sample.xlsx")
    

    13、 画一个饼图

    from openpyxl import load_workbook
    from openpyxl import Workbook
    from openpyxl.chart import (PieChart , ProjectedPieChart, Reference)
    from openpyxl.chart.series import DataPoint
    
    data = [['Pie', 'Sold'],['Apple', 50],['Cherry', 30],['Pumpkin', 10],['Chocolate', 40]]
    
    wb = Workbook()
    ws = wb.active
    
    for row in data:
        ws.append(row)
    
    pie = PieChart() #创建饼图
    labels = Reference(ws, min_col=1, min_row=2, max_row=5)  #饼图label取值单元格
    data = Reference(ws, min_col=2, min_row=1, max_row=5)   #饼图数据取值单元格
    pie.add_data(data, titles_from_data=True)
    pie.set_categories(labels)
    pie.title = "Pies sold by category"
    
    slice = DataPoint(idx=0, explosion=20)
    pie.series[0].data_points = [slice]
    
    ws.add_chart(pie, "D1")
    
    ws = wb.create_sheet(title="Projection") #创建另外的工作薄并画图
    
    data = [['Page', 'Views'],['Search', 95],['Products', 4],['Offers', 0.5],['Sales', 0.5]]
    
    for row in data:
        ws.append(row)
    
    projected_pie = ProjectedPieChart()
    projected_pie.type = "pie"
    projected_pie.splitType = "val" # 按取值拆分
    labels = Reference(ws, min_col=1, min_row=2, max_row=5)
    data = Reference(ws, min_col=2, min_row=1, max_row=5)
    projected_pie.add_data(data, titles_from_data=True)
    projected_pie.set_categories(labels)
    
    ws.add_chart(projected_pie, "A10")
    
    from copy import deepcopy
    projected_bar = deepcopy(projected_pie)
    projected_bar.type = "bar"
    projected_bar.splitType = 'pos' # 按位置拆分
    
    ws.add_chart(projected_bar, "A27")
    
    wb.save("sample.xlsx")
    

    14、 设定一个表格区域,并设定表格的格式

    from openpyxl import load_workbook
    from openpyxl import Workbook
    from openpyxl.worksheet.table import Table, TableStyleInfo
    
    wb = Workbook()
    ws = wb.active
    
    data = [['Apples', 10000, 5000, 8000, 6000],['Pears',   2000, 3000, 4000, 5000],['Bananas', 6000, 6000, 6500, 6000],['Oranges',  500,  300,  200,  700]]
    ws.append(["Fruit", "2011", "2012", "2013", "2014"]) #新增
    for row in data:#数据添加到表格中
        ws.append(row)
    
    tab = Table(displayName="Table1", ref="A1:E5")
    
    # 添加带有条带行和条带列的默认样式
    style = TableStyleInfo(name="TableStyleMedium9", showFirstColumn=True,
                           showLastColumn=True, showRowStripes=True, showColumnStripes=True)
    #第一列是否和样式第一行颜色一行,第二列是否···
    #是否隔行换色,是否隔列换色
    tab.tableStyleInfo = style
    ws.add_table(tab)
    
    wb.save("sample1.xlsx")
    

    15、给单元格设定字体颜色

    from openpyxl import Workbook
    from openpyxl.styles import colors
    from openpyxl.styles import Font
    
    wb = Workbook()
    ws = wb.active
    
    a1 = ws['A1']
    d4 = ws['D4']
    ft = Font(color=colors.RED)  # color="FFBB00",颜色编码也可以设定颜色
    a1.font = ft
    d4.font = ft
    
    #如果要更改字体的颜色,需要重新分配
    #italic 倾斜字体
    a1.font = Font(color=colors.RED, italic=True)   # 仅设置a1
    a1.value = "abc"
    
    wb.save("sample2.xlsx")
    

    16、设定字体和大小

    from openpyxl import Workbook
    from openpyxl.styles import colors
    
    wb = Workbook()
    ws = wb.active
    
    a1 = ws['A1']
    d4 = ws['D4']
    a1.value = "abc"
    
    from openpyxl.styles import Font
    from copy import copy
    
    ft1 = Font(name=u'宋体', size=14)
    ft2 = copy(ft1)   #复制字体对象
    ft2.name = "Tahoma"
    
    print(ft1.name)
    print(ft2.name)
    print(ft2.size)
    
    a1.font = ft1
    
    wb.save("sample3.xlsx")
    

    17、设定行和列的字体

    from openpyxl import Workbook
    from openpyxl.styles import Font
    wb = Workbook()
    ws = wb.active
    
    col = ws.column_dimensions['A']
    col.font = Font(bold=True)   #将A列设定为粗体
    row = ws.row_dimensions[1]
    row.font = Font(underline="single")  #将第一行设定为下划线格式
    
    wb.save("e:\sample.xlsx")
    

    18、设定单元格的边框、字体、颜色、大小和边框背景色

    from openpyxl import Workbook
    from openpyxl.styles import Font
    from openpyxl.styles import NamedStyle, Font, Border, Side,PatternFill
    
    wb = Workbook()
    ws = wb.active
    
    highlight = NamedStyle(name="highlight")
    highlight.font = Font(bold=True, size=20,color= "ff0100")
    highlight.fill = PatternFill("solid", fgColor="DDDDDD")#背景填充
    bd = Side(style='thick', color="000000")
    highlight.border = Border(left=bd, top=bd, right=bd, bottom=bd)
    
    print dir(ws["A1"])
    ws["A1"].style =highlight
    
    wb.save("sample.xlsx")
    
    19、常用的样式和属性设置

    from openpyxl import Workbook
    from openpyxl.styles import Font
    from openpyxl.styles import NamedStyle, Font, Border, Side,PatternFill
    from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font
    
    wb = Workbook()
    ws = wb.active
    
    #设置字体
    ft = Font(name='微软雅黑',
        size=11,
        bold=False,
        italic=False,
        vertAlign=None,
        underline='none',
        strike=False,
        color='FF000000')
    
    #设置填充
    fill = PatternFill(fill_type="solid",
        start_color='FFEEFFFF',
        end_color='FF001100')
    
    #边框可以选择的值为:'hair', 'medium', 'dashDot', 'dotted', 'mediumDashDot', 'dashed', 'mediumDashed', 'mediumDashDotDot', 'dashDotDot', 'slantDashDot', 'double', 'thick', 'thin']
    #diagonal 表示对角线
    bd = Border(left=Side(border_style="thin",color='FF001000'),
        right=Side(border_style="thin",color='FF110000'),
        top=Side(border_style="thin",color='FF110000'),
        bottom=Side(border_style="thin",color='FF110000'),
        diagonal=Side(border_style=None,color='FF000000'),
        diagonal_direction=0,
        outline=Side(border_style=None,color='FF000000'),
        vertical=Side(border_style=None,color='FF000000'),
        horizontal=Side(border_style=None,color='FF110000')
                    )
    #设置对齐方式
    alignment=Alignment(horizontal='general',
            vertical='bottom',
            text_rotation=0,
            wrap_text=False,
            shrink_to_fit=False,
            indent=0)
    number_format = 'General' #单元格数据类型
    
    protection = Protection(locked=True,hidden=False) #保护格式
    
    ws["B3"].font = ft
    ws["B3"].fill =fill
    ws["B3"].border = bd
    ws["B3"].alignment = alignment
    ws["B3"].number_format = number_format
    
    ws["B3"].value ="我在这里"
    
    wb.save("sample4.xlsx")
    
  • 相关阅读:
    2018-6-2_《JS操作数组(纯洁方法)》
    Centos7 xfs分区格式化挂载
    centos 常用命令集锦
    docker1.12在cento7里的组建swarm (一)
    centos7线程、文件打开数等调优日志(非优化案例、仅仅是个个人记录、为把相关配置文件记录一下)
    Centos7.2 新镜像、系统到手 更新清理 并且安装docker1.2以后版本 目前内容适合docker 1.7.x ce(社区版)
    程序员新手 0年份等级 指导(一) 开发人员IT架构总览
    docker 土法制作zookeeper镜像 并且搭建集群 基于centos7.2
    centos 删除多余的内核启动项
    docker1.12在cento7里的组件swarm (二)
  • 原文地址:https://www.cnblogs.com/pinpin/p/10471732.html
Copyright © 2011-2022 走看看